1. 程式人生 > >ORACLE遊標概念講解

ORACLE遊標概念講解

7,怎樣更新和刪除顯示遊標中的記錄?
 ①UPDATE或DELETE語句中的WHERE CURRENT OF子串專門處理要執行UPDATE或DELETE操作的表中取出的最近的資料。
  要使用這個方法,在宣告遊標時必須使用FOR UPDATE子串,當對話使用FOR UPDATE子串開啟一個遊標時,
  所有返回集中的資料行都將處於行級(ROW-LEVEL)獨佔式鎖定,其他物件只能查詢這些資料行,
  不能進行UPDATE、DELETE或SELECT...FOR UPDATE操作。
   在多表查詢中,使用OF子句來鎖定特定的表,如果忽略了OF子句,那麼所有表中選擇的資料行都將被鎖定。
   如果這些資料行已經被其他會話鎖定,那麼正常情況下ORACLE將等待,直到資料行解鎖。
 ②使用更新或刪除:
  ⑴宣告更新或刪除顯示遊標:
   Cursor 遊標名 IS  SELECT 語句   For Update [ Of  更新列列名];
   Cursor 遊標名 IS  SELECT 語句   For Delete [ Of  更新列列名];
  ⑵使用顯示遊標當前記錄來更新或刪除:
   Update  表名   SET   更新語句  Where   Current  Of   遊標名;
   Delete  From  表名   Where   Current  Of   遊標名;
 
   例子1:更新顯示遊標記錄
   /*conn scott/tiger*/
   Declare
     Cursor myCur is select job from emp for update;
       vjob empa.job%type;
       rsal empa.sal%type;
    Begin
       open myCur;
       loop
          fetch myCur into vjob;
          exit when myCur%notFound;
          case  (vjob)
             when 'ANALYST' then  rsal := 0.1;
            when  'CLERK' then  rsal := 0.2;
             when  'MANAGER' then  rsal := 0.3;
             else
               rsal := 0.5;
          end case;
        update emp set sal = sal + rsal where current of myCur;
       end loop;
    End;
    /
    例子2:刪除顯示遊標記錄
    /*conn scott/tiger
    Crate table  empa  Select * from scott.emp;
    */
    Declare
      Cursor MyCursor  Select   JOB  From  empa  For  Update;
      vSal   emp.Sal%TYPE;
    Begin
      Loop
       Fetch  MyCursor  InTo  vSal;
       Exit  When  MyCursor%NotFound;
       If   vSal < 800 Then
        Delete  From empa  Where  Cursor  Of   MyCursor;
       End  If;   
      End    Loop;
    End;/
8,什麼是帶引數的顯示遊標?

 ①與過程和函式相似,可以將引數傳遞給遊標並在查詢中使用。
  引數只定義資料型別,沒有大小(所有Oracle中的形參只定義資料型別,不指定大小)。
  與過程不同的是,遊標只能接受傳遞的值,而不能返回值。
   可以給引數設定一個預設值,當沒有引數值傳遞給遊標時,就使用預設值。
  遊標中定義的引數只是一個佔位符,在別處引用該引數不一定可靠。
 ②使用帶引數的顯示遊標
  ⑴宣告帶引數的顯示遊標:
   CURSOR 遊標名  [(parameter[,parameter],...)]    IS   Select語句;;
   
   引數形式:1,引數名   資料型別  
       2,引數名   資料型別  DEFAULT  預設值
       
   例子: 
    /*conn scott/tiger
    Crate table  empa  Select * from scott.emp;
    */
    Declare
      Cursor MyCursor(pSal  Number  Default   800)  Select   JOB  From  empa Where  SAL >  pSal ;
      varA  MyCursor%ROWTYPE;
    Begin
      Loop
       Fetch  MyCursor  InTo  varA;
       Exit  When  MyCursor%NotFound;
       DBMS_OUTPUT.PUT_LINE(MyCursor%RowCount||'    '||varA.empno||'    '||varA.ename||'  '||varA.sal);  
      End    Loop;
    End;/