Pro*C的使用

來源:互聯網
上載者:User
一 Pro*C 程式概述:
1.什麼是Pro*C程式
在ORACLE資料庫管理和系統中, 有三種訪問資料庫的方法;
(1) 用SQL*Plus, 它有SQL命令以互動的應用程式訪問資料庫;
(2)用第四代語言應用開發工具開發的應用程式訪問資料庫,這些工具有SQL*Froms,QL*Reportwriter,SQL*Menu等;
(3) 利用在第三代語言內嵌入的SQL語言或ORACLE庫函數調用來訪問。
Pro*C就屬於第三種開發工具之一, 它把過程化語言C和非過程化語言SQL最完善地結合起來,
具有完備的過程處理能力,又能完成任何資料庫的處理品任務,使使用者可以通過編程完成各種類型的報表。在Pro*C程式中可以嵌入SQL語言,
利用這些SQL語言可以完成動態地建立、修改和刪除資料庫中的表,也可以查詢、插入、修改和刪除資料庫表中的行, 還可以實現事務的提交和復原。
在Pro*C程式中還可以嵌入PL/SQL塊, 以改進應用程式的效能, 特別是在網路環境下,可以減少網路傳輸和處理的總開銷。

2.Pro*C的程式結構圖
通俗來說,Pro*C程式實際是內嵌有SQL語句或PL/SQL塊的C程式, 因此它的組成很類似C程式。 但因為它內嵌有SQL語句或PL/SQL塊,
所以它還含有與之不同的成份。為了讓大家對Pro*C有個感性的認識, 特將二者差別比較如下:
C的全程變數說明
C來源程式 函數1:同函數K。
函數2:同函數K。



C的局部變數說明
函數K
可執行語句

應用程式首部 C的外部變數說明
外部說明段(ORACLE變數說明)
通訊區說明

Pro*C來源程式 函數1:同函數K。
函數2:同函數K。
C局部變數說明
程式體 內部說明部分 內部說明段
通訊區說明
函數K C的可執行語句
可執行語句 SQL的可執行語句

或PL/SQL塊

二.Pro*C程式的組成結構

每一個Pro*C程式都包括兩部分:(1)應用程式首部;(2)應用程式體
應用程式首部定義了ORACLE資料庫的有關變數,
為在C語言中操縱ORACLE資料庫做好了準備。應用程式體基本上由Pro*C的SQL語句調用組成。主要指查詢SELECT、INSERT、UPDATE、DELETE等語句。
應用程式的組成結構如圖所示:
應用程式首部
描述部分


SQL通訊區

應用程式體
EXEC SQL BEGIN DECLARE SECTION
(SQL變數的定義)
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLLA;
EXEC SQL CONNECT:< 使用者名稱>
IDENTIFIED BY: < 口令 >
SQL 陳述式及遊標的使用


1. 應用程式首部
應用程式的首部就是Pro*C的開始部分。它包括以下三部分:
l C變數描述部分;
l SQL變數描述部分(DECLARE部分);
l SQL通訊區。

(1) .DECLARE部分(描述部分)
描述部分說明程式的SQL變數, 定義部分以EXEC SQL BEGIN DECLARE SECTION ;開始和以 EXEC SQL END DECLARE
SECTION ;結束的。它可以出現在程式的主部,也可出現在局部
l SQL變數的說明和使用
在說明段能為SQL變數指定的資料類型如表所示:
資料類型描述
CHAR
CHAR(n)
INT
SHORT
LONG
FLOAT
DOUBLE
VARCHAR單字元
n個字元數組
整數
短整數
單精確度浮點數
雙精確度浮點數
變長字串

這些資料類型實際上就是C語言的資料類型, 其中VARCHAR中視為C資料類型的擴充。這在以後會談到。
SQL變數的使用應注意以下幾點:
l 必須在描述部分明確定義
l 必須使用與其定義相同的大小寫格式
l 在SQL語句中使用時,必須在其之前加一個“:”(冒號),但在C語句中引用時不需加冒號。
l 不能是SQL命令中的保留字。
l 可以帶指示變數。
例如:EXEC SQL BEGIN DECLARE SECTIONS;
VARCHAR programe[30];
Int porgsal, pempno;
EXEC SQL END DECLARE SECTION;


EXEC SQL SELECT ENAME , SAL
INTO: programe, : progsal
FROM EMP
WHERE EMPNO = : pempno;


(2). 指標變數的說明和引用
指示變數實際上也是一類SQL變數,它被用來管理與其相關聯的宿主變數(即在SQL語句中充
當輸入或輸出的變數)。每一個宿主變數都可定義一個指標變數,主要用於處理空值(NULL)
指標變數的說明基本同一般SQL變數一樣, 但必須定義成2位元組的整型,如SHORT、INT。在SQL語句中引用時,
其前也應加“:”(冒號),而且必須附在其相關聯的宿主變數之後,在C語句中,可獨立使用。當指標變數為-1時,表示空值。例如:
EXEC SQL BEGIN DECLARE SECTION ;
INT dept- number;
SHORT ind – num;
CHAR emp –name;
EXEC SQL END DECLARE SECTION ;



Scanf(“90d %s”, & dept- number , dept – name );
If (dept – number ==0)
Ind – num = -1;
Else
Ind – num = 0;
EXEC SQL INSERT INTO DEPT (DEPTNO, DNAME)
VALUES(:dept – number : ind- num , :dept – name);
其中ind – num是dept – number 的指標變數。當輸入的dept – number 值是0時, 則向DEPT 表的DEPTNO列插入空值。
(3).指標SQL變數的說明和使用
指標SQL變數在引用前也必須在DECLARE
部分先說明。其說明格式同C語言。在SQL語句中引用時,指標名字前要加首碼“:”(冒號)而不加“*”(星號)。在C語句中用法如同C語言的指標變數。
(4).數組SQL變更的說明和引用
在SQL語句中引用數組時,只需寫數組名(名字前加冒號), 不需寫下標,在C語句中用法如同C語言的陣列變數。
使用數組可大大降低網路傳輸開銷。如要向一表插入100行資料,如果沒有數組,就要重複100次, 而引用後,只須執行一次insert語句、便可一次性插入。例如:
EXEC SQL BEGIN DECLARE SECTION;
Int emp_number[100];
Char emp_name[100][15];
Float salary[100],commission[100];
Int dept_number;
EXEC SQL END DECLARE SECTION;
….
EXEC SQL SELECT EMPNO,ENAME,SAL,COMM
INTO :emp_number,:emp_name,:salary,:commission
FROM EMP
WHERE DEPTNO=:dept_number;
在使用數組時,應注意以下幾點;
l 不支援指標數組
l 只支援一維數組, 而 emp-name [100][15]視為一維字串
l 數組最大維數為32767
l 在一條SQL語句中引用多個數組時,這些數組維數應相同
l 在VALUES , SET, INTO 或WHERE子名中, 不允許把簡單SQL變數與數組SQL變數混用
l 不能在DELARE部分初始化數組
例如:下面的引用是非法的
EXEC SQL BEGIN DECLARE SECTION;
Int dept – num [3] = {10,20,30};
EXEC SQL END DECLARE SECTION ;

EXEC SQL SELECT EMPNO, ENAME , SAL
INTO : emp – num [ i ], : emp – name [ i ], : salarg [ i ]
FROM EMP
(5) 偽類型VARCHAR的說明和引用
VARCHAR變數在引用之前也必須在說明段說明, 說明時必須指出串的最大
長度,如:
EXEC SQL BEGIN DECLARE SECTION;
Int book – number;
VARCHAR book – name [ 50 ];
EXEC SQL END DECLARE SECTION ;
在預編繹時, book – name 被翻譯成C語言中的一個結構變數;
Struct { unsigned short len ;
Unsigned chart arr [ 20 ] ;
} boo – name
由此看出, VARCHAR變數實際上是含長度成員和數群組成員的結構變數。在SQL語句中引用時,應引用以冒號為首碼的結構名, 而不加下標,在C語句 中引用結構成員。
VARCHAR變數在作輸出變數時,由ORACLE自動化佈建, 在作為輸入變數時,程式應先把字串存入數群組成員中,
其長度存入長度成員中,然後再在SQL語句中引用。例如:
Main( )
{ .......
scanf(“90s, 90d’, book – name .arr, & book – number );
book – name .len = strlen (book – name .arr);
EXEC SQL UPDATE BOOK
SET BNAME = : book – name ;
BDESC = : book – number ;
}
(6) SQL通訊區
SQL 通訊區是用下列語句描述的:
EXEC SQL INCLUDE SQLCA;
此部分提供了使用者運行程式的成敗記錄和錯誤處理。

SQLCA的組成
SQLCA是一個結構類型的變數,它是ORACLE 和應用程式的一個介面。在執行 Pro*C程式時, ORACLE
把每一個嵌入SQL語句執行的狀態資訊存入SQLCA中, 根據這些資訊,可判斷SQL語句的執行是否成功,處理的行數,錯誤資訊等,其組成如表所示:
Struct sqlca
{ char sqlcaid [ 8 ] ; ----à標識通訊區
long sqlabc; ---à 通訊區的長度
long sqlcode; ---à保留最近執行的SQL語句的狀態代碼
struct { unsigned short sqlerrml; -----à資訊文本長度
}sqlerrm;
char sqlerrp [ 8 ];
long sqlerrd [ 6 ];
char sqlwarn [ 8 ];
char sqlext [ 8 ];
}
struct sqlca sqlca;
其中, sqlcode在程式中最常用到,它保留了最近執行的SQL語句的狀態代碼。程式員根據這些狀態代碼做出相應的處理。這些狀態代碼值如下:
0: 表示該SQL語句被正確執行,沒有發生錯誤和例外。
>0:ORACLE執行了該語句,但遇到一個例外(如沒找到任何資料)。
<0:表示由於資料庫、系統、網路或應用程式的錯誤,ORACLE未執行該SQL語句。
當出現此類錯誤時,當前事務一般應復原。

2.應用程式體
在Pro*C程式中, 能把SQL語句和C語句自由地混合書寫,並能在SQL語句中使用SQL變數,嵌入式SQL語句的書寫文法是:
l 以關鍵字EXEC SQL開始
l 以C語言的語句終結符(分號)終結
SQL語句的作用主要用於同資料庫打交道。C語言程式用於控制,輸入,輸出和資料處理等。
(1) 串連到ORACLE資料庫
在對資料庫存取之前,必須先把程式與ORACLE資料庫連接起來。即登入到ORACLE上。所串連命令應該是應用程式的第一個可執行命令。串連命令格式如下:
EXEC SQL CONNECT:< 使用者名稱 > IDENTIFIED BY : < 口令 >
或EXEC SQL CONNECT: < 使用者名稱 > / < 口令 >
在使用上述兩種格式進行登入時, 應當首先在說明段定義包含使用者名稱和口令的
SQL 變數,並在執行CONNECT之前設定它們,否則會造成登入失敗。例如:
EXEC SQL BEGIN DECLARE SECTION ;
VARCHAR usename [20];
VARCHAR password[20];
EXEC SQL END DECLARE
..........
strcpy ( usename.arr, “CSOTT’);
usename.len = strlen (username.arr);
strcpy (password.arr , “TIGER’);
password .len = strlen( password .arr);
EXEC SQL WHENEVER SQLERROR GOTO SQLERR;
EXEC SQL CONNECT :username INDNTIFIED BY : password;
注意: 不能把使用者名稱和口令直接編寫到CONNECT語句中,或者把用引號(’)括起來的字母串在CONNECT 語句中, 如下面的語句是無效的。
EXEC SQL CONNECT SCOTT INENTIFIED BY TIGER;
EXEC SQL CONNECT ‘SCOTT’ IDENTIFIED BY ‘TIGER’;
(2). 插入、更新和刪除
在講述SQL語言時已詳細講過, 這裡就不舉例說明了。
(3). 資料庫查詢及遊標的使用
在PRO*C中, 查詢可分為兩種類型:
l 返回單行或定行數的查詢;
l 返回多行的查詢.此種查詢要求使用遊標來控制每一行或每一組(主變數用數組).
1) 返回單行或定行數的查詢
在PRO*C中的查詢SQL SELECT語句由以下幾個子句組成:
SELECT
INTO
FROM
WHERE
CONNECT BY
UNION
INTERSECT
MINUS
GROUP BY
HAVING
ORDER BY
其中WHERE子句中的查詢條件可以是一個屬性或多個屬性的集合,在執行是賦值的主變數也可放在WHERE子句中.WHERE子句中所用的主變數稱為輸入主變數。如:
SELECT EMPNO, JOB, SAL
INTO:PNAME, :PJOB, :PSAL
FROM EMP
WHERE EMPNO=:PEMPNO;
若沒有找到限定的行, 則SQLCA.SQLCODE返回”+1403”, 表明”沒有找到”。
INTO從句中的主變數叫輸出主變數,它提供了查詢時所需要的資訊。
在任何項送給主變數之前,都要求ORACLE把這些項轉換成主變數的資料類型。對於數字是通過截斷來完成的(如:9.23轉換為9)。
如果已確定查詢只返回一行,那麼就不必使用遊標,只給SELECT語句增加一個INTO子句即可。在語義上INTO語句在FROM之前的查詢中有多少個選擇項就有多少個輸出主變數。若在SELECT項中運算式的數目不等於INTO子句中主變數的數目,就把SQLCA.SQLWARN[3]置為”W”。

2)多行查詢及遊標的使用
如果查詢返回多行或不知道返回多少行,使用帶有ORACLE遊標(CURSOR)的SELECT語句。
遊標是ORACLE和PRO*C存放查詢結果的工作區域。一個遊標(已命名的)與一條SELECT語句相關聯。操作遊標有由4條命令:(1)DECLARE
CURSOR;(2)OPEN CURSOR;(3)FETCH;(4)CLOSE CURSOR。

A. 定義遊標
一個遊標必須首先定義, 才能使用它。文法為:
EXEC SQL DECLARE 〈遊標名〉CORSOR FOR
SELECT 〈列〉
FROM 〈表〉
例如:
EXEC SQL DECLARE CSOR, CURSOR FOR
SELECT ENAME , JOB, SAL
FROM EMP
WHERE DEPTNO=:DEPTNO;
當賦給一個與查詢相關聯的遊標CURSOR之後, 當SELECT查詢EMP時可從資料庫中返回多行,這些行就是CURSOR的一個即時區域。
注意:
1) 定義遊標必須在對遊標操作之前完成;
2) PRO*C不能引用沒有定義的遊標;
3) 遊標定義後,其作用範圍是整個程式。所以對一個程式來講, 同時定義兩個相同的遊標是錯誤的。

B. 開啟遊標
開啟遊標的OPEN語句主要用來輸入主變數的內容,這些主要是WHERE中使用的主變數。開啟遊標的語句是:EXEC SQL OPEN 〈遊標名〉
當開啟遊標後,可以從相關的查詢中取出多於一行的結果。所有滿足查詢標準的行組成一集合,叫做“遊標活動集”。通過取操作,活動集中的每一行或每一組是一個一個返回的,查詢完成後,
遊標就可關閉了。如圖所示:
定義遊標:DECLARE

開始查詢:SELECT
開啟遊標:OPEN


從活動集取資料:FETCH

查詢完成


關閉遊標:CLOSE


注意:1)遊標處於活動集的第一行前面;
2)若改變了輸入主變數就必須重新開啟遊標。

C. 取資料
從活動集中取出一行或一組把結果送到輸出主變數中的過程叫取資料。輸出主變數的定義在取資料語句中。取資料的語句如下:
EXEC SQL FETCH〈遊標名〉INTO:主變數1,主變數2,……
FETCH的工作過程如圖所示:

查詢結果
遊標
FETCH
查詢結果
在遊標開啟後
輸出至當前

……


如圖所示的查詢結果指滿足查詢條件的查詢結果。使用FETCH應注意以下幾點:
l 遊標必須先定義再開啟。
l 只有在遊標開啟之後才能取資料,即執行FETCH語句。
l
FETCH語句每執行一次,從當前行或當前組取資料一次,下一行或下一組向上移一次。遊標每次所指的行或組都為當前行或當前組,而FETCH每次都是取遊標所指定的行或組的資料。
l 當遊標活動集空之後,ORCLE返回一個SQLCA。SQLCA(=1403)。
l 若希望此遊標再操作, 必須先關閉再開啟它。
l 在C程式中可以開闢一個記憶體空間,來存放操作結果,這樣就能利用開闢的空間來靈活操縱查詢的結果。

D.關閉遊標
取完活動集中所有行後,必須關閉遊標,以釋放與該遊標有關的資源。
關閉遊標的格式為:
EXEC SQL CLOSE 遊標名;
例如:
EXEC SQL CLOSE C1;
ORACLE V5.0版支援SQL格式“CURRENT OF CURSOR”。這條語句將指向一個遊標中最新取出的行,
以用於修改和刪除操作。該語句必須有取操作之後使用,它等同儲存一個ROWID,並使用它。

(4).舉例
EXEC SQL DECLARE SALESPEOPLE CURSOR FOR
SELECT SSNO, NAME, SALARY
FROM EMPLOYEE
WHERE DNAME=‘Sales’;
EXEC SQL OPEN SALESPEOPLE;
EXEC SQL FETCH SALESPEOPLE
INTO :SS,:NAME,:SAL;
EXEC SQL CLOSE SALESPEOPLE;

(5)SQL嵌套的方法及應用
嵌入SQL與互動式SQL在形式上有如下差別:
1) 在SQL語句前增加首碼“EXEC SQL”, 這一小小的差別其目的是在於先行編譯時容易識別出來,
以便把每一條SQL作為一條進階語言來處理。
2) 每一SQL語句分為說明性語句和可執行語句兩大類。可執行語句又分為資料定義、資料控制、資料操縱、資料檢索四大類。
可執行性SQL語句寫在進階語言的可執行處;說明性SQL語句寫在進階語言的說明性的地方。
例如:在PRO*C程式中建立一個名為BOOK的表結構,過程如下:
#include〈stdio.h〉
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR uid[20], pwd[20];
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLCA;
Main()
{
/*login database*/
strcpy(uid.arr,’wu’);
uid.len=strlen(uid,arr);
strcpy(pwd.arr,’wu’);
pwd.len=strlen(pwd.arr);
EXEC SQL CONNECT:uid IDENTIFEED BY:pwd;
EXEC SQL CREATE TABLE book
( acqnum number, copies number , price number);
EXEC SQL COMMIT WORK RELEASE;
EXIT;
PRO*C可非常簡便靈活地訪問ORCLE資料庫中的資料,同時又具有C語言高速的特點,因而可完成一些ORACLE產品不能完成的任務,例如以下一個固定的特殊格式輸出結果。
SQL嵌套來源程式樣本
#unclude
typedef char asciz[20];
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL TYPE asciz IS STRING (20) REFERENCE;
asciz username;
asciz password;
asciz emp_name(5);
int emp_number(5a);
float salary[5];
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca;
Void print_rows();
Void sqlerror();
Main()
{
int num_ret;
strcpy(username,”SCOTT’);
strcpy(password, “TYGER”);
EXEC SQL WHENEVER SQLERROR DO sqlerror();
EXEC SQL CONNECT:username IDENTIFIED BY:password;
Print (“\nConnected to ORACLE as user:%s\n”, username);
EXEC SQL DECLARE c1 CURSOR FOR
SELECT EMPNO , ENAME , SAL FROM EMP;
EXEC SQL OPEN c1;
Num_ret = 0;
For(;;)
{
EXEC SQL WHENEVER NOT FOUND DO break;
EXEC SQL FETCH c1 INTO : emp_number , :emp_name , :salary;
Print_rows (sqlca.sqlerrd[2] – num_ret);
Num_ret=sqlca.sqlerrd[2];
}
if ((sqlca.sqlerrd[2] – num_ret)>0);
print _rows(sqlca.sqlerrd[2] –num_ret);
EXEC SQL CLOSE c1;
Printf(“\Have a good day.\n”);
EXEC SQL COMMIT WORK RELEASE;
}

void print_rows(n);
int n;
{
int i;
printf(“\nNumber Employee Salary\n”);
printf(“------------------------------\n”);
for (i=0;i printf(“% - 9d%- 8s%9.2f\n”,emp-number[i], emp---name[i],salary[i];
}
void sqlerror()
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
Printf(“\noracle error detected:\n”);
Printf(‘\n%.70s\n”, sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
Exit(1);
}


(6) 錯誤偵測和恢複
在使用SQL語句和PRO*C對資料庫進行操作時,常常有欄位空值,無條件刪除,無行返回,資料溢出和截斷等現象發生,這種現象可以用SQLCA和指標變數來檢測。

1 SQLCA的結構
在PRO*C程式中SQLCA結構如下:
STRUCT SQLCA{
Char sqlcaid[8];
Long sqlabc;
Long sqlcode;
STRUCT{
Unsigned sqlerrm1;
Char sqlerrmc[10];
}sqlerrm;
Char sqlerrp[8];
Long sqlerrd[6];
Char sqlwarn[8];
Char sqlext[8];
}
其中:
1) SQLCA.sqlerrm.sqlerrmc:帶有SQLCA。SQLCODE的錯誤本文。
2) SQLCA.sqlerrd:當前ORACLE的狀態,只有SQLCA.SQLERRD[2]有意義,表示DML語句處理的行數。
3) SQLCA.sqlwarn:提供可能遇到的條件資訊。

在每執行一個SQL語句後,ORACLE就把返回結果放入SQLCA中,但說明語句除外。
用SQLCA可以查看SQL語句的執行結果。往往有三種結果:
=0:執行成功;
SQLCA.SQLCODE= >0:執行成功的狀態值;
<0:失敗,不允許繼續執行。

2 指標變數
指標變數有時也稱指示變數.指示變數與一個主變數相關聯,指出主變數的返回情況.
=0:傳回值不為空白, 未被截斷,值放在主變數中;
傳回值= >0:傳回值為空白, 忽略主變數的值;
<0:主變數長度不夠就被截斷。
使用指示變數要注意:
l 在WHERE子句中不能用指示變數。用NULL屬性來測試空值。
例如下列子句:
SELECT…
FROM…
WHERE ENAME IS NULL;
是正確的,而
WHERE ENAME=:PEME:PEME1
是錯誤的。
l 指示變數在插入空值之前為—1
l 可輸出空值。

3 WHENEVER語句
WHENEVER是說明語句,不返回SQLCODE, 只是根據SQLCA中的返回碼指定相關的措施。格式為
EXEC SQL WHENEVER [SQLERROR|SQLWARNING|NOTFORUND]
[STOP|CONTINUE|GOTO<標號>];
其中
(1)[STOP|CONTINUE|GOT<標號>]的預設值為CONTINUE。
(2)SQLERROR:SQLCA.SQLCODE<0;
(3)SQLWARNIGN:SQLCA.SQLWARN[0]=“W”;
(4)NOTFOUND:SQLCA.SQLCODE=1403;
下面給出一段程式來說明WHENEVER的用法:
EXEC SQL BEGIN DEELARE SECTION;
VARCHAR UID[20];
VARCHAR PASW[20];
……
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLCA;
Main()
{
……
EXEC SQL WHENEVER SQLERROR GOTO ERR;
EXEC SQL CONNECT:UID/:PWD;
……
EXEC SQL DECLARE CSOR1 CURSOR FOR
SELECT 〈欄位〉
FORM〈表〉
EXEC SQL OPEN CSOR1;
SQL
……
EXEC SQL WHENEVER NOT FOUND GOTO good;
For(;;)
EXEC SQL FETCH CSOR, INTO……
Good:
……
printf(“\n查詢結束\n”);
EXEC SQL CLOSE C1;
EXEC SQL WHENEVER SQLERROR CONTINUE.
EXEC SQL COMMIT WORK RELEASE:
Exit();
Printf(“\n%70s|n”, sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE:
Exit(1);
}

(7) 動態定義語句
SQL語句分動態定義語句和靜態定義語句兩種:
(1) 靜態定義語句:SQL語句事先編入PRO*C中,在經過先行編譯器編譯之後形成目標程式*。BOJ,然後執行目標程式預即可。
(2) 動態定義語句:有些語句不能事先嵌入到PRO*C程式中,要根據程式運行情況,使用者自己從輸入裝置上(如終端上)即時輸入即將執行的SQL語句。
動態定義語句有:
l EXECUTE IMMEDIATE;
l PREPARE 與EXECUTE;
l PREPARE與FETCH 和 OPEN ;
l BIND與DEFINE DESCRIPTOR。

1. EXECUTE IMMEDIATE語句
此語句表示立即執行, 並且只向SQLCA返回執行結果,無其它資訊。例如:
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR abcd[89];
VARCHAR deay[20];
EXEC SQL END DECLARE SECTION;
/** 輸出字串到abcd **/
EXEC SQL EXECUTE IMMEDIATE :abcd;
注意:
1) EXECUTE IMMEDIATE只能運行帶一個參數的動態語句。其中,abcd是參數,不是關鍵字。
2) EXECUTE IMMEDIATE使用的先決條件是:SQL語句不能包含主變數;SQL語句不能是查詢語句。
3) 可用任何主變數作為EXECUTE IMMEDIATE的參數;也可用字串作為主變數。

2. PREPARE與EXECUTE語句
此語句表示“先行編譯/執行”。此語句能夠先行編譯一次而執行多次。文法為:
EXEC SQL PREPARE 〈語句名〉FROM:主變數;
EXEC SQL EXECUTE〈語句名〉[USING:替換主變數];
PREPARE語句做兩件事:
(1) 先行編譯SQL語句;
(2) 給出SQL語句的語句名。
注意:
l SQL語句不能是查詢語句;
l PREPARE和EXECUTE可包含主變數;
l PREPARE不能多次執行。
例如:
#define USERNAME “SCOTT”
#define PASSWORD “TIGER”
#include
EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
Char * username=USERNAME;
Char * password=PASSWORD;
VARCHAR sqlstmt[80];
Int emp_number;
VARCHAR emp_name[15];
VARCHAR job[50];
EXEC SQL END DECLARE SECTION;
Main()
{
EXEC SQL WHENEVER SQLERROR GOTO :sqlerror;
EXEC SQL CONNECT :username IDENTIFIED BY :password;
Sqlstmt.len=sprintf(sqlstmt.arr,”INSERT INTO EMP (EMPNO,ENAME,JOB,SAL)
VALUES(:V1,:V2,:V3,:V4)”);
Puts(sqlstmt.arr);
EXEC SQL PREPARE S FROM :sqlstmt;
For(;;)
{
printf(“\nenter employee number:”);
scanf(“%d”,&emp_number);
if (emp_number==0) break;
printf(“\nenter employee name:”);
scanf(“%s”,&emp_name.arr);
emp_name.len=strlen(emp_name.arr);
printf(“\nenter employee job:”);
scanf(“%s”,job.arr);
job.len=strlen(job.arr);
printf(“\nenter employee salary:”);
scanf(“%f”,&salary);
}
EXEC SQL EXECUTE S USING :emp_number,:emp_name,:job,:salary;
}


3. FETCH語句和OPEN語句
FETCH語句和OPEN語句這組動態語句是對遊標進行操作的,其執行過程如下:


PREPARE〈語句名〉FROM 〈主變數字串〉;


DECLARE〈遊標名〉FOR〈語句名〉;



OPEN 〈遊標名〉[USING:替換變數1[,:替換變數變…]]


FETCH〈遊標名〉INTO: 主變數1[,:主變數2…]



CLOSE〈遊標名〉


注意:
l SQL語句允許使用查詢語句;
l SELECT子句中的列名不能動態改變,只能預置;
l WHERE和ORDER BY 子句可以動態改變條件。

一、 Pro*C的編譯和運行

1.
先用ORACLE先行編譯器PROC對PRO*C程式進行預先處理,該編譯器將來源程式中嵌入的SQL語言翻譯成C語言,產生一個C語言編譯器能直接編譯的檔案。組建檔案的副檔名為
.C
2. 用C語言編譯器CC 對副檔名為 .c的檔案編譯,產生目標碼檔案,其副檔名為 .o
3. 使用MAKE命令,串連目標碼檔案,產生可運行檔案
例如: 對上面的example.pc進行編譯運行
PROC iname=example.pc
CC example.c
MAKE EXE=example OBJS=”example.o”
example


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.