生活随笔
收集整理的這篇文章主要介紹了
13、oracle数据库下的游标
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ORACLE下的游標操作
游標是sql的一個內存工作區,由系統或者用戶以變量的形式定義。游標的作用是用于臨時存儲從數據庫中提取的數據塊。游標有靜態游標、動態游標之分,靜態游標又可分為隱式游標和顯式游標。靜態游標是在編譯時期就決定了結果集的,不能傳遞參數,而動態游標是可以通過在運行期間傳遞參數來獲取數據結果集的。
游標的屬性如下:
隱式游標的屬性
SQL%ROWCOUNT(整型)
代表dml語句成功執行的數據行數
SQL%FOUND(布爾值)
判斷增刪改查操作是否操作成功
SQL%NOTFOUND(布爾值)
判斷增刪改查操作是否操作成功
SQL%ISOPEN(布爾值)
DML語句在執行過程中為真,結束后為假
?
1.隱式游標
隱式游標是數據庫系統自動打開和關閉的,不需要控制,一次只能獲取一條數據,例如使用select(查詢記錄數),update,insert,delete等語句時。隱式游標一般用于根據操作語句對應的游標屬性來了解操作的狀態和結果,從而達到流程的控制。
接下來介紹一下隱式游標的使用
-- 判斷update是否執行成功,成功則提交事務
BEGIN ????UPDATE person SET name='zhangsan'; where id=1 ????IF SQL%FOUND THEN ???????COMMIT; ???????dbms_output.put_line('success'); ????ELSE ???????dbms_output.put_line('failed'); ????END IF END; -- 判斷影響的行數 DECLARE ? ? rowCount INT;
BEGIN ? ? UPDATE person SET name='aaa'; ? ? rowRount:=SQL%ROWCOUNT;
? ? dbms_output.put_line('rowRount='|| rowRount); END;
2.顯示游標
從數據庫中提取多行數據時要放到顯式游標中存儲。使用顯示游標大致分為五步,使用CURSOR定義顯示游標如下:
1、定義游標
Cursor cursor_name IS
2、打開游標
OPEN cursor_name
3、操作游標
FETCH cursor_name INTO somVar
4、判斷游標是否獲取到行值
cursor_name%NOTFOUND;
5、關閉游標
CLOSE cursor_name
看一個具體的實例
將一個表中的數據放到兩個數據表中 DECLARE ????t_id int; ????t_name varchar2; ????t_sex char(1); --定義游標 CURSOR teacher_cur IS SELECT tid,name,sex FROM teacher WHERE tid<=26; BEGIN ????--打開游標 ????OPEN teacher_cur; ????LOOP ????--提取游標 ? ? ? ? FETCH teacher_cur INTO t_id, t_name,t_sex; ? ? ? ? --一定要退出循環 ? ? ? ? EXIT WHEN NOT teacher_cur%FOUND; ? ? ? ? IF teacher_sex='M' THEN ? ? ? ? ? ? ?一插入數據到表 ? ? ? ? ? ? ?COMMIT; ? ? ? ? ELSE ? ? -- 插入數據到表二 ? ? COMMIT; END IF; END LOOP; IF teacher_cur%ISOPEN THEN --關閉游標 CLOSE teacher_cur; END IF END;
3.動態游標
ref cursor(動態游標)是可以通過在運行期間傳遞參數來獲取數據結果集的,動態游標使用REF CURSOR進行定義。
DECLARE
? ? --指定動態游標類型 ? ? TYPE cursor_type IS REF CURSOR; ? ? myCursor cursor_type;--游標類型 ? ? v_sql VARCHAR2(200); ? ? v_person person%ROWTYPE; BEGIN ? ? --定義動態的sql語句 ? ? v_sql:='select * from person where pname LIKE ‘‘%m%’’'; ? ? --打開游標 ? ? OPEN myCursor FOR v_sql; ? ? LOOP ? ? ? ? ?--提取游標 ? ? ? ? ?FETCH myCursor INTO v_person; ? ? ? ? ?--停止循環 ? ? ? ? ?EXIT WHEN myCursor%NOTFOUND; ? ? ? ? ?dbms_output.put_line (v_person.id); ? ? ?END LOOP; ? ? ?EXCEPTION ? ? ? ? ?WHEN OTHERS THEN ? ? ? ? ?CLOSE myCursor; ? ? ?IF myCursor%ISOPEN THEN ? ? ? ? ?CLOSE myCursor; END IF; END;
總結
以上是生活随笔 為你收集整理的13、oracle数据库下的游标 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。