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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quá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強大的類庫支持,熟悉VC編程時則實現(xiàn)方便,且可移植性強;但是,與PROC 相比,應用程序需要經(jīng)過兩層才能和數(shù)據(jù)庫通信接口建立聯(lián)系,編程相對復雜,執(zhí)行效率相對較低。PROC支持嵌入式PL/SQL 塊等直接調(diào)用Oracle 庫,將過程化語言和非過程化語言相結(jié)合,形

2、成一種更強的開發(fā)工具,可開發(fā)出滿足各種復雜要求的優(yōu)化應用程序,執(zhí)行效率高。適合熟悉Oracle技術(shù)的人員應用。但是用PROC 開發(fā)出的應用程序無法向異構(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命令以交互的應用程序訪問數(shù)據(jù)庫;用第四代語言應用開發(fā)工具開發(fā)的應用程序訪問數(shù)據(jù)庫,這些工具有SQL*Froms,QL*Reportwriter,SQL*Menu等;利用在第三代語言內(nèi)嵌入的SQL

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

4、實際是內(nèi)嵌有SQL語句或PL/SQL塊的C程序, 因此它的組成很類似C程序。 但因為它內(nèi)嵌有SQL語句或PL/SQL塊, 所以它還含有與之不同的成份。為了讓大家對Pro*C有個感性的認識, 特將二者差別比較如下:C源程序C的全程變量說明函數(shù)1:同函數(shù)K函數(shù)2:同函數(shù)KC的局部變量說明函數(shù)K可執(zhí)行語句Pro*C源程序 應用程序首部 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)應用程序首部;(2)應用程序體應用程序首部定義了ORACLE數(shù)據(jù)庫的有關(guān)變量, 為在C語言中操縱ORACLE數(shù)據(jù)庫做好了準備。應用程序體基本上由Pro*C的SQL語句調(diào)用組成。主要指查詢SELECT、INSERT、UPDATE、DELETE等語句。應用程序的組成結(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 語句及游標的使用應用程序體描述部分應用程序首部SQL通信區(qū)1 1 應用程序首部應用程序首部應用程序的首部就是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ù)類型實際上就是C語言的數(shù)據(jù)類型, 其中VARCHAR中視為C數(shù)據(jù)類型的擴充。這在以后會談到。數(shù)據(jù)類型數(shù)據(jù)類型描述描述CHARCHAR(n)INT SHORT LONG FLOAT DOUBLE VARCHAR單字符n個字符數(shù)組整數(shù)短整數(shù)長整數(shù)單精度浮點數(shù)雙精度浮點數(shù)變長字符串SQL變量的使用應注意以下幾點:必須在描述部分明確定義必須使用與其定義相同的大小寫格式在SQL語句中使用時,必須在其之前加一個“:”(冒號),但在C語句中引用時不需加冒號。不能是SQL命令中的保留字??梢詭е甘咀兞?。例如:EXEC 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). 指示器變量的說明和引用指示器變量的說明和引用指示變量實際上也是一類SQL變量,它被用來管理與其相關(guān)聯(lián)的宿主變量(即在SQL語句中充 當輸入或輸出的變量)。每一個宿主變量都可定義一個指示器變量,主要用于處理空值(NULL)指示器變量的說明基本同一般SQL變量一樣, 但必須定義成2字節(jié)的整型,如SHORT、INT。在SQL語句中引用時, 其前也應加“:”(冒號),而且必須附在其相關(guān)聯(lián)的宿主變量之后,在C語句中,可獨立使用。當指示器變量為-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ù)組名(名字前加冒號), 不需寫下標,在C語句中用法如同C語言的數(shù)組變量。使用數(shù)組可大大降低網(wǎng)絡傳輸開銷。如要向一表插入100行數(shù)據(jù),如果沒有數(shù)組,就要重復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ù)組時,應注意以下幾點;不支持指針數(shù)組只支持一維數(shù)組, 而 emp-name 10015視為一維字符串數(shù)組最大維數(shù)為32767在一條SQL語句中引用多個數(shù)組時,

15、這些數(shù)組維數(shù)應相同在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 ; 在預編繹時, book name 被翻譯成C語言中的一個結(jié)構(gòu)變量; Struct unsigned short len ; Unsigned chart arr 20 ; boo name 由此看出, VARCHAR變量實際上是含長度成員和數(shù)組成員的結(jié)構(gòu)變量。在SQL語句中引用時,應引用以冒

17、號為前綴的結(jié)構(gòu)名, 而不加下標,在C語句 中引用結(jié)構(gòu)成員。VARCHAR變量在作輸出變量時,由ORACLE自動設置, 在作為輸入變量時,程序應先把字符串存入數(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; 此部分提供了用戶運行程序的成敗記錄和錯誤處理。 SQLCA SQLCA的組成的組成SQLCA是一個結(jié)構(gòu)類型的變量,它是ORACLE 和應用程序的一個接口。在執(zhí)行 Pro*C程序時, ORACLE 把每一個嵌入SQL語句執(zhí)行的狀態(tài)信息存入SQLCA中, 根據(jù)這些信息,可判斷SQL語句的執(zhí)行是否成功,處理的行數(shù),錯誤信息等,其組成如表所示: Struct sqlca char sqlcaid 8 ; -標識通訊區(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)碼做出相應的處理。這些狀態(tài)碼值如下: 0: 表示該SQL語句被正確執(zhí)行,沒有發(fā)生錯誤和例外。 0:ORACLE執(zhí)行了該語句,但遇到一個例外(如沒找到任何數(shù)據(jù))。 0:表示由于數(shù)據(jù)庫、系統(tǒng)、網(wǎng)絡或應用程序的錯誤,OR

20、ACLE未執(zhí)行該SQL語句。 當出現(xiàn)此類錯誤時,當前事務一般應回滾。 2 2應用程序體應用程序體在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上。所連接命令應該是應用程序的第一個可執(zhí)行命令。連接命令格式如下: EXEC SQL CO

21、NNECT: IDENTIFIED BY : 或EXEC SQL CONNECT: / 在使用上述兩種格式進行登入時, 應當首先在說明段定義包含用戶名和口令的SQL 變量,并在執(zhí)行CONNECT之前設置它們,否則會造成登錄失敗。例如: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語言時已詳細講過, 這里就不舉例說明了。(3). (3). 數(shù)據(jù)庫查詢及游標的使用數(shù)據(jù)庫查詢及游標的使用在PRO*C中, 查詢可分為兩種類型:返回行的查詢.此種單行或定

25、行數(shù)的查詢;返回多查詢要求使用游標來控制每一行或每一組(主變量用數(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從句中的主變量叫輸出主變量,它提供了查詢時所需要的信息。在任何項送給主變量之前,都要求ORACLE把這些項轉(zhuǎn)換成主變量的數(shù)據(jù)類型。對于數(shù)字是通過截斷來完成的(如:9.23轉(zhuǎn)換為9)。如果已確定查詢只返回一行,那么就不必使用游標,只給SELECT語句增加一個INTO子句即可。在語義上INTO語句在FROM之前的查詢中有多少個選擇項就有多少個輸出主變量。若在SELECT項中表達式的數(shù)目不等于INTO子句中主變量的數(shù)目,就把SQLCA.SQLWARN3置為”W”。多行查

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

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

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

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

31、釋放與該游標有關(guān)的資源。關(guān)閉游標的格式為:EXEC SQL CLOSE 游標名;例如: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嵌套的方法及應用嵌套的方法及應用嵌

32、入SQL與交互式SQL在形式上有如下差別:在SQL語句前增加前綴“EXEC SQL”, 這一小小的差別其目的是在于預編譯時容易識別出來, 以便把每一條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語言高速的特點,因而可完成一些ORACLE產(chǎn)品不能完成的任務,例如以下一個固定的特殊格式輸出結(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:主變量長度不夠就被截斷。3 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)過預編譯器編譯之后形成目標程序*。BOJ,然后執(zhí)行目標程序預即可。動態(tài)定義語句:有些語句不能事先嵌入到PRO*C程序中,要根據(jù)程序運行情況,用戶自己從輸入設備上(

41、如終端上)實時輸入即將執(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只能運行帶一個參數(shù)的動態(tài)語句。其中,abcd是參數(shù),不是關(guān)鍵字。2.EXECUTE IMMEDIATE使用的先決條件是:SQL語句不能包含主變量;SQL語句不能是查詢語句。3.可用任何主變量作為EXECUTE IMMEDIATE的參數(shù);也可用字符串作為主變量。PREPARE與EXECUTE語句此語句表示“預編譯/執(zhí)行”。此語句能夠預編譯一次而執(zhí)行多次。語法為:EXEC SQL PREPARE 語句名FROM:主變量;EXEC SQL EXECUTE語句名USING:替換主變量;PREPARE語句做兩件事:預編譯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)語句是對游標進行操作的,其執(zhí)行過程如下:PREPARE語句名FROM 主變量字符串;DECLARE游標名FOR語句名;OPEN 游標名USING:替換變量1,:替換變量變FETCH游標名INTO: 主變量1,:主變量2CLOSE游標名注意:注意: SQLSQL語句允許使用查詢語句;語句允許使用查詢語句; SELECTSELECT子句中的列名不能動態(tài)改變,只能預置;子句中的列名不能動態(tài)改變,只能預置; WHEREWHE

47、RE和和ORDER BY ORDER BY 子句可以動態(tài)改變條件。子句可以動態(tài)改變條件。一、幾個特殊文件一、幾個特殊文件PROC在VC下開發(fā)Oracle庫接口時,需要用到幾個特殊文件。1、PROC的可執(zhí)行文件PROCUI. EXE用Oracle_HOME代表Oracle安裝后的根目錄,當其以缺省方式安裝在計算機的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預編譯器來預編譯應用程序,然后進行編譯和鏈接,最終生成可執(zhí)行程序。將PROC集成到VC環(huán)境中應完成如下工作。1、增加、增加PROC到到Tools菜單列表菜單列表2、指定頭文件路徑、指定頭文件路徑1 1、增加、增加PROCPROC到到ToolsTools菜單列表菜單列表a)運行Microsoft Visual C+ 6.0;b)從菜單項Tools中選擇Customize項。為表述簡單起見,書寫成如下格式:菜單Tools/ Customize

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

51、;g)在“Initial directory”框中輸入“$(WkspDir)” / 單擊“Close”按鈕,完成將PROC集成到VC環(huán)境中的工作。2 2、指定頭文件路徑、指定頭文件路徑為了確保VC順利完成編譯鏈接,需要將Oracle提供的頭文件增加到VC環(huán)境中。指定頭文件路徑的具體步驟如下。a) 菜單Tools / Options項,出現(xiàn)“Options”對話框;b) 單擊“Directories”選項卡,從“Show directories for:”列表框中選擇“Include files”;c) 移動“Directories”框的滾動條到底部區(qū)域;d) 雙擊點劃線矩形區(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)建預編譯源文件3、預編譯4、編譯準備1 1、創(chuàng)建新工程、創(chuàng)建新工程下面敘述中,假定新建的工程名為:Exam01。當運行Visual C+ 6.0后,操作步驟如下:a)菜單File / New項 / Project卡;b)選擇Win32 console Application 項;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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論