Oracle中游標的使用

總結一下游標的使用

/********************************遊標***********
遊標特點:通過循環來處理多條數據,每次處理一條
遊標分類:靜態遊標和引用遊標(動態遊標)
靜態遊標:隱式遊標和顯示遊標
顯示遊標:普通遊標 帶參數的遊標 循環遊標
引用遊標:弱類型遊標和強類型遊標
遊標的4個屬性:
isopen 表示:遊標是否打開
rowcount 表示  遊標影響數據條數
found / notfound 表示:遊標當前數據行的數據是否有效
對於隱式遊標訪問屬性: sql%
*********************************************************/

----隱式遊標
begin
    dbms_output.put_line('遊標影響數據行數:' || sql%rowcount);
    update emp set sal=1000 where deptno=10;
    if (sql%isopen) then
        dbms_output.put_line('open');
    else
            dbms_output.put_line('close');
    end if;
     dbms_output.put_line('遊標影響數據行數:' || sql%rowcount);
end;


---顯示遊標(必須在使用前定義)
/***********************
遊標操作步驟:
1.定義遊標
2.打開遊標
3.讀取遊標保存數據到變量
4.關閉遊標

普通遊標語法:
declare
    ---定義遊標
    cursor 遊標名稱 is 查詢語句;(確定遊標處理數據範圍[行與列])
begin
    ---打開遊標
    open 遊標名稱;
    ---通過循環對遊標進行訪問
    loop
        fetch 遊標名稱 into 變量
    end loop;
    ---關閉遊標
end;

**********************/

---顯示部門編號爲20所有員工的編號和姓名
declare
   ---定義遊標
   cursor mycur is select empno,ename from emp where deptno=20;
   ---編號
   myempno emp.empno%type;
   --姓名
   myename emp.ename%type;
begin
    ---打開遊標
    open mycur;
    ---讀取遊標數據
    loop
          ---在讀取遊標,在保存變量的時候,字段與定義遊標字段一致
         fetch mycur into myempno,myename;
         exit when mycur%notfound;
         dbms_output.put_line('編號--'||myempno||'  姓名-'||myename);
    end loop;
    ---關閉遊標
    close mycur;
end;

----根據輸入部門編號,來顯示對應部門所有員工信息
----帶參數遊標
/**********************
語法:
declare
    cursor 遊標名稱(遊標參數列表) is 查詢語句
begin
   open 遊標名稱(遊標實際參數)
end;
*************************/

declare
    ---定義遊標
     cursor mycur(mydeptno emp.deptno%type) is select * from emp where

deptno=mydeptno;
     inputdeptno emp.deptno%type;
     emprow emp%rowtype;
begin
   inputdeptno := &請輸入部門編號;
   ---打開遊標,並 傳入參數
   open mycur(inputdeptno);
   loop
      fetch mycur into emprow;
      exit when mycur%notfound;
      dbms_output.put_line('編號--'|| emprow.empno
                                      || '  姓名--'||emprow.ename
                                      || '  工作'||emprow.job);
   end loop;
   --關閉遊標
   close mycur;
end;

/******************循環遊標**********************
語法:
delcare
    cursor 遊標名稱 is 查詢語句;
begin
    for 遊標變量  in 遊標名稱
    loop
       執行語句
    end loop;
end;
注意:在循環遊標中,不需要有打開遊標,關閉遊標
在循環遊標中,遊標變量是不需要聲明
***************************************************/

---顯示部門編號爲20員工信息
declare
   cursor mycur is select * from emp where deptno=20;
begin
    for emprow in mycur
    loop
             dbms_output.put_line('編號--'|| emprow.empno
                                      || '  姓名--'||emprow.ename
                                      || '  工作'||emprow.job);
    end loop;
end;


/******************************************
通過遊標修改數據(update,delete)
語法:
declare
    ---定義遊標
    cursor 遊標名稱 is 查詢語句 for update;---在定義遊標時候,要對處理數據進行鎖定
   
begin
    ----使用遊標修改數據
    update  table_name set 字段 where current of  遊標名稱;
    ---使用遊標刪除數據
     delete語句 where current of 遊標名稱;
end;
*****************************************/

-----根據輸入部門編號修改對應員工的工資爲2500
declare
   ---定義遊標
   cursor mycur(mydeptno emp.deptno%type) is select * from emp where

deptno=mydeptno for update; 
   inputdeptno emp.deptno%type;
begin
   inputdeptno :=&請輸入部門編號;
   for emprow in mycur(inputdeptno)
   loop
      ---對數據進行修改
      dbms_output.put_line('修改員工對應編號--'||emprow.empno);
      --update emp set sal=2500 where current of mycur;
      delete from emp where current of mycur;
      dbms_output.put_line('修改數據的條數:' || mycur%rowcount);
   end loop;
end;


----使用普通遊標修改部門編號爲20的員工信息
declare
  cursor mycur(mydeptno emp.deptno%type) is select * from emp where deptno=mydeptno

for update; 
  emprow emp%rowtype;
    inputdeptno emp.deptno%type;
begin
      inputdeptno :=&請輸入部門編號;
      open mycur(inputdeptno);
      loop
           fetch mycur into emprow;
           exit when mycur%notfound;
          dbms_output.put_line('修改員工對應編號--'||emprow.empno);
          update emp set sal=2500 where current of mycur;
      end loop;
      close mycur;
end;

 

/***********************引用遊標*******************
引用遊標:弱類型遊標和強類型遊標

弱類型遊標處理的語法:
declare
    ---定義遊標類型
    type 遊標類型 is ref cursor;
    ---定義對應遊標變量
    遊標變量的名稱 遊標類型;
begin
     --打開遊標(引用在打開遊標的時候,確定處理數據的行與列)
      open 遊標名稱 for 查詢語句;
end;
引用遊標注意:
1.在使用遊標之前,必須需要定義遊標類型。
2.在引用遊標中,不能使用循環遊標


---input
---當input=1 顯示部門編號爲10員工的姓名 工作
---當input=2顯示部門編號爲20員工的姓名 與 工資
***********************************/
declare
    ---定義遊標的類型
    type mycurtype is ref cursor;
    ---定義此類型的遊標變量
    mycur mycurtype;
    ---定義遊標變量
    myename emp.ename%type;
    myjob emp.job%type;
    mysal emp.sal%type;
    ---辨識
    input char(10);   
begin
    input := '&請輸入';
    if input = '1' then
       --顯示部門編號爲10員工的姓名 工作
       ---打開遊標
       open mycur for select ename,job from emp where deptno=10;
       loop
           fetch mycur into myename,myjob;
           exit when mycur%notfound;
           dbms_output.put_line('姓名:'||myename ||'    工作:'||myjob);
       end loop;
   else   
       --   顯示部門編號爲20員工的姓名 與 工資
       open mycur for select ename,sal from emp where deptno=20;
       loop
         fetch mycur into myename,mysal;
         exit when mycur%notfound;
         dbms_output.put_line('姓名:'||myename||'   薪水: '||mysal);
       end loop;
    end if;
    --- 關閉遊標
     close mycur;
end;

/*****************************
強類型遊標語法:
 declare
    ---定義遊標類型
    type 遊標類型 is ref cursor return 類型;
    ---定義對應遊標變量
    遊標變量的名稱 遊標類型;
begin
     --打開遊標(引用在打開遊標的時候,確定處理數據的行與列)
      open 遊標名稱 for 查詢語句;
end;
********************************/


--input
--input 的值1 顯示部門編號爲10 員工信息
---input的值2 顯示部門編號爲20員工信息

declare
   ---定義遊標類型
   type mycurtype is ref cursor return  emp%rowtype;
   ---定義遊標
   mycur mycurtype;
   --遊標變量
   emprow emp%rowtype;
   --辨識
   input char(10);
begin
    input := '&請輸入';
    if  input = '1' then
       open mycur for select * from emp where deptno=10;
    else
        open mycur for select * from emp where deptno=20;  
    end if;
    loop
        fetch mycur into emprow;
        exit when mycur%notfound;
        dbms_output.put_line('編號:'||emprow.empno||'    姓名:'||emprow.ename);
    end loop;
    ---關閉遊標
    close mycur;
end;

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章