?? 5.html
字號:
在Pro*C/C++中可以使用如下的語句連接到Oracle數據庫服務器:<p>EXEC SQL CONNECT :username IDENTIFIED BY:password [USING :server];<p>或EXECSQL CONNECT : user_pwd [USING:server];<p>參數說明如下:<p> ·username:數據庫用戶名。<p> ·password:用戶口令。<p> ·server:連接到數據庫。user_pwd:用戶名及口令,二者必須用反斜杠(/)隔開<p><br><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I223" ID="I223"></A><center><b><font size=+2>斷開</font></b></center><br>同連接相比,斷開相對簡單,只需將所有事務回滾,并釋放內存、斷開連接即可。在Pro*C/C++中可使用如下語句實現該功能:<p>EXEC SQL ROLLBACK [WORK] [RELEASE];<p>其中ROLLBACK起到回滾并結束事務,清除所有保存點的作用。RELEASE子句用于釋放內存、斷開連接。<p>我們通過編寫函數disconnect來實現與數據庫的斷開。該函數的編寫過程中,我們采用了以上介紹的斷開數據庫連接技術。<p>該函數無返回值,無參數。函數聲明如下:<p>void disconnect();<p>函數中實現斷開數據庫連接的代碼為:<p>EXEC SQL ROLLBACK WORK RELEASE;<p><p><br><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I224" ID="I224"></A><center><b><font size=+2>動態SQL</font></b></center><br> 在實際工作中,有時我們需要在運行應用程序時接收和處理不同的SQL語句,比如在該程序的功能函數中需要不同的select語句。因為這些SQL語是在程序運行時動態輸入的,所以成為動態SQL語句。<p>動態SQL與靜態SQL語句比較:<p> ·靜態SQL語句被內嵌到了源程序中,而動態SQL語句則是在應用程序運行時所輸入的SQL語句,它被存儲到了字符串變量中。因此使用動態SQL比靜態SQL更靈活。<p> ·使用動態SQL需要編寫更加復雜的代碼,而使用靜態SQL只需將SQL語句內嵌到應用程序中就可以了。<p> ·如果能夠能夠確定應用程序所要使用的SQL語句和它的結構,那么使用靜態SQL,因為這樣不僅可以簡化編程,而且應用程序的執行性能更好;而如果不能確定要執行何種SQL語句、宿主變量個數,宿主變量數據類型以及SQL語句所涉及到的數據對象,那么就要使用動態SQL。這樣可使應用程序更加靈活,但程序編制更加復雜。<p>在Pro*C/C++應用程序中使用動態SQL共有四種方法:<p> ·動態SQL方法一:適用于不包含宿主變量的SQL語句,并且不能是SELECT語句。<p> ·動態SQL方法二:適用于宿主變量個數已經確定的SQL語句,并且不能是SELECT語句。<p> ·動態SQL方法三:適用于查詢列表已經確定的SQL語句。<p> ·動態SQL方法四:適用于查詢列表以及宿主變量個數均不能確定的SQL語句<center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I225" ID="I225"></A><center><b><font size=+2>方法三</font></b></center><br>1.動態SQL方法三<p> 本方法與動態SQL方法二比較類似。不同的是,方法三將PREPARE命令與游標命令結合起來使用。因此,本方法可以接收和處理SELECT語句。但在預編譯時,必須要知道查詢列表項的列數以及占位符的個數。數據庫對象名(例如:表名和列名)可以在運行時指定,但數據庫對象名不能是宿主變量。另外,也可以在運行時指定條件、分組以及排序子句。<p>使用動態SQL方法三的步驟如下:<p>1)使用PREPARE命令準備SQL語句<p>該命令用于命名和分析SQL語句。在分析了SQL語句后,可以使用EXECUTE語句多次執行該語句。PREPARE命令的語法如下:<p>EXEC SQL PREPARE statement_name FROM{:host_string|string_literal};<p>參數說明如下:<p> ·statement_name:語句名稱,它是一個標識符而不是宿主變量。<p> ·host_string:包含了SQL語句的宿主變量。<p> ·string_literal:包含了SQL語句的字符串。<p>2) 使用DECLARE命令定義游標<p>該命令語法如下:<p>DECLARE cursor_name CURSOR FORstatement_name;<p>參數說明如下:<p> ·cursor_name:游標名。<p> ·statement_name:步驟1中的SQL語句標識符。<p>3) 使用OPEN命令打開游標<p>該命令的語法如下:<p>OPEN cursor_name [USING host_variable_list] ;<p>參數說明如下:<p> ·cursor_name:步驟2中的游標名。<p> ·host_variable_list:宿主變量列表,使用該列表中的項替換SQL語句中的占位符。<p>需要注意的是,如果SQL語句不是SELECT語句,那么在執行了OPEN命令后即完成了SQL語句的執行,而無需執行FETCH語句。<p>4) 使用FETCH語句推進游標、檢索數據<p>該語句的語法如下:<p>FETCH cursor_name INTO host_variable_list;<p>參數說明如下:<p>cursor_name:游標名。<p>host_variable_list:宿主變量名列表,將檢索到的數據保存到這些宿主變量中。<p>5) 使用CLOSE命令關閉游標<p>該命令語法如下:<p>CLOSE cursor_name;<p><p><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I226" ID="I226"></A><center><b><font size=+2>方法四</font></b></center><br>2.動態SQL方法四<p> 使用本方法可以接收和處理各SQL語句,并且在預編譯前不需要知道查詢列表項和輸入宿主變量的占位符個數。因為輸入宿主變量以及查詢列表項的個數在運行應用程序前無法確定,所以需要為它們動態分配內存。為了完成這項認務,必須使用SQLDA結構。<p> SQLDA結構的作用是處理和保存查詢列表項以及宿主變量占位符的信息。在動態方法四中輸入宿主變量實際上并不是作為宿主變量使用,它們只是一些占位符,我們也將它稱為綁定變量。關于SQLDA的相關知識請參閱第八章,這里不再累述。<p>應用方法四主要處理查詢列表項或宿主變量個數未知的SQL語句。其基本步驟如下:<p>1)定義用于保存動態SQL語句的宿主字符串<p>應用程序需要使用宿主變量來存儲動態SQL語句,這樣就需要定義一個字符串宿主變量。<p>2)定義SQLDA<p>應用程序需要使用SQLDA結構來存儲查詢列表項以及占位符的信息,所以我們必須使用如下語句將該結構包含到應用程序中:<p>EXEC SQL INCLUDE sqlda;<p>爾后還要定義指向查詢描述區的指針。<p>3)為描述區分配內存<p>在定SQLDA結構后,為了使用查詢描述區和綁定描述區,我們還必須使用函數sqlald()為它們分配內存。當分配描述區時,函數sqlald()會將V[0]到V[N-1]設置為0。該函數語法如下:<p>descriptor_name=sqlald(max_vars,max_name,max_ind_name);<p>參數說明如下:<p> ·max_vars:查詢列表項或占位符的最大個數。<p> ·max_name:查詢列表項名稱或占位符名稱的最大長度。<p> ·max_ind_name:占位符指示變量名稱的最大長度。<p>4)設置DESCRIBE命令所對應的查詢列表項或占位符的最大個數<p>這一步用于設置DESCRIBE命令可以描述的查詢列表項或占位符的最大個數。<p>5)將SQL語句存儲到宿主字符串中<p>這一步用于接收SQL語句,并將SQL語句保存到宿主變量中。<p>6)使用PREPARE命令準備動態SQL語句<p>這一步用于命名和解析SQL語句。<p>7)使用DECLEAR命令定義游標<p>8)使用DESCRIBE命令獲取綁定變量信息<p>DESCRIBE BIND VARIABLES命令用于將占位符信息存儲到綁定描述區中。<p>9)重新設置占位符個數<p>這一步是將DESCRIBE命令獲取到的實際占位符個數設置為變量N的值。<p>10)為綁定變量分配內存并輸入數據<p>如果存在綁定變量占位符,那么應用程序必須為其賦值并分配內存。<p>11)打開游標<p>12)使用DESCRIBE命令獲取查詢列表信息<p>如果動態SQL語句是SELECT語句,我們還必須使用DESCRIBE SELECT LIST命令將查詢列表項的信息存儲到查詢描述區中。另外需要注意兩點:<p> ·該命令將F設置為實際的查詢列表數,如果SQL語句不是SELECT語句,則變量F被設置為0。<p> ·NUMBER值長度不可用,必須使用函數sqlprc()獲取精度和標度。<p>13)重新設置查詢列表項<p>這一步用于將DESCRIBE命令獲取到的實際查詢列表項個數設置為查詢列表項的最大個數。<p>14)重新設置每個查詢列表項的長度和數據類型<p>在使用FETCH命令獲取查詢列表項數據前,為顯示結果可能需要重新設置某些元素的長度和數據類型。<p>15)利用FETCH命令檢索數據<p>執行此命令后,數據被存儲到了查詢描述區中。<p>16)獲取并處理查詢列表值<p>在執行了FETCH命令后,可以通過數組V和數組I中的元素來處理檢索到的數據。<p>17)關閉游標<p>在推進游標、檢索完數據后,執行如下命令關閉游標:<p>EXEC SQLCLOSE s_cursor;<p>18)釋放空間使用函數free()釋放由函數malloc()所分配的內存,使用函數sqlclu()釋放為查詢描述區以及綁定描述區所分配的空間<p><br><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I227" ID="I227"></A><center><b><font size=+2>檢測錯誤和狀態改變</font></b></center><br>在Pro*C/C++中,用于檢測錯誤和狀態改變的方法有如下兩種:<p> ·定義狀態變量SQLSTATE或SQLCODE,在執行了SQL語句后檢查它們的值,并根據需要執行相應的操作。<p> ·使用SQLCA。SQLCA被定義在頭文件sqlca.h中。<p>在該程序中我們使用了SQLCA進行錯誤檢測。關于SQLCA的詳細描述請參閱第八章相關說明,這里不再累述。<p>WHENEVER語句用于檢測并處理錯誤,使用該語句的語法如下:<p>EXEC SQL WHENEVER<condition><action><p>1)條件(condition)<p>Oracle可自動檢測以下條件:<p> ·SQLWORING:當Oracle返回警告信息時會設置sqlworn[0]為“W”。使用該條件必須定義SQLCA。<p> ·SQLERROR:出現嚴重錯誤,此時SQLCODE為負值。<p> ·NOT FOUND:當Oracle不能找到滿足條件的記錄時SQLCODE被置為+1403。<p>2)操作(action)<p>當Oracle檢測到以上條件時,應用程序可以執行如下操作:<p> ·CONTINUE:繼續運行下一條語句。<p> ·DO:執行錯誤處理函數。<p> ·GOTO lable_name:轉移到標號處執行。STOP:停止執行,回滾事務。<p><br><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I228" ID="I228"></A><center><b><font size=+2>SQLCA</font></b></center><br>SQLCA是一個數據結構,它的成員包含了SQL語句執行后的錯誤、警告和狀態信息。在ORACLE_HOME\pro80\c\include目錄下的sqlca.h文件中定義了SQLCA結構。<p>使用如下語句可以將SQLCA包含到應用程序中:<p>EXEC SQL INCLUDE SQLCA;<p>或 #include<sqlca.h><p>其部分結構成員如下:<p> ·sqlcaid:標識SQL通訊區的字符串成員,它被初始化為“SQLCA”。<p> ·sqlcabc:整數成員,用于保存SQLCA的字節長度。<p> ·sqlcode:整數成員,它保存著SQL語句執行后的狀態代碼。Sqlcode的值和含義見表8-1:<p><p><br>Sqlcode的值<p>含義<p><br>0 執行SQL語句成功<p><br>>0 執行了該語句但檢測到異常情況<p><br><0 出現嚴重錯誤,語句沒有執行<p> ·sqlwarn:用于設置警告標記的單字符數組,通過賦“W”來設置警告標記。<p> ·sqlerrm:包含了成員sqlerrml及sqlerrmc的一個結構,其中sqlerrml用于保存錯誤文本長度,sqlerrmc用于保存錯誤文本。<p>Sqlerrmc最多可以保存70個字符的錯誤消息,使用函數sqlglm可以獲得完整的錯誤消息文本,該函數的語法如下:<p>voidsqlglm(char *message_buffer,size_t *buffer_size,size_t *message_lenth);<p>參數說明如下:<p> ·message_buffer:存儲錯誤消息的文本緩沖區(尾部以空格填充)。<p> ·buffer_size:緩沖區的字節長度。<p> ·message_lenth:錯誤消息的實際長度。<p>注意,調用該函數前必須確保SQLCODE或sqlca.sqlcode不等于0。該函數只能用于非線程應用。<p>SQLCA中還包括其它結構成員,包括sqlerrp、sqlerrd、sqlext等,由于這些成員的作用相對次要或在程序中沒有使用,故這里暫不作介紹。<p><p><br><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I229" ID="I229"></A><center><b><font size=+2>SQLDA</font></b></center><br>SQLDA結構的作用是處理和保存查詢列表項以及宿主變量占位符的信息。<p>當SQL語句所包含的查詢列表項或綁定變量的個數不能確定時,我們就需要使用SQLDA結構來定義和描述查詢列表項或綁定變量占位符。因此,該結構也被稱為描述區,綁定變量列表所對應的綁定變量列表所對應的描述區就稱為綁定描述區。<p>SQLDA結構保存在ORACLE_HOME\pro80\include目錄下的sqida.h文件中。利用如下語句可以將該結構包含至應用程序中:<p>EXEC SQL INCLUDE sqlda;<p>爾后還要定義指向查詢描述區和綁定描述區的指針:<p>SQLDA *bind_dp;<p>SQLDA *selectdp;<p>該結構的內容如下:<p>struct SQLDA<br>{<br>long N;<br>char **V;<br>long *L;<br>short *T;<br>short **I;<br>long F;<br>char **S;<br>short *M;<br>short *C;<br>char **X;<br>short *Y;<br>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -