第08章 Pro C 的使用._第1頁
第08章 Pro C 的使用._第2頁
第08章 Pro C 的使用._第3頁
第08章 Pro C 的使用._第4頁
第08章 Pro C 的使用._第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、前言前言在Visual C+下開發(fā)Oracle庫接口主要有兩種方法。一種方法是利用Visual C+提供的多種數(shù)據(jù)庫訪問技術(shù),如開放數(shù)據(jù)庫連接ODBC、數(shù)據(jù)存取對象DAO、對象連接和嵌入數(shù)據(jù)庫OLE DB和ActiveX數(shù)據(jù)對象ADO等。另一種方法是在Visual C+中嵌入SQL語句,這就是所指的Pro*C/C+。前一種方法由于有MFC強(qiáng)大的類庫支持,熟悉VC編程時(shí)則實(shí)現(xiàn)方便,且可移植性強(qiáng);但是,與PROC 相比,應(yīng)用程序需要經(jīng)過兩層才能和數(shù)據(jù)庫通信接口建立聯(lián)系,編程相對復(fù)雜,執(zhí)行效率相對較低。PROC支持嵌入式PL/SQL 塊等直接調(diào)用Oracle 庫,將過程化語言和非過程化語言相結(jié)合,形

2、成一種更強(qiáng)的開發(fā)工具,可開發(fā)出滿足各種復(fù)雜要求的優(yōu)化應(yīng)用程序,執(zhí)行效率高。適合熟悉Oracle技術(shù)的人員應(yīng)用。但是用PROC 開發(fā)出的應(yīng)用程序無法向異構(gòu)數(shù)據(jù)庫平臺移植。一一 Pro Pro* *C C 程序概述程序概述1什么是Pro*C程序2Pro*C的程序結(jié)構(gòu)圖1 1什么是什么是ProPro* *C C程序程序在ORACLE數(shù)據(jù)庫管理和系統(tǒng)中, 有三種訪問數(shù)據(jù)庫的方法;用SQL*Plus, 它有SQL命令以交互的應(yīng)用程序訪問數(shù)據(jù)庫;用第四代語言應(yīng)用開發(fā)工具開發(fā)的應(yīng)用程序訪問數(shù)據(jù)庫,這些工具有SQL*Froms,QL*Reportwriter,SQL*Menu等;利用在第三代語言內(nèi)嵌入的SQL

3、語言或ORACLE庫函數(shù)調(diào)用來訪問。Pro*C就屬于第三種開發(fā)工具之一, 它把過程化語言C和非過程化語言SQL最完善地結(jié)合起來, 具有完備的過程處理能力,又能完成任何數(shù)據(jù)庫的處理品任務(wù),使用戶可以通過編程完成各種類型的報(bào)表。在Pro*C程序中可以嵌入SQL語言, 利用這些SQL語言可以完成動態(tài)地建立、修改和刪除數(shù)據(jù)庫中的表,也可以查詢、插入、修改和刪除數(shù)據(jù)庫表中的行, 還可以實(shí)現(xiàn)事務(wù)的提交和回滾。在Pro*C程序中還可以嵌入PL/SQL塊, 以改進(jìn)應(yīng)用程序的性能, 特別是在網(wǎng)絡(luò)環(huán)境下,可以減少網(wǎng)絡(luò)傳輸和處理的總開銷。2 2ProPro* *C C的程序結(jié)構(gòu)圖的程序結(jié)構(gòu)圖通俗來說,Pro*C程序

4、實(shí)際是內(nèi)嵌有SQL語句或PL/SQL塊的C程序, 因此它的組成很類似C程序。 但因?yàn)樗鼉?nèi)嵌有SQL語句或PL/SQL塊, 所以它還含有與之不同的成份。為了讓大家對Pro*C有個(gè)感性的認(rèn)識, 特將二者差別比較如下:C源程序C的全程變量說明函數(shù)1:同函數(shù)K函數(shù)2:同函數(shù)KC的局部變量說明函數(shù)K可執(zhí)行語句Pro*C源程序 應(yīng)用程序首部 C的外部變量說明外部說明段(ORACLE變量說明)通訊區(qū)說明函數(shù)1:同函數(shù)K。函數(shù)2:同函數(shù)K。C局部變量說明程序體內(nèi)部說明部分內(nèi)部說明段通訊區(qū)說明函數(shù)KC的可執(zhí)行語句可執(zhí)行語句 SQL的可執(zhí)行語句或PL/SQL塊二二ProPro* *C C程序的組成結(jié)構(gòu)程序的組成結(jié)

5、構(gòu) 每一個(gè)Pro*C程序都包括兩部分:(1)應(yīng)用程序首部;(2)應(yīng)用程序體應(yīng)用程序首部定義了ORACLE數(shù)據(jù)庫的有關(guān)變量, 為在C語言中操縱ORACLE數(shù)據(jù)庫做好了準(zhǔn)備。應(yīng)用程序體基本上由Pro*C的SQL語句調(diào)用組成。主要指查詢SELECT、INSERT、UPDATE、DELETE等語句。應(yīng)用程序的組成結(jié)構(gòu)如下圖:SQL通信區(qū)SQL通信區(qū)SQL通信區(qū)SQL通信區(qū)EXEC SQL BEGIN DECLARE SECTION(SQL變量的定義)EXEC SQL END DECLARE SECTION;EXEC SQL INCLUDE SQLLA;EXEC SQL CONNECT: IDENTIF

6、IED BY: SQL 語句及游標(biāo)的使用應(yīng)用程序體描述部分應(yīng)用程序首部SQL通信區(qū)1 1 應(yīng)用程序首部應(yīng)用程序首部應(yīng)用程序的首部就是Pro*C的開始部分。它包括以下三部分:1.C變量描述部分;2.SQL變量描述部分(DECLARE部分);3.SQL通信區(qū)。 (1) .DECLARE(1) .DECLARE部分(描述部分)部分(描述部分)描述部分說明程序的SQL變量,定義部分以EXEC SQL BEGIN DECLARE SECTION ;開始和以 EXEC SQL END DECLARE SECTION ;結(jié)束的。它可以出現(xiàn)在程序的主部,也可出現(xiàn)在局部SQL變量的說明和使用在說明段能為SQL變

7、量指定的數(shù)據(jù)類型如表所示:這些數(shù)據(jù)類型實(shí)際上就是C語言的數(shù)據(jù)類型, 其中VARCHAR中視為C數(shù)據(jù)類型的擴(kuò)充。這在以后會談到。數(shù)據(jù)類型數(shù)據(jù)類型描述描述CHARCHAR(n)INT SHORT LONG FLOAT DOUBLE VARCHAR單字符n個(gè)字符數(shù)組整數(shù)短整數(shù)長整數(shù)單精度浮點(diǎn)數(shù)雙精度浮點(diǎn)數(shù)變長字符串SQL變量的使用應(yīng)注意以下幾點(diǎn):必須在描述部分明確定義必須使用與其定義相同的大小寫格式在SQL語句中使用時(shí),必須在其之前加一個(gè)“:”(冒號),但在C語句中引用時(shí)不需加冒號。不能是SQL命令中的保留字??梢詭е甘咀兞?。例如:EXEC SQL BEGIN DECLARE SECTIONS;EX

8、EC SQL BEGIN DECLARE SECTIONS; VARCHAR VARCHAR programeprograme30;30; IntInt porgsalporgsal, , pempnopempno; ;EXEC SQL END DECLARE SECTION;EXEC SQL END DECLARE SECTION; EXEC SQL SELECT ENAME , SAL EXEC SQL SELECT ENAME , SAL INTO: INTO: programeprograme, : , : progsalprogsal FROM EMP FROM EMP WHERE

9、EMPNO = : WHERE EMPNO = : pempnopempno; ;(2). (2). 指示器變量的說明和引用指示器變量的說明和引用指示變量實(shí)際上也是一類SQL變量,它被用來管理與其相關(guān)聯(lián)的宿主變量(即在SQL語句中充 當(dāng)輸入或輸出的變量)。每一個(gè)宿主變量都可定義一個(gè)指示器變量,主要用于處理空值(NULL)指示器變量的說明基本同一般SQL變量一樣, 但必須定義成2字節(jié)的整型,如SHORT、INT。在SQL語句中引用時(shí), 其前也應(yīng)加“:”(冒號),而且必須附在其相關(guān)聯(lián)的宿主變量之后,在C語句中,可獨(dú)立使用。當(dāng)指示器變量為-1時(shí),表示空值。例如:EXEC SQL BEGIN DECL

10、ARE SECTION ; EXEC SQL BEGIN DECLARE SECTION ; INT dept- number; INT dept- number; SHORT SHORT indind num; num; CHAR CHAR empemp name; name;EXEC SQL END DECLARE SECTION ; EXEC SQL END DECLARE SECTION ; ScanfScanf(“90d %s”, & dept- number , dept name );(“90d %s”, & dept- number , dept name );

11、 If (dept number =0) If (dept number =0) IndInd num = -1; num = -1; Else Else IndInd num = 0; num = 0;EXEC SQL INSERT INTO DEPT (DEPTNO, DNAME)EXEC SQL INSERT INTO DEPT (DEPTNO, DNAME)VALUES(:dept number : VALUES(:dept number : indind- num , :dept name);- num , :dept name);( (3 3) ). .指針指針SQLSQL變量的說

12、明和使用變量的說明和使用指針SQL變量在引用前也必須在DECLARE 部分先說明。其說明格式同C語言。在SQL語句中引用時(shí),指針名字前要加前綴“:”(冒號)而不加“*”(星號)。在C語句中用法如同C語言的指針變量。( (4 4) ). .數(shù)組數(shù)組SQLSQL變更的說明和引用變更的說明和引用在SQL語句中引用數(shù)組時(shí),只需寫數(shù)組名(名字前加冒號), 不需寫下標(biāo),在C語句中用法如同C語言的數(shù)組變量。使用數(shù)組可大大降低網(wǎng)絡(luò)傳輸開銷。如要向一表插入100行數(shù)據(jù),如果沒有數(shù)組,就要重復(fù)100次, 而引用后,只須執(zhí)行一次insert語句、便可一次性插入。例如:EXEC SQL BEGIN DECLARE S

13、ECTION;EXEC SQL BEGIN DECLARE SECTION; IntInt emp_numberemp_number100;100; Char Char emp_nameemp_name10015;10015; Float salary100,commission100; Float salary100,commission100; IntInt dept_numberdept_number; ;EXEC SQL END DECLARE SECTION;EXEC SQL END DECLARE SECTION; EXEC SQL SELECT EMPNO,ENAME,SAL,C

14、OMMEXEC SQL SELECT EMPNO,ENAME,SAL,COMM INTO : INTO :emp_number,:emp_name,:salary,:commissionemp_number,:emp_name,:salary,:commission FROM EMP FROM EMP WHERE DEPTNO=: WHERE DEPTNO=:dept_numberdept_number; ; 在使用數(shù)組時(shí),應(yīng)注意以下幾點(diǎn);不支持指針數(shù)組只支持一維數(shù)組, 而 emp-name 10015視為一維字符串?dāng)?shù)組最大維數(shù)為32767在一條SQL語句中引用多個(gè)數(shù)組時(shí),這些數(shù)組維數(shù)應(yīng)相同在

15、VALUES , SET, INTO 或WHERE子名中, 不允許把簡單SQL變量與數(shù)組SQL變量混用不能在DELARE部分初始化數(shù)組例如:下面的引用是非法的 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) (5) 偽類型偽類型VARCHARVARCHAR的說明和引用的說明和引用V

16、ARCHAR變量在引用之前也必須在說明段說明, 說明時(shí)必須指出串的最大長度,如: EXEC SQL BEGIN DECLARE SECTION; Int book number; VARCHAR book name 50 ; EXEC SQL END DECLARE SECTION ; 在預(yù)編繹時(shí), book name 被翻譯成C語言中的一個(gè)結(jié)構(gòu)變量; Struct unsigned short len ; Unsigned chart arr 20 ; boo name 由此看出, VARCHAR變量實(shí)際上是含長度成員和數(shù)組成員的結(jié)構(gòu)變量。在SQL語句中引用時(shí),應(yīng)引用以冒號為前綴的結(jié)構(gòu)名,

17、而不加下標(biāo),在C語句 中引用結(jié)構(gòu)成員。VARCHAR變量在作輸出變量時(shí),由ORACLE自動設(shè)置, 在作為輸入變量時(shí),程序應(yīng)先把字符串存入數(shù)組成員中, 其長度存入長度成員中,然后再在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 6)SQLSQL通信區(qū)通信區(qū) SQL

18、 通信區(qū)是用下列語句描述的: EXEC SQL INCLUDE SQLCA; 此部分提供了用戶運(yùn)行程序的成敗記錄和錯(cuò)誤處理。 SQLCA SQLCA的組成的組成SQLCA是一個(gè)結(jié)構(gòu)類型的變量,它是ORACLE 和應(yīng)用程序的一個(gè)接口。在執(zhí)行 Pro*C程序時(shí), ORACLE 把每一個(gè)嵌入SQL語句執(zhí)行的狀態(tài)信息存入SQLCA中, 根據(jù)這些信息,可判斷SQL語句的執(zhí)行是否成功,處理的行數(shù),錯(cuò)誤信息等,其組成如表所示: Struct sqlca char sqlcaid 8 ; -標(biāo)識通訊區(qū) long sqlabc; - 通訊區(qū)的長度 long sqlcode; -保留最近執(zhí)行的SQL語句的狀態(tài)碼

19、struct unsigned short sqlerrml; -信息文本長度 sqlerrm; char sqlerrp 8 ; long sqlerrd 6 ; char sqlwarn 8 ; char sqlext 8 ; struct sqlca sqlca;其中, sqlcode在程序中最常用到,它保留了最近執(zhí)行的SQL語句的狀態(tài)碼。程序員根據(jù)這些狀態(tài)碼做出相應(yīng)的處理。這些狀態(tài)碼值如下: 0: 表示該SQL語句被正確執(zhí)行,沒有發(fā)生錯(cuò)誤和例外。 0:ORACLE執(zhí)行了該語句,但遇到一個(gè)例外(如沒找到任何數(shù)據(jù))。 0:表示由于數(shù)據(jù)庫、系統(tǒng)、網(wǎng)絡(luò)或應(yīng)用程序的錯(cuò)誤,ORACLE未執(zhí)行該SQ

20、L語句。 當(dāng)出現(xiàn)此類錯(cuò)誤時(shí),當(dāng)前事務(wù)一般應(yīng)回滾。 2 2應(yīng)用程序體應(yīng)用程序體在Pro*C程序中, 能把SQL語句和C語句自由地混合書寫,并能在SQL語句中使用SQL變量,嵌入式SQL語句的書寫文法是:以關(guān)鍵字EXEC SQL開始以C語言的語句終結(jié)符(分號)終結(jié)SQL語句的作用主要用于同數(shù)據(jù)庫打交道。C語言程序用于控制,輸入,輸出和數(shù)據(jù)處理等。(1).(1).連接到連接到ORACLEORACLE數(shù)據(jù)庫數(shù)據(jù)庫在對數(shù)據(jù)庫存取之前,必須先把程序與ORACLE數(shù)據(jù)庫連接起來。即登錄到ORACLE上。所連接命令應(yīng)該是應(yīng)用程序的第一個(gè)可執(zhí)行命令。連接命令格式如下: EXEC SQL CONNECT: IDE

21、NTIFIED BY : 或EXEC SQL CONNECT: / 在使用上述兩種格式進(jìn)行登入時(shí), 應(yīng)當(dāng)首先在說明段定義包含用戶名和口令的SQL 變量,并在執(zhí)行CONNECT之前設(shè)置它們,否則會造成登錄失敗。例如:EXEC SQL BEGIN DECLARE SECTION EXEC SQL BEGIN DECLARE SECTION ; VARCHAR VARCHAR usenameusename 20; 20; VARCHAR password20; VARCHAR password20;EXEC SQL END DECLARE EXEC SQL END DECLARE . . strcp

22、ystrcpy ( usename.arr, “CSOTT); ( usename.arr, “CSOTT); usename.len = usename.len = strlenstrlen (username.arr); (username.arr); strcpystrcpy (password.arr , “TIGER); (password.arr , “TIGER); password . password .lenlen = = strlenstrlen( password .( password .arrarr); ); EXEC SQL WHENEVER SQLERROR G

23、OTO SQLERR; EXEC SQL WHENEVER SQLERROR GOTO SQLERR; EXEC SQL CONNECT :username INDNTIFIED BY : password; EXEC SQL CONNECT :username INDNTIFIED BY : password;注意注意: : 不能把用戶名和口令直接編寫到不能把用戶名和口令直接編寫到CONNECTCONNECT語句中,或者把用引號語句中,或者把用引號()括起來的字母串在)括起來的字母串在CONNECT CONNECT 語句中,語句中, 如下面的語句是無效的。如下面的語句是無效的。 EXEC S

24、QL CONNECT SCOTT INENTIFIED BY TIGER; EXEC SQL CONNECT SCOTT INENTIFIED BY TIGER; EXEC SQL CONNECT SCOTT IDENTIFIED BY TIGER; EXEC SQL CONNECT SCOTT IDENTIFIED BY TIGER;(2). (2). 插入、更新和刪除插入、更新和刪除 在講述SQL語言時(shí)已詳細(xì)講過, 這里就不舉例說明了。(3). (3). 數(shù)據(jù)庫查詢及游標(biāo)的使用數(shù)據(jù)庫查詢及游標(biāo)的使用在PRO*C中, 查詢可分為兩種類型:返回行的查詢.此種單行或定行數(shù)的查詢;返回多查詢要求使

25、用游標(biāo)來控制每一行或每一組(主變量用數(shù)組).返回單行或定行數(shù)的查詢在PRO*C中的查詢SQL SELECT語句由以下幾個(gè)子句組成: SELECT INTO FROM WHERE CONNECT BY UNION INTERSECT MINUS GROUP BY HAVING ORDER BY 其中WHERE子句中的查詢條件可以是一個(gè)屬性或多個(gè)屬性的集合,在執(zhí)行是賦值的主變量也可放在WHERE子句中.WHERE子句中所用的主變量稱為輸入主變量。如: SELECT EMPNO, JOB, SAL INTO:PNAME, :PJOB, :PSAL FROM EMP WHERE EMPNO=:PEMP

26、NO;若沒有找到限定的行, 則SQLCA.SQLCODE返回”+1403”, 表明”沒有找到”。INTO從句中的主變量叫輸出主變量,它提供了查詢時(shí)所需要的信息。在任何項(xiàng)送給主變量之前,都要求ORACLE把這些項(xiàng)轉(zhuǎn)換成主變量的數(shù)據(jù)類型。對于數(shù)字是通過截?cái)鄟硗瓿傻模ㄈ纾?.23轉(zhuǎn)換為9)。如果已確定查詢只返回一行,那么就不必使用游標(biāo),只給SELECT語句增加一個(gè)INTO子句即可。在語義上INTO語句在FROM之前的查詢中有多少個(gè)選擇項(xiàng)就有多少個(gè)輸出主變量。若在SELECT項(xiàng)中表達(dá)式的數(shù)目不等于INTO子句中主變量的數(shù)目,就把SQLCA.SQLWARN3置為”W”。多行查詢及游標(biāo)的使用如果查詢返回多

27、行或不知道返回多少行,使用帶有ORACLE游標(biāo)(CURSOR)的SELECT語句。游標(biāo)是ORACLE和PRO*C存放查詢結(jié)果的工作區(qū)域。一個(gè)游標(biāo)(已命名的)與一條SELECT語句相關(guān)聯(lián)。操作游標(biāo)有由4條命令:(1)DECLARE CURSOR;(2)OPEN CURSOR;(3)FETCH;(4)CLOSE CURSOR。A. A. 定義游標(biāo)定義游標(biāo)一個(gè)游標(biāo)必須首先定義, 才能使用它。語法為:EXEC SQL DECLARE 游標(biāo)名CORSOR FOR SELECT 列 FROM 表例如:EXEC SQL DECLARE CSOR, CURSOR FOR SELECT ENAME , JOB,

28、 SAL FROM EMPWHERE DEPTNO=:DEPTNO;當(dāng)賦給一個(gè)與查詢相關(guān)聯(lián)的游標(biāo)CURSOR之后, 當(dāng)SELECT查詢EMP時(shí)可從數(shù)據(jù)庫中返回多行,這些行就是CURSOR的一個(gè)活動區(qū)域。注意:1.定義游標(biāo)必須在對游標(biāo)操作之前完成;2.PRO*C不能引用沒有定義的游標(biāo);3.游標(biāo)定義后,其作用范圍是整個(gè)程序。所以對一個(gè)程序來講, 同時(shí)定義兩個(gè)相同的游標(biāo)是錯(cuò)誤的。B. B. 打開游標(biāo)打開游標(biāo)打開游標(biāo)的OPEN語句主要用來輸入主變量的內(nèi)容,這些主要是WHERE中使用的主變量。打開游標(biāo)的語句是:EXEC SQL OPEN 游標(biāo)名游標(biāo)名當(dāng)打開游標(biāo)后,可以從相關(guān)的查詢中取出多于一行的結(jié)果。所

29、有滿足查詢標(biāo)準(zhǔn)的行組成一集合,叫做“游標(biāo)活動集”。通過取操作,活動集中的每一行或每一組是一個(gè)一個(gè)返回的,查詢完成后, 游標(biāo)就可關(guān)閉了。如圖所示:注意:1)游標(biāo)處于活動集的第一行前面;2)若改變了輸入主變量就必須重新打開游標(biāo)。定義游標(biāo)DECLARE開始查詢SELECT打開游標(biāo)OPEN從活動集取數(shù)據(jù)FETCH查詢完成關(guān)閉游標(biāo)CLOSEC. C. 取數(shù)據(jù)取數(shù)據(jù)從活動集中取出一行或一組把結(jié)果送到輸出主變量中的過程叫取數(shù)據(jù)。輸出主變量的定義在取數(shù)據(jù)語句中。取數(shù)據(jù)的語句如下:EXEC SQL FETCH游標(biāo)名INTO:主變量1,主變量2,F(xiàn)ETCH的工作過程如圖所示:查詢結(jié)果查詢結(jié)果查詢結(jié)果查詢結(jié)果FET

30、CH在游標(biāo)打開后輸出至當(dāng)前游標(biāo)使用FETCH應(yīng)注意以下幾點(diǎn):游標(biāo)必須先定義再打開。只有在游標(biāo)打開之后才能取數(shù)據(jù),即執(zhí)行FETCH語句。FETCH語句每執(zhí)行一次,從當(dāng)前行或當(dāng)前組取數(shù)據(jù)一次,下一行或下一組向上移一次。游標(biāo)每次所指的行或組都為當(dāng)前行或當(dāng)前組,而FETCH每次都是取游標(biāo)所指定的行或組的數(shù)據(jù)。當(dāng)游標(biāo)活動集空之后,ORCLE返回一個(gè)SQLCA。SQLCA(=1403)。若希望此游標(biāo)再操作, 必須先關(guān)閉再打開它。在C程序中可以開辟一個(gè)內(nèi)存空間,來存放操作結(jié)果,這樣就能利用開辟的空間來靈活操縱查詢的結(jié)果。D D關(guān)閉游標(biāo)關(guān)閉游標(biāo)取完活動集中所有行后,必須關(guān)閉游標(biāo),以釋放與該游標(biāo)有關(guān)的資源。關(guān)閉

31、游標(biāo)的格式為:EXEC SQL CLOSE 游標(biāo)名;例如:EXEC SQL CLOSE C1;(4)(4)舉例舉例EXEC SQL DECLARE SALESPEOPLE CURSOR FOR SELECT SSNO, NAME, SALARYFROM EMPLOYEEWHERE DNAME=Sales;EXEC SQL OPEN SALESPEOPLE;EXEC SQL FETCH SALESPEOPLEINTO :SS,:NAME,:SAL;EXEC SQL CLOSE SALESPEOPLE; ( (5 5) ) SQLSQL嵌套的方法及應(yīng)用嵌套的方法及應(yīng)用嵌入SQL與交互式SQL在形式

32、上有如下差別:在SQL語句前增加前綴“EXEC SQL”, 這一小小的差別其目的是在于預(yù)編譯時(shí)容易識別出來, 以便把每一條SQL作為一條高級語言來處理。每一SQL語句分為說明性語句和可執(zhí)行語句兩大類??蓤?zhí)行語句又分為數(shù)據(jù)定義、數(shù)據(jù)控制、數(shù)據(jù)操縱、數(shù)據(jù)檢索四大類。可執(zhí)行性SQL語句寫在高級語言的可執(zhí)行處;說明性SQL語句寫在高級語言的說明性的地方。 例如:在PRO*C程序中建立一個(gè)名為BOOK的表結(jié)構(gòu),過程如下:#includestdio.hEXEC SQL BEGIN DECLARE SECTION;VARCHAR uid20, pwd20;EXEC SQL END DECLARE SECTI

33、ON;EXEC SQL INCLUDE SQLCA;void 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

34、*C可非常簡便靈活地訪問ORCLE數(shù)據(jù)庫中的數(shù)據(jù),同時(shí)又具有C語言高速的特點(diǎn),因而可完成一些ORACLE產(chǎn)品不能完成的任務(wù),例如以下一個(gè)固定的特殊格式輸出結(jié)果。SQL嵌套源程序示例#include #include #include typedef char asciz20;EXEC SQL BEGIN DECLARE SECTION;EXEC SQL TYPE asciz IS STRING (20) REFERENCE;asciz username;asciz password;asciz emp_name5;int emp_number5;float salary5;EXEC SQL E

35、ND DECLARE SECTION;EXEC SQL INCLUDE sqlca;void print_rows();void sqlerror();main() int num_ret; strcpy(username,SCOTT); strcpy(password, TIGER); EXEC SQL WHENEVER SQLERROR DO sqlerror(); EXEC SQL CONNECT:username IDENTIFIED BY:password; printf (nConnected to ORACLE as user:%sn, username); EXEC SQL D

36、ECLARE 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.sqlerrd2 - num_ret); num_ret=sqlca.sqlerrd2; if (sqlca.sqlerrd2 - num_ret)0) print_rows(sqlca

37、.sqlerrd2 - num_ret); EXEC SQL CLOSE c1; printf(nHave a good day.n); EXEC SQL COMMIT WORK RELEASE;void print_rows(int n) int i; printf(nNumber Employee Salaryn); printf(-n); for (i=0;i0:執(zhí)行成功的狀態(tài)值; 0:返回值為空, 忽略主變量的值; 0:主變量長度不夠就被截?cái)唷? WHENEVER語句WHENEVER是說明語句,不返回SQLCODE, 只是根據(jù)SQLCA中的返回碼指定相關(guān)的措施。格式為EXEC SQL

38、WHENEVER SQLERROR|SQLWARNING|NOTFORUND STOP|CONTINUE|GOTO;其中(1)STOP|CONTINUE|GOT的缺省值為CONTINUE。(2)SQLERROR:SQLCA.SQLCODE0;(3)SQLWARNIGN:SQLCA.SQLWARN0=“W”;(4)NOTFOUND:SQLCA.SQLCODE=1403;下面給出一段程序來說明WHENEVER的用法: EXEC SQL BEGIN DEELARE SECTION;VARCHAR UID20;VARCHAR PASW20;EXEC SQL END DECLARE SECTION;EX

39、EC SQL INCLUDE SQLCA;main() EXEC SQL WHENEVER SQLERROR GOTO ERR; EXEC SQL CONNECT :ID/: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查詢結(jié)束n); EXEC SQL CLOSE C1; EXEC SQL WHENEVER

40、SQLERROR CONTINUE; EXEC SQL COMMIT WORK RELEASE; exit(); Printf(n%70s/n, sqlca.sqlerrm.sqlerrmc); EXEC SQL ROLLBACK WORK RELEASE: exit(1);(7) (7) 動態(tài)定義語句動態(tài)定義語句SQL語句分動態(tài)定義語句和靜態(tài)定義語句兩種:靜態(tài)定義語句:SQL語句事先編入PRO*C中,在經(jīng)過預(yù)編譯器編譯之后形成目標(biāo)程序*。BOJ,然后執(zhí)行目標(biāo)程序預(yù)即可。動態(tài)定義語句:有些語句不能事先嵌入到PRO*C程序中,要根據(jù)程序運(yùn)行情況,用戶自己從輸入設(shè)備上(如終端上)實(shí)時(shí)輸入即將執(zhí)行的

41、SQL語句。動態(tài)定義語句有:EXECUTE IMMEDIATE;PREPARE 與EXECUTE;PREPARE與FETCH 和 OPEN ;BIND與DEFINE DESCRIPTOR。EXECUTE IMMEDIATE語句此語句表示立即執(zhí)行, 并且只向SQLCA返回執(zhí)行結(jié)果,無其它信息。例如:EXEC SQL BEGIN DECLARE SECTION;VARCHAR abcd89;VARCHAR deay20;EXEC SQL END DECLARE SECTION;/* 輸出字符串到abcd */EXEC SQL EXECUTE IMMEDIATE :abcd;注意:1.EXECUTE

42、 IMMEDIATE只能運(yùn)行帶一個(gè)參數(shù)的動態(tài)語句。其中,abcd是參數(shù),不是關(guān)鍵字。2.EXECUTE IMMEDIATE使用的先決條件是:SQL語句不能包含主變量;SQL語句不能是查詢語句。3.可用任何主變量作為EXECUTE IMMEDIATE的參數(shù);也可用字符串作為主變量。PREPARE與EXECUTE語句此語句表示“預(yù)編譯/執(zhí)行”。此語句能夠預(yù)編譯一次而執(zhí)行多次。語法為:EXEC SQL PREPARE 語句名FROM:主變量;EXEC SQL EXECUTE語句名USING:替換主變量;PREPARE語句做兩件事:預(yù)編譯SQL語句;給出SQL語句的語句名。注意:SQL語句不能是查詢語

43、句;PREPARE和EXECUTE可包含主變量;PREPARE不能多次執(zhí)行。例如:#define USERNAME “SCOTT”#define PASSWORD “TIGER”#include EXEC SQL INCLUDE sqlca;EXEC SQL BEGIN DECLARE SECTION; Char * username=USERNAME; Char * password=PASSWORD; VARCHAR sqlstmt80; Int emp_number; VARCHAR emp_name15; VARCHAR job50;EXEC SQL END DECLARE SECTI

44、ON;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(“%

45、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

46、S USING :emp_number,:emp_name,:job,:salary; FETCH語句和OPEN語句FETCH語句和OPEN語句這組動態(tài)語句是對游標(biāo)進(jìn)行操作的,其執(zhí)行過程如下:PREPARE語句名FROM 主變量字符串;DECLARE游標(biāo)名FOR語句名;OPEN 游標(biāo)名USING:替換變量1,:替換變量變FETCH游標(biāo)名INTO: 主變量1,:主變量2CLOSE游標(biāo)名注意:注意: SQLSQL語句允許使用查詢語句;語句允許使用查詢語句; SELECTSELECT子句中的列名不能動態(tài)改變,只能預(yù)置;子句中的列名不能動態(tài)改變,只能預(yù)置; WHEREWHERE和和ORDER BY O

47、RDER BY 子句可以動態(tài)改變條件。子句可以動態(tài)改變條件。一、幾個(gè)特殊文件一、幾個(gè)特殊文件PROC在VC下開發(fā)Oracle庫接口時(shí),需要用到幾個(gè)特殊文件。1、PROC的可執(zhí)行文件PROCUI. EXE用Oracle_HOME代表Oracle安裝后的根目錄,當(dāng)其以缺省方式安裝在計(jì)算機(jī)的D盤時(shí),則Oracle_HOME位置是D: Oracle。這時(shí)PROC的可執(zhí)行文件在Oracle_HOME Ora81 BIN PROCUI. EXE,對缺省安裝即在D: Oracle Ora81 BIN PROCUI. EXE。2、Oracle支持SQL在VC環(huán)境的庫文件OraSQL8. LIB根據(jù)以上約定,O

48、raSQL8. LIB文件在Oracle_HOME Ora81 PRECOMP LIB MSVC OraSQL8.LIB,對缺省安裝即在D: Oracle Ora81 PRECOMP LIB MSVC OraSQL8.LIB。3、Oracle支持SQL在VC環(huán)境的頭文件根據(jù)以上約定,頭文件 *.h在Oracle_HOME Ora81 PRECOMP PUBLIC *.h,對缺省安裝即在D: Oracle Ora81 PRECOMP PUBLIC *.h。*.h 是頭文件的總稱,通常有十多個(gè),具體內(nèi)容可在指定路徑下查到。二、將二、將PROCPROC集成到集成到VCVC環(huán)境中環(huán)境中為了方便完成用P

49、ROC在VC下開發(fā)Oracle庫接口,通常將PROC集成到Visual C+ 6.0 環(huán)境中,直接在C / C+環(huán)境中使用PROC預(yù)編譯器來預(yù)編譯應(yīng)用程序,然后進(jìn)行編譯和鏈接,最終生成可執(zhí)行程序。將PROC集成到VC環(huán)境中應(yīng)完成如下工作。1、增加、增加PROC到到Tools菜單列表菜單列表2、指定頭文件路徑、指定頭文件路徑1 1、增加、增加PROCPROC到到ToolsTools菜單列表菜單列表a)運(yùn)行Microsoft Visual C+ 6.0;b)從菜單項(xiàng)Tools中選擇Customize項(xiàng)。為表述簡單起見,書寫成如下格式:菜單Tools/ Customize 項(xiàng)。以下采用類似的表達(dá)方法

50、。此時(shí)出現(xiàn)Customize對話框;c)單擊Tools選項(xiàng)卡(或?qū)傩皂摚檬髽?biāo)移動“Menu contents”框滾動條到底部區(qū)域;d)雙擊點(diǎn)劃線矩形區(qū)域,在空白區(qū)域上輸入“PROC”,然后按回車鍵;e)在“Command”框中,輸入PROC的可執(zhí)行文件名。根據(jù)2.1節(jié)的說明,對缺省安裝即輸入D: Oracle Ora81 BIN PROCUI. EXE;f)在“Arguments”框中輸入“$(TargetName)”。其作用在從菜單Tools中選擇PROC項(xiàng)時(shí),VC會將當(dāng)前項(xiàng)目名傳遞給PROC,爾后PROC會直接打開該項(xiàng)目文件目錄下擴(kuò)展名為 .pre的同名文件;g)在“Initial d

51、irectory”框中輸入“$(WkspDir)” / 單擊“Close”按鈕,完成將PROC集成到VC環(huán)境中的工作。2 2、指定頭文件路徑、指定頭文件路徑為了確保VC順利完成編譯鏈接,需要將Oracle提供的頭文件增加到VC環(huán)境中。指定頭文件路徑的具體步驟如下。a) 菜單Tools / Options項(xiàng),出現(xiàn)“Options”對話框;b) 單擊“Directories”選項(xiàng)卡,從“Show directories for:”列表框中選擇“Include files”;c) 移動“Directories”框的滾動條到底部區(qū)域;d) 雙擊點(diǎn)劃線矩形區(qū)域,在空白區(qū)域上輸入包含Oracle支持SQL

52、在VC環(huán)境頭文件的子目錄,根據(jù)2.3節(jié)的說明,對缺省安裝即輸入D: Oracle Ora81 PRECOMP PUBLIC。三、三、VCVC下開發(fā)下開發(fā)OracleOracle接口程序過程接口程序過程1、創(chuàng)建新工程2、創(chuàng)建預(yù)編譯源文件3、預(yù)編譯4、編譯準(zhǔn)備1 1、創(chuàng)建新工程、創(chuàng)建新工程下面敘述中,假定新建的工程名為:Exam01。當(dāng)運(yùn)行Visual C+ 6.0后,操作步驟如下:a)菜單File / New項(xiàng) / Project卡;b)選擇Win32 console Application 項(xiàng);c)由瀏覽選擇或直接輸入工程將位于的路徑 / 填入創(chuàng)建的工程名如Exam01;d)單擊OK按鈕 / 依缺省值單擊Finish / 單擊OK,完成創(chuàng)建

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論