版權(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í)現(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有個感性的認(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) 每一個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個字符數(shù)組整數(shù)短整數(shù)長整數(shù)單精度浮點(diǎn)數(shù)雙精度浮點(diǎn)數(shù)變長字符串SQL變量的使用應(yīng)注意以下幾點(diǎn):必須在描述部分明確定義必須使用與其定義相同的大小寫格式在SQL語句中使用時,必須在其之前加一個“:”(冒號),但在C語句中引用時不需加冒號。不能是SQL命令中的保留字??梢詭е甘咀兞俊@纾篍XEC SQL BEGIN DECLARE SECTIONS;EX
8、EC SQL BEGIN DECLARE SECTIONS; VARCHAR programe30; VARCHAR programe30; Int porgsal, pempno; Int porgsal, pempno;EXEC SQL END DECLARE SECTION;EXEC SQL END DECLARE SECTION; EXEC SQL SELECT ENAME , SAL EXEC SQL SELECT ENAME , SAL INTO: programe, : progsal INTO: programe, : progsal FROM EMP FROM EMP WHE
9、RE EMPNO = : pempno; WHERE EMPNO = : pempno;(2). (2). 指示器變量的說明和引用指示器變量的說明和引用指示變量實(shí)際上也是一類SQL變量,它被用來管理與其相關(guān)聯(lián)的宿主變量(即在SQL語句中充 當(dāng)輸入或輸出的變量)。每一個宿主變量都可定義一個指示器變量,主要用于處理空值(NULL)指示器變量的說明基本同一般SQL變量一樣, 但必須定義成2字節(jié)的整型,如SHORT、INT。在SQL語句中引用時, 其前也應(yīng)加“:”(冒號),而且必須附在其相關(guān)聯(lián)的宿主變量之后,在C語句中,可獨(dú)立使用。當(dāng)指示器變量為-1時,表示空值。例如:EXEC SQL BEGIN D
10、ECLARE SECTION ; EXEC SQL BEGIN DECLARE SECTION ; INT dept- number; INT dept- number; SHORT ind num; SHORT ind num; CHAR emp name; CHAR emp name;EXEC SQL END DECLARE SECTION ; EXEC SQL END DECLARE SECTION ; Scanf(“90d %s”, & dept- number , dept name );Scanf(“90d %s”, & dept- number , dept na
11、me ); If (dept number =0) If (dept number =0) Ind num = -1; Ind num = -1; Else Else Ind num = 0; Ind num = 0;EXEC SQL INSERT INTO DEPT (DEPTNO, DNAME)EXEC SQL INSERT INTO DEPT (DEPTNO, DNAME)VALUES(:dept number : ind- num , :dept name);VALUES(:dept number : ind- num , :dept name);( (3 3) ). .指針指針SQL
12、SQL變量的說明和使用變量的說明和使用指針SQL變量在引用前也必須在DECLARE 部分先說明。其說明格式同C語言。在SQL語句中引用時,指針名字前要加前綴“:”(冒號)而不加“*”(星號)。在C語句中用法如同C語言的指針變量。( (4 4) ). .數(shù)組數(shù)組SQLSQL變更的說明和引用變更的說明和引用在SQL語句中引用數(shù)組時,只需寫數(shù)組名(名字前加冒號), 不需寫下標(biāo),在C語句中用法如同C語言的數(shù)組變量。使用數(shù)組可大大降低網(wǎng)絡(luò)傳輸開銷。如要向一表插入100行數(shù)據(jù),如果沒有數(shù)組,就要重復(fù)100次, 而引用后,只須執(zhí)行一次insert語句、便可一次性插入。例如:EXEC SQL BEGIN DE
13、CLARE SECTION;EXEC SQL BEGIN DECLARE SECTION; Int emp_number100; Int emp_number100; Char emp_name10015; Char emp_name10015; Float salary100,commission100; Float salary100,commission100; Int dept_number; Int dept_number;EXEC SQL END DECLARE SECTION;EXEC SQL END DECLARE SECTION; EXEC SQL SELECT EMPNO,
14、ENAME,SAL,COMMEXEC SQL SELECT EMPNO,ENAME,SAL,COMM INTO :emp_number,:emp_name,:salary,:commission INTO :emp_number,:emp_name,:salary,:commission FROM EMP FROM EMP WHERE DEPTNO=:dept_number; WHERE DEPTNO=:dept_number; 在使用數(shù)組時,應(yīng)注意以下幾點(diǎn);不支持指針數(shù)組只支持一維數(shù)組, 而 emp-name 10015視為一維字符串?dāng)?shù)組最大維數(shù)為32767在一條SQL語句中引用多個數(shù)組時,
15、這些數(shù)組維數(shù)應(yīng)相同在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的說明
16、和引用的說明和引用VARCHAR變量在引用之前也必須在說明段說明, 說明時必須指出串的最大長度,如: EXEC SQL BEGIN DECLARE SECTION; Int book number; VARCHAR book name 50 ; EXEC SQL END DECLARE SECTION ; 在預(yù)編繹時, book name 被翻譯成C語言中的一個結(jié)構(gòu)變量; Struct unsigned short len ; Unsigned chart arr 20 ; boo name 由此看出, VARCHAR變量實(shí)際上是含長度成員和數(shù)組成員的結(jié)構(gòu)變量。在SQL語句中引用時,應(yīng)引用以冒
17、號為前綴的結(jié)構(gòu)名, 而不加下標(biāo),在C語句 中引用結(jié)構(gòu)成員。VARCHAR變量在作輸出變量時,由ORACLE自動設(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
18、通信區(qū)通信區(qū) SQL 通信區(qū)是用下列語句描述的: EXEC SQL INCLUDE SQLCA; 此部分提供了用戶運(yùn)行程序的成敗記錄和錯誤處理。 SQLCA SQLCA的組成的組成SQLCA是一個結(jié)構(gòu)類型的變量,它是ORACLE 和應(yīng)用程序的一個接口。在執(zhí)行 Pro*C程序時, ORACLE 把每一個嵌入SQL語句執(zhí)行的狀態(tài)信息存入SQLCA中, 根據(jù)這些信息,可判斷SQL語句的執(zhí)行是否成功,處理的行數(shù),錯誤信息等,其組成如表所示: Struct sqlca char sqlcaid 8 ; -標(biāo)識通訊區(qū) long sqlabc; - 通訊區(qū)的長度 long sqlcode; -保留最近執(zhí)行的
19、SQL語句的狀態(tài)碼 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ā)生錯誤和例外。 0:ORACLE執(zhí)行了該語句,但遇到一個例外(如沒找到任何數(shù)據(jù))。 0:表示由于數(shù)據(jù)庫、系統(tǒng)、網(wǎng)絡(luò)或應(yīng)用程序的錯誤,OR
20、ACLE未執(zhí)行該SQL語句。 當(dāng)出現(xiàn)此類錯誤時,當(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)用程序的第一個可執(zhí)行命令。連接命令格式如下: EXEC SQL CO
21、NNECT: IDENTIFIED BY : 或EXEC SQL CONNECT: / 在使用上述兩種格式進(jìn)行登入時, 應(yīng)當(dāng)首先在說明段定義包含用戶名和口令的SQL 變量,并在執(zhí)行CONNECT之前設(shè)置它們,否則會造成登錄失敗。例如:EXEC SQL BEGIN DECLARE SECTION EXEC SQL BEGIN DECLARE SECTION ; VARCHAR usename 20; VARCHAR usename 20; VARCHAR password20; VARCHAR password20;EXEC SQL END DECLARE EXEC SQL END DECLAR
22、E . . strcpy ( usename.arr, “CSOTT); strcpy ( usename.arr, “CSOTT); usename.len = strlen (username.arr); usename.len = strlen (username.arr); strcpy (password.arr , “TIGER); strcpy (password.arr , “TIGER); password .len = strlen( password .arr); password .len = strlen( password .arr); EXEC SQL WHENE
23、VER SQLERROR GOTO SQLERR; EXEC SQL WHENEVER SQLERROR GOTO SQLERR; EXEC SQL CONNECT :username INDNTIFIED BY : password; EXEC SQL CONNECT :username INDNTIFIED BY : password;注意注意: : 不能把用戶名和口令直接編寫到不能把用戶名和口令直接編寫到CONNECTCONNECT語句中,或者把用引號語句中,或者把用引號()括起來的字母串在)括起來的字母串在CONNECT CONNECT 語句中,語句中, 如下面的語句是無效的。如下面的
24、語句是無效的。 EXEC SQL 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語言時已詳細(xì)講過, 這里就不舉例說明了。(3). (3). 數(shù)據(jù)庫查詢及游標(biāo)的使用數(shù)據(jù)庫查詢及游標(biāo)的使用在PRO*C中, 查詢可分為兩種類型:返回行的查詢.此種單行或定
25、行數(shù)的查詢;返回多查詢要求使用游標(biāo)來控制每一行或每一組(主變量用數(shù)組).返回單行或定行數(shù)的查詢在PRO*C中的查詢SQL SELECT語句由以下幾個子句組成: SELECT INTO FROM WHERE CONNECT BY UNION INTERSECT MINUS GROUP BY HAVING ORDER BY 其中WHERE子句中的查詢條件可以是一個屬性或多個屬性的集合,在執(zhí)行是賦值的主變量也可放在WHERE子句中.WHERE子句中所用的主變量稱為輸入主變量。如: SELECT EMPNO, JOB, SAL INTO:PNAME, :PJOB, :PSAL FROM EMP WHE
26、RE EMPNO=:PEMPNO;若沒有找到限定的行, 則SQLCA.SQLCODE返回”+1403”, 表明”沒有找到”。INTO從句中的主變量叫輸出主變量,它提供了查詢時所需要的信息。在任何項(xiàng)送給主變量之前,都要求ORACLE把這些項(xiàng)轉(zhuǎn)換成主變量的數(shù)據(jù)類型。對于數(shù)字是通過截?cái)鄟硗瓿傻模ㄈ纾?.23轉(zhuǎn)換為9)。如果已確定查詢只返回一行,那么就不必使用游標(biāo),只給SELECT語句增加一個INTO子句即可。在語義上INTO語句在FROM之前的查詢中有多少個選擇項(xiàng)就有多少個輸出主變量。若在SELECT項(xiàng)中表達(dá)式的數(shù)目不等于INTO子句中主變量的數(shù)目,就把SQLCA.SQLWARN3置為”W”。多行查
27、詢及游標(biāo)的使用如果查詢返回多行或不知道返回多少行,使用帶有ORACLE游標(biāo)(CURSOR)的SELECT語句。游標(biāo)是ORACLE和PRO*C存放查詢結(jié)果的工作區(qū)域。一個游標(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)一個游標(biāo)必須首先定義, 才能使用它。語法為:EXEC SQL DECLARE 游標(biāo)名CORSOR FOR SELECT 列 FROM 表例如:EXEC SQL DECLARE CSOR, CURSOR FOR SELEC
28、T ENAME , JOB, SAL FROM EMPWHERE DEPTNO=:DEPTNO;當(dāng)賦給一個與查詢相關(guān)聯(lián)的游標(biāo)CURSOR之后, 當(dāng)SELECT查詢EMP時可從數(shù)據(jù)庫中返回多行,這些行就是CURSOR的一個活動區(qū)域。注意:1.定義游標(biāo)必須在對游標(biāo)操作之前完成;2.PRO*C不能引用沒有定義的游標(biāo);3.游標(biāo)定義后,其作用范圍是整個程序。所以對一個程序來講, 同時定義兩個相同的游標(biāo)是錯誤的。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)的
29、查詢中取出多于一行的結(jié)果。所有滿足查詢標(biāo)準(zhǔn)的行組成一集合,叫做“游標(biāo)活動集”。通過取操作,活動集中的每一行或每一組是一個一個返回的,查詢完成后, 游標(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é)果查
30、詢結(jié)果查詢結(jié)果查詢結(jié)果FETCH在游標(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返回一個SQLCA。SQLCA(=1403)。若希望此游標(biāo)再操作, 必須先關(guān)閉再打開它。在C程序中可以開辟一個內(nèi)存空間,來存放操作結(jié)果,這樣就能利用開辟的空間來靈活操縱查詢的結(jié)果。D D關(guān)閉游標(biāo)關(guān)閉游標(biāo)取完活動集中所有行后,必須關(guān)閉游標(biāo),以
31、釋放與該游標(biāo)有關(guān)的資源。關(guān)閉游標(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)用嵌
32、入SQL與交互式SQL在形式上有如下差別:在SQL語句前增加前綴“EXEC SQL”, 這一小小的差別其目的是在于預(yù)編譯時容易識別出來, 以便把每一條SQL作為一條高級語言來處理。每一SQL語句分為說明性語句和可執(zhí)行語句兩大類??蓤?zhí)行語句又分為數(shù)據(jù)定義、數(shù)據(jù)控制、數(shù)據(jù)操縱、數(shù)據(jù)檢索四大類。可執(zhí)行性SQL語句寫在高級語言的可執(zhí)行處;說明性SQL語句寫在高級語言的說明性的地方。 例如:在PRO*C程序中建立一個名為BOOK的表結(jié)構(gòu),過程如下:#includestdio.hEXEC SQL BEGIN DECLARE SECTION;VARCHAR uid20, pwd20;EXEC SQL END
33、 DECLARE SECTION;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 REL
34、EASE; EXIT;PRO*C可非常簡便靈活地訪問ORCLE數(shù)據(jù)庫中的數(shù)據(jù),同時又具有C語言高速的特點(diǎn),因而可完成一些ORACLE產(chǎn)品不能完成的任務(wù),例如以下一個固定的特殊格式輸出結(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 sala
35、ry5;EXEC SQL END 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, usernam
36、e); 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.sqlerrd2 - num_ret); num_ret=sqlca.sqlerrd2; if (sqlca.sqlerrd2 - num_ret)0) pr
37、int_rows(sqlca.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)的措
38、施。格式為EXEC SQL 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 DECL
39、ARE SECTION;EXEC 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
40、 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) (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è)備上(
41、如終端上)實(shí)時輸入即將執(zhí)行的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 :abc
42、d;注意:1.EXECUTE IMMEDIATE只能運(yùn)行帶一個參數(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語句的語句名。
43、注意:SQL語句不能是查詢語句;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
44、 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 numbe
45、r:”); 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); EXE
46、C SQL EXECUTE 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ù)置; WHEREWHE
47、RE和和ORDER BY ORDER BY 子句可以動態(tài)改變條件。子句可以動態(tài)改變條件。一、幾個特殊文件一、幾個特殊文件PROC在VC下開發(fā)Oracle庫接口時,需要用到幾個特殊文件。1、PROC的可執(zhí)行文件PROCUI. EXE用Oracle_HOME代表Oracle安裝后的根目錄,當(dāng)其以缺省方式安裝在計(jì)算機(jī)的D盤時,則Oracle_HOME位置是D: Oracle。這時PROC的可執(zhí)行文件在Oracle_HOME Ora81 BIN PROCUI. EXE,對缺省安裝即在D: Oracle Ora81 BIN PROCUI. EXE。2、Oracle支持SQL在VC環(huán)境的庫文件OraSQL
48、8. LIB根據(jù)以上約定,OraSQL8. 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 是頭文件的總稱,通常有十多個,具體內(nèi)容可在指定路徑下查到。二、將二、將PROCPROC集成到集成到VCVC
49、環(huán)境中環(huán)境中為了方便完成用PROC在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
50、 項(xiàng)。以下采用類似的表達(dá)方法。此時出現(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)時,VC會將當(dāng)前項(xiàng)目名傳遞給PROC,爾后PROC會直接打開該項(xiàng)目文件目錄下擴(kuò)展名為 .pre的同名文件
51、;g)在“Initial directory”框中輸入“$(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ū)域上輸
52、入包含Oracle支持SQL在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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 銀行員工福利待遇制度
- 酒店餐飲服務(wù)規(guī)范制度
- 八年級英語Ontheradio課件
- 教師扎根鄉(xiāng)村奉獻(xiàn)青春演講稿(31篇)
- 《試模問題處理》課件
- 2025屆北京市第101中學(xué)高三第五次模擬考試數(shù)學(xué)試卷含解析
- 山西省靜樂縣第一中學(xué)2025屆高考英語考前最后一卷預(yù)測卷含解析
- 2025屆上海市6校高三下學(xué)期第五次調(diào)研考試語文試題含解析
- 2025屆安徽省六安市高三壓軸卷英語試卷含解析
- 10.1《勸學(xué)》課件 2024-2025學(xué)年統(tǒng)編版高中語文必修上冊-1
- 2020年新蘇教版四年級上冊科學(xué)期末試卷(含答案)
- 崗位職等職級及對應(yīng)薪酬表
- 計(jì)量基礎(chǔ)知識試卷三附有答案
- 銀行安全保衛(wèi)工作知識考試題庫(濃縮500題)
- 大學(xué)生創(chuàng)新創(chuàng)業(yè)理論及實(shí)踐PPT完整全套教學(xué)課件
- 吉利NPDS流程和PPAP介紹
- 男朋友無償贈與車輛協(xié)議書怎么寫
- 保密應(yīng)急處置工作方案
- 汽車認(rèn)識實(shí)訓(xùn)課件
- 承包學(xué)校食堂經(jīng)營方案
- 輪機(jī)工程材料18章總結(jié)
評論
0/150
提交評論