游標 游標是sql的一個記憶體工作區,由系統或用戶以變數的形式定義,用於臨時存儲從資料庫中提取的數據塊。 游標分為顯式游標和隱式游標,可自定義顯式游標用來存儲多行多列的數據。 顯式游標一旦打開,就相當於執行了select語句,執行的結果集就存儲在游標中。 隱式游標 在進行DML操作和單行SELECT語 ...
游標
游標是sql的一個記憶體工作區,由系統或用戶以變數的形式定義,用於臨時存儲從資料庫中提取的數據塊。
游標分為顯式游標和隱式游標,可自定義顯式游標用來存儲多行多列的數據。
顯式游標一旦打開,就相當於執行了select語句,執行的結果集就存儲在游標中。
隱式游標
在進行DML操作和單行SELECT語句(select...into...)資料庫會自動使用隱式游標,可通過調用隱式游標變數直接取值,隱式游標只存儲單個數據。
四個隱式游標:
sql%rowcount:整型,用於記錄DML語句成功修改記錄的條數。
sql%found:布爾型,true表示crud的操作成功。
sql%notfount:布爾型,與sql%found屬性的值相反。
sql%isopen:布爾型,DML執行過程中為true,執行結束後為false。
顯式游標
使用步驟:
1.聲明游標
在declear聲明,
語法:
corsor 游標名[參數1 數據類型[,參數2 數據類型...]] is select語句;
2.打開游標
游標在使用前必須打開;
open 游標名[(參數1[,參數2.....])];--相當於執行is後面的select語句,並把查詢結果存入游標中。
3.提取數據
fetch 游標名 into 變數1[,變數2....];--取一條(row)數據到變數中,變數的個數和類型要和select語句中欄位變數的個數和類型一致。
游標打開後有一個指針指向數據區,fetch語句每一次返回一行的數據,每次執行完指針指向下一行。可通過迴圈實現返回多行數據,控制迴圈可通過游標的屬性%found和%notfount控制。
4.關閉游標
close 游標名;
游標關閉後占用的資源就被釋放,游標變為無效。
顯式游標必須手動關閉,顯式游標打開的數量有限制,預設為300,超過限制會報錯:ORA-01000: maximum open cursors exceeded
使用游標的屬性,在游標名後面帶上屬性以取得屬性的值。如:游標名%FOUND;
%FOUND:指針當前指向數據區有數據時為true,無數據為false;
%NOTFOUND:與%found相反,無數據為true;
%ISOPEN:當前游標已打開為true,未打開為false;
%ROWCOUNT:已從游標中取出的數據的行數;
游標變數(動態游標)ref cursor:
游標變數和普通游標基本相同,不同之處在於游標變數更加靈活,在聲明時不需要綁定查詢,並且游標變數沒有參數。
游標變數分為強類型和弱類型
強類型:列的數量和列的數據類型在定義游標變數時即定義好。
弱類型:定義游標變數時不定義列的數據的類型,在游標被打開時再確定每列的數據類型和列的數量,游標的列數量和列的數據類型一旦被確定不能再更改。
用法:
1.聲明動態游標類型
弱類型,不指定return type:type cur_type is ref cursor;
強類型,指定return type:type cur_type is ref cursor return 表名%rowtype;
2.聲明自定義的動態游標類型的變數:游標名 cur_type;
3.打開動態游標:open 游標名 for select語句;
4.獲取游標中的數據:fatch 游標名 into 變數1[,變數2....];
5.關閉游標:close 游標名;
使用動態游標的實例:
set serveroutput on declare type re_type is record( name varchar2(200) ); type ref_cursor is ref cursor return re_type; c1 ref_cursor; message varchar2(200); begin open c1 for select name from t_test; loop fetch c1 into message; exit when c1%notfound; dbms_output.put_line('第'||c1%rowcount||'個:'||message); end loop; close c1; end;
資料庫中關於游標的設置
1.查看Oracle游標最大打開數
show parameter cursor; --查看所有和curcor有關的參數,自帶like關鍵字
2.查看當前打開的游標
select * from v$open_cursor;
3.修改游標的最大打開數
alter system set open_cursors = 500 scope=both;--修改游標的最大打開數為500,
其中scope的取值為:
memory:僅修改記憶體,只會影響當前的使用,重啟資料庫就會失效。
spfile:僅修改配置文件,不會影響本次使用,重啟資料庫才生效。
both:兩個都修改。