OCI編程基礎篇(十) 其他相關函數
訪問www.tomcoding.com網站,學習Oracle內部數據結構,詳細文檔說明,下載Oracle的exp/imp,DUL,logminer,ASM工具的源代碼,學習高技術含量的內容。
在前面的OCI編程基礎中有些函數還有替代品,我們在這里介紹一下,希望你在看到別的代碼中用了不同的函數而不至于迷惑。
前面我們介紹綁定函數時用到了OCIBindByPos()函數,這是一個按照占位符位置來綁定變量的函數,還有一個相關的函數叫OCIBindByName(),是按照占位符的名稱來綁定變量的。函數原型如下。
sword OCIBindByName ( OCIStmt *stmtp,
OCIBind **bindpp,
OCIError *errhp,
const OraText *placeholder,
sb4 placeh_len,
void *valuep,
sb4 value_sz,
ub2 dty,
void *indp,
ub2 *alenp,
ub2 *rcodep,
ub4 maxarr_len,
ub4 *curelep,
ub4 mode );
其他參數都與OCIBindByPos()函數一樣,只是原來的position參數變成了兩個參數,一個是占位符的名稱,一個是占位符的長度,參數含義如下。
placeholder是一個輸入參數,是占位符的名稱,以NULL結尾的字符串。
placeh_len是一個輸入參數,是上面占位符名稱的長度,以字節計算。
我們前面的例子中向test_tab中插入一條數據,用位置綁定函數時SQL語句為INSERT INTO test_tab VALUES (:1, :2, :3),那么用名稱綁定函數時SQL語句就是INSERT INTO test_tab VALUES (:v_id, :v_name, :v_addr)。那么在綁定時函數應該是下面這樣的,只拿第一個字段ID作為例子。
rc = OCIBindByName(smtp, errhp, ":v_id", strlen(":v_id"), &id, 4, SQLT_INT,
&ind_id, &alen_id, &rcode_id, 0, NULL, OCI_DEFAULT);
上面灰色背景的部分,就是綁定占位符名稱的示例,函數通過這個名稱在SQL語句文本中進行匹配。
綁定函數有位置綁定和名稱綁定兩個函數,但是定義函數只有位置定義一個函數,這一點要注意。
前面我們在查詢語句返回結果集時用到了OCIStmtFetch()函數,這個函數在11g之后被廢棄掉了,代替它的是OCIStmtFetch2()函數,讓程序員能更好的控制怎樣獲取結果集中的數據。
sword OCIStmtFetch2 ( OCIStmt *stmthp,
OCIError *errhp,
ub4 nrows,
ub2 orientation,
sb4 fetchOffset,
ub4 mode );
參數stmthp,errhp,nrows,mode跟OCIStmtFetch()中的一樣,不同的是下面兩個參數。
orientation,取數據的方向,現在有了更多的選擇。
OCI_DEFAULT - 與OCI_FETCH_NEXT一樣,作為缺省值。
OCI_FETCH_CURRENT - 獲取當前行的數據。
OCI_FETCH_NEXT - 獲取當前行的下一條數據。
OCI_FETCH_FIRST - 取結果集中的第一條數據。
OCI_FETCH_LAST - 取結果集中的最后一條數據。
OCI_FETCH_PRIOR - 取當前行的上一條數據。
OCI_FETCH_ABSOLUTE - 獲取fetchOffset參數指定行號的那條數據。
OCI_FETCH_RELATIVE - 獲取fetchOffset參數指定的相對于當前行的那行數據。
fetchOffset是一個新增加的輸入參數,指定獲取數據的偏移量,也就是行號。上面參數中取絕對數據時,fetchOffset指定結果集中的數據絕對行號。上面參數中取相對數據時,fetchOffset指定結果集中相對當前行號的偏移量,比如fetchOffset=5,那么是當前行號加5后的行號,所在的數據。如果fetchOffset=-3,那么是當前行號減3后的行號,所在的數據,相當于當前行前面第三行的數據。
前幾節的例子中我們在表中插入一條數據后,要提交改變,相當于sqlplus中的commit命令。如果我們不想提交改變,怎樣放棄數據呢?在sqlplus中會用到rollback命令,那么在OCI中也有一個函數對應,叫做OCITransRollback()。看一下它的原型和參數。
sword OCITransRollback ( void *svchp,
OCIError *errhp,
ub4 flags );
svchp是一個輸入參數,服務上下文句柄。
errhp是一個輸入參數,錯誤句柄,返回錯誤碼和錯誤信息文本。
flags是一個輸入參數,唯一值為OCI_DEFAULT。
當調用OCI函數更改數據時(包括插入、更新、刪除,還有其他操作),如果沒有用OCITransCommit()函數顯式提交改變,而是直接斷開數據庫連接,那么Oracle不會回滾這些操作,而是做了隱式提交,改變已經記錄到了數據庫中,所以在斷開數據庫前有不確定的數據改變,要用OCITransRollback()函數把改變回滾回來。

浙公網安備 33010602011771號