在oracle中執行select、update、insert、delete等操做時,oracle會在內存中爲其分配上下文,即開闢一小塊數據緩衝區,用於將查詢到的結果集緩存起來。遊標就是指向這個緩衝區的指針,便於進行逐行定位處理。遊標使用完成後要及時關閉。sql
顯式遊標:顯示遊標指定遊標的名字,調用方式:遊標名+屬性緩存
隱式遊標:沒有名字,執行select、update、delete、insert操做時,會自動觸發隱士遊標,調用方式:sql+屬性oracle
遊標名%found 判斷遊標中是否讀到數據oop
遊標名%notfound 判斷遊標中是否沒有讀到數據fetch
遊標名%isopen 判斷遊標是否打開spa
遊標名%rowcount 獲取遊標中實際讀取的行的數量指針
遊標處理數據的效率較低,非必要狀況,不建議使用code
1.建立遊標blog
declare --1. 定義遊標 -- cursor 遊標名 is 查詢命令 cursor cur_emp is select empno,ename,job from emp where empno=7369; row1 emp.empno%type; row2 emp.ename%type; row3 emp.job%type; begin --2. 打開遊標 open 遊標名 open cur_emp; --3. 提取數據 fetch 遊標名 into 變量1,變量2,... fetch cur_emp into row1,row2,row3; dbms_output.put_line(row1); dbms_output.put_line(row2); dbms_output.put_line(row3); --4. 關閉遊標 close 遊標名 close cur_emp; end;
declare cursor emp_cur is select * from emp; row1 emp%rowtype; begin -- 當遊標中有多個數據時,使用循環來提取數據 open emp_cur; loop fetch emp_cur into row1; exit when emp_cur%notfound; dbms_output.put_line(emp_cur%rowcount||'--'||row1.empno||':'||row1.ename); end loop; close emp_cur; end;
-- 帶參數的遊標 declare -- 定義帶參數的遊標,在命令中使用參數 cursor cur_emp(no emp.empno%type) is select * from emp where empno=no; row1 emp%rowtype; begin -- 打開遊標傳參 open cur_emp(7369); -- 提取數據 fetch cur_emp into row1; dbms_output.put_line(row1.ename||row1.job); -- 關閉遊標 close cur_emp; end;
-- 將數據讀到表格中 declare -- 定義表格類型 type emp_table is table of emp%rowtype index by binary_integer ; -- 聲明表格變量 v_emp emp_table; -- 聲明遊標 cursor cur_emp is select * from emp; begin -- 打開遊標 open cur_emp; -- 提取遊標內數據到表格,使用bulk collect into 關鍵字,批量插入到表格中 fetch cur_emp bulk collect into v_emp; -- 使用循環來讀取表中數據 for i in v_emp.first..v_emp.LAST loop dbms_output.put_line(v_emp(i).ename||':'||v_emp(i).job); end loop; end;
-- 遊標類型的變量,存儲過程當中看成參數使用 create or replace procedure pro4( cur sys_refcursor )as row1 emp%rowtype; begin loop fetch cur into row1; exit when cur%notfound; dbms_output.put_line(row1.ename); end loop; end; declare type cur_type is ref cursor ; emp_cur cur_type; begin open emp_cur for select * from emp; pro4(emp_cur); close emp_cur; end;
declare cursor emp_cur is select * from emp; begin for i in emp_cur loop dbms_output.put_line(i.ename); end loop; end;
declare begin update emp set ename = 'lisi' where empno=7369; if sql%found then dbms_output.put_line('更新了數據'); end if; end;
-- sys refcursor 系統遊標變量 create or replace procedure pro5(cur out sys_refcursor) as begin open cur for select * from emp; end; declare cur sys_refcursor; row1 emp%rowtype; begin pro5(cur); loop -- 在存儲過程當中,給系統遊標賦值,在這裏直接就能夠調用不用再次賦值 fetch cur into row1; exit when cur%notfound; dbms_output.put_line(row1.ename); end loop; close cur; end;