Oracle遊標的用法

----------------------隱式遊標 %isopen , %notfound , %found
定義遊標
declare
begin
 ........
end;

定義:隱式遊標則由則由系統自動定義,非顯示定義遊標的DML語句即被賦予隱式遊標屬性。其過程由oracle控制,完全自動化。隱式遊標的名稱是SQL,不能對SQL遊標顯式地執行
OPEN,FETCH,CLOSE語句。

屬性:類似於顯示遊標,隱式遊標同樣具有四種屬性,只不過隱式遊標以SQL%開頭,而顯示遊標以Cursor_name%開頭。通過SQL%總是隻能訪問前一個DML操作或單行SELECT操作的遊標屬性,用於判斷DML執行的狀態和結果,進而控制程序的流程。       

        屬性一:SQL%ISOPEN  
            遊標是否打開。當執行select into ,insert update,delete時,Oracle會隱含地打開遊標,且在該語句執行完畢或隱含地關閉
            遊標,因爲是隱式遊標,故SQL%isopen----總是false

        屬性二:SQL%FOUND
            判斷SQL語句是否成功執行。當有作用行時則成功執行爲true,否則爲false。   

        屬性三:SQL%NOTFOUND   
            判斷SQL語句是否成功執行。當有作用行時否其值爲false,否則其值爲true。

        屬性四:SQL%ROWCOUNT  
            在執行任何DML語句之前,SQL%ROWCOUNT的值都是NULL,對於SELECT INTO語句,如果執行成功,SQL%ROWCOUNT的值爲,如果沒有
 
            成功,SQL%ROWCOUNT的值爲,同時產生一個異常NO_DATA_FOUND。


declare
begin
     if sql%isopen then
        dbms_output.put_line('遊標已打開');
     else
        dbms_output.put_line('遊標未打開');--輸入此條,因爲是隱式的,所以總是未打開
     end if;
end;

declare
begin
     update emp set sal=1000;
     dbms_output.put_line('你已經處理了'||sql%rowcount||'條數據');
end;
-----------notfound的用法
declare
begin
     update emp set sal=1000;
     if sql%notfound then
        dbms_output.put_line('遊標未找到');
     else
         dbms_output.put_line('遊標已找到');--輸出此條
     end if;
end;
-----------found的用法
declare
begin
     update emp set sal=1000;
     if sql%found then
        dbms_output.put_line('遊標找到');--輸出此條
     else
         dbms_output.put_line('遊標未找到');
     end if;
end;

--------注:
當進行update,delete,insert操作的時候就要用到隱式遊標
declare
begin
     update emp set sal=1000;--修改
     if sql%found then
        dbms_output.put_line('修改成功');
     end if;
end;

declare
begin
     update emp set sal=1000 where empno=7369;
     if sql%found then
        dbms_output.put_line('遊標已打開');
     else
         dbms_output.put_line('遊標未打開');
     end if;
end;

select* from emp;


------------------------------------普通遊標(帶參數和不帶參數)

循環遊標用loop....end loop


--1。顯示所有員工信息(不帶參數)
declare
       cursor mycur is select * from emp;
       myemp emp%rowtype;
begin
     open mycur;
          loop
              fetch mycur into myemp;
              exit when mycur%notfound;
              dbms_output.put_line('員工編號:'||myemp.empno||'   員工姓名:'||myemp.ename||'員工工資:'||myemp.sal);
          end loop;
     close mycur;
end;


--2。輸入部門編號,顯示該部門員工的詳細信息(帶參數)
declare
       cursor mycur(myno emp.deptno%type) is select * from emp where deptno=myno;
       myemp emp%rowtype;
       mydeptno emp.deptno%type;--所要接的參數      
begin
     mydeptno:=&請輸入員工編號;
     open mycur(mydeptno);
          loop
              fetch mycur into myemp;
              exit when mycur%notfound;
                   dbms_output.put_line('員工編號:'||myemp.empno||'   員工姓名:'||myemp.ename||'員工工資:'||myemp.sal||'部門編號:'||myemp.deptno);
          end loop;
     close mycur;
end;

----------------------------------循環遊標
--1。顯示所有員工信息
declare
       cursor mycur is select * from emp;
begin
     for i in mycur
         loop
              dbms_output.put_line('員工編號:'||i.empno||'   員工姓名:'||i.ename||'員工工資:'||i.sal);
         end loop;
end;

 

--------------------------------------用遊標批量更新數據
declare
       cursor mycur is select sal from emp for update;
       mysal emp.sal%type;
begin
     open mycur;
          loop
              fetch mycur into mysal;
              exit when mycur%notfound;
                   mysal:=mysal*2;
                   update emp set sal=mysal where current of mycur;
          end loop;
     close mycur;
end;

select * from emp;


-----------------------------------引用遊標
declare
       mychar char(10);
       type mycur is ref cursor;
       mpp mycur;
       myemp emp%rowtype;
begin
     mychar:=&請輸入一個字符;
     if mychar='a'then
        open mpp for select * from emp where deptno=10;
             loop
                 fetch mpp into myemp;
                 exit when mpp%notfound;
                      dbms_output.put_line('員工編號:'||myemp.empno||'員工姓名:'||myemp.ename||'部門編號:'||myemp.deptno);
             end loop;
     elsif mychar='b' then
         open mpp for select * from emp where deptno=20;
           loop
               fetch mpp into myemp;
               exit when mpp%notfound;
                    dbms_output.put_line('員工編號:'||myemp.empno||'員工姓名:'||myemp.ename||'部門編號:'||myemp.deptno);
           end loop;
     else
         open mpp for select * from emp where deptno=30;
                 loop
                     fetch mpp into myemp;
                     exit when mpp%notfound;
                          dbms_output.put_line('員工編號:'||myemp.empno||'員工姓名:'||myemp.ename||'部門編號:'||myemp.deptno);
                 end loop;
     end if;
end;


最後,歡迎訪問風格清新簡潔的輕博客網站[指尖一刻]

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