oracle學習筆記10:遊標

1.什麼是遊標

在oracle中執行select、update、insert、delete等操做時,oracle會在內存中爲其分配上下文,即開闢一小塊數據緩衝區,用於將查詢到的結果集緩存起來。遊標就是指向這個緩衝區的指針,便於進行逐行定位處理。遊標使用完成後要及時關閉。sql

2.遊標的分類

  顯式遊標:顯示遊標指定遊標的名字,調用方式:遊標名+屬性緩存

  隱式遊標:沒有名字,執行select、update、delete、insert操做時,會自動觸發隱士遊標,調用方式:sql+屬性oracle

3.遊標的屬性

  遊標名%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;

2.帶參數的遊標

-- 帶參數的遊標
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;

3.讀取數據到表格中

-- 將數據讀到表格中
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;

4.遊標類型的變量

-- 遊標類型的變量,存儲過程當中看成參數使用
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;

5.使用for簡化遊標的操做

declare
  cursor emp_cur is select * from emp;
  begin
  for i in emp_cur loop
    dbms_output.put_line(i.ename);
  end loop;
end;

隱式遊標(sql+屬性名):

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;
相關文章
相關標籤/搜索