Oracle的遊標使用

靜態遊標

顯示遊標


-- 顯示遊標的創建和使用(基本語法,步驟較多容易出錯 不推薦使用)
declare
  -- 聲明變量和遊標
  name varchar2(50);
  dept_name varchar2(20);
  cursor emp_cur is
  select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;
begin
  -- 打開遊標
  open emp_cur;
  --循環提取遊標
  loop
    fetch emp_cur into name,dept_name;
    exit when emp_cur%notfound;
    dbms_output.put_line(name||' 在 '||dept_name);
  end loop;
  --關閉遊標
  close emp_cur;
end;


-- 實例:根據員工的入職年限爲員工加薪,每超過一年加100 最高加1000
declare
  -- 聲明變量和遊標
  hire_date date;--入職時間
  e_id number;--員工ID
  cursor emp_cur is
  select empno,hiredate from emp;
begin
  -- 打開遊標
  open emp_cur;
  --循環提取遊標
  loop
    fetch emp_cur into e_id,hire_date;
    exit when emp_cur%notfound;
    if 100*(2013-to_char(hire_date,'yyyy'))<1000 then
      update emp set sal=sal+100*(2013-to_char(hire_date,'yyyy')) where empno=e_id;
    else
      update emp set sal=sal+1000 where empno=e_id;

    end if;
  end loop;
  --關閉遊標
  close emp_cur;
end;


此外 使用循環遊標可以簡化遊標的讀取(推薦使用)

declare
cursor emp_cur is
select e.ename,d.dname from emp e,dept d
where e.deptno=d.deptno;

begin
  for emp_record in emp_cur loop    --注意 這裏的emp_record 在For循環中是自動匹配遊標類型的,如果不在For循環裏面 需要先聲明!
    dbms_output.put_line(
    emp_record.ename||'在'|| emp_record.dname);
    end loop;
end;



隱式遊標



使用時前面要加上SQL%

sql%rowcount 常用於判斷insert  update  delete語句是否操作成功 如果成功遊標返回1;

declare
 name varchar2(50);
 dept_name varchar2(20);

begin
  select e.ename,d.dname into name,dept_name from emp e,dept d
  where e.deptno=d.deptno and empno=7890;
  dbms_output.put_line(sql%rowcount);    --注意  這裏使用的隱式遊標一定要在commit之前讀取
  commit;

end;



REF動態遊標

動態遊標可以與不同的語句關聯,用於處理多行的查詢結果集

打開遊標時綁定 是REF類型

通常用在查詢語句需要運行時動態確定的情況

——強類型動態遊標使用方法

declare
 type refcur_t is ref cursor    ——定義遊標類型(強類型)
 return emp%rowtype;

 refcur refcur_t;           ——用遊標類型聲明遊標
 v_emp emp%rowtype;   ——定義變量

begin
  open refcur for
  select * from emp;
 
  loop
    fetch refcur into v_emp;
    exit when refcur%notfound;
    dbms_output.put_line(refcur%rowcount||' '||v_emp.ename);  ——輸出行號和員工姓名
  end loop;
  close refcur;
end;


——弱類型動態遊標使用方法


declare
 type refcur_t is ref cursor;  ——①定義遊標類型。因爲沒有return類型,因此變量不能聲明爲表類型 只能單獨定義
 refcur refcur_t;   ——聲明遊標
 e_name varchar2(50);
 id number;

begin
  open refcur for
  select empno,ename from emp;——查詢時要查具體的列
  fetch refcur into id,e_name;
  while refcur%found loop    ——循環提取遊標信息
    dbms_output.put_line('#'||id||':'||e_name);
    fetch refcur into id,e_name;
  end loop;

  close refcur;
end;

——弱類型動態遊標使用實例  根據用戶輸入得到信息

declare

 type refcur_t is ref cursor;
 refcur refcur_t;
 e_name varchar2(50);
 id number;
 selection varchar2(1):=upper(substr('&tab',1,1));--獲得用戶的輸入,截取第一個字符

begin
  if selection='E' then  --如果用戶輸入E,那麼打開遊標關聯查詢僱員表
    open refcur for
    select empno,ename from emp;
    dbms_output.put_line('********僱員信息********');
  elsif selection='D' then  --如果用戶輸入D,那麼打開遊標關聯查詢部門表
    open refcur for
    select deptno,dname from dept;
    dbms_output.put_line('********部門信息********');
  else
    dbms_output.put_line('請輸入僱員信息(E)或部門信息(D)');
    return;
  end if;
  fetch refcur into id,e_name;  --循環提取遊標信息
  while refcur%found loop
    dbms_output.put_line('#'||id||':'||e_name);
    fetch refcur into id,e_name;
  end loop;
  close refcur;
end;

發佈了14 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章