Oracle動態遊標

zhenghaishu發表於2014-08-10
Oracle動態遊標

(一)強型別動態遊標
1 定義
強型別動態遊標是指,在遊標使用之前,雖未指定遊標的查詢定義,但是遊標的型別已經確定。

2 語法
type 遊標型別 is ref cursor return 記錄型別

3 應用場景、
使用者想在表dept中檢視Beijing這一城市的具體資訊。如果表中沒有Beijing的記錄資訊,則使用者希望能夠檢視所有城市的資訊。

程式:
begin
  declare
  type ref_deptrow is ref cursor return dept%rowtype; /*強型別動態遊標宣告*/
  c_count number;
  deptrow dept%rowtype;
  cur_deptrow ref_deptrow;

  begin
    select count(*) into c_count from dept where loc = 'Beijing';
    if c_count = 0 then
      open cur_deptrow for select * from dept;
    else
      open cur_deptrow for select * from dept where loc = 'Beijing';
    end if;
 
    fetch cur_deptrow into deptrow;
    while cur_deptrow%found loop
      dbms_output.put_line(deptrow.deptno || ':' || deptrow.dname || ':' || deptrow.loc);
      fetch cur_deptrow into deptrow;
    end loop;
  end;
 
end;
/

執行結果:
10:ACCOUNTING:NEW YORK
20:RESEARCH:DALLAS
30:SALES:CHICAGO
40:OPERATIONS:BOSTON

PL/SQL procedure successfully completed.


(三)弱型別動態遊標
1 定義
弱型別動態遊標指的是在遊標使用之前,遊標的型別無法具體確定,要等到程式執行時,才能確定遊標的型別。與強型別動態遊標相比,弱型別動態遊標沒有返回型別。

2 語法
type 遊標型別 is ref cursor

3 應用場景
使用者想要在表emp查詢deptno為40的部門資訊,若查不到則想在表dept中繼續查詢。
程式:
begin
  declare
  type ref_tablerow is ref cursor;      
  c_count number;    
  emprow emp%rowtype;                             
  deptrow dept%rowtype;             
  cur_tablerow ref_tablerow;
 
  begin
    select count(*) into c_count from emp where deptno = 40;

    if c_count = 0 then
      open cur_tablerow for select * from dept where deptno = 40;
      fetch cur_tablerow into deptrow;
      while cur_tablerow%found loop
        dbms_output.put_line(deptrow.deptno || ':' ||
                 deptrow.dname || ':' ||
                 deptrow.loc);
        fetch cur_tablerow into deptrow;
      end loop;
    else
      open cur_tablerow for select * from emp where deptno = 40;
      fetch cur_tablerow into emprow;
      while cur_tablerow%found loop
        dbms_output.put_line(emprow.deptno || ':' ||
                 emprow.empno || ':' ||
                 emprow.ename);
        fetch cur_tablerow into deptrow;
      end loop;
    end if;

  end;

end;
/

執行結果:
40:OPERATIONS:BOSTON

PL/SQL procedure successfully completed.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29485627/viewspace-1248672/,如需轉載,請註明出處,否則將追究法律責任。

相關文章