程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle的循環和Corsor

Oracle的循環和Corsor

編輯:Oracle教程

Oracle的循環和Corsor


   這兩天啊有一個心的業務,是需要如果我批量修改數據的話,那麼另一張表的數據也需要修改,也是多條的修改,發現這個問題的時候,自然而然的想到了觸發器,但是以前都是簡單的單條語句的跟新,沒有過整個表的去做一個觸發器,今天學習了一下數據庫中的循環,這裡寫一下。
    在寫觸發器的時候用到了一個循環和一個Cursor,觸發器如下:
CREATE OR REPLACE TRIGGER trg_test
  before update
  ON cm_bogie_inandoutreport 
  DECLARE
    //定義游標,查找表裡邊的每一列的值
         cursor c_bogie is select s_bureaunumno c_b_bureaunumno,
         s_serialnum  c_b_serialnum,
             s_trainsetid c_b_trainsetid 
             from cm_bogie_inandoutreport;

  BEGIN
             //循環賦值
             for v_record in c_bogie loop
                 update test_mhb t
                 set t.s_id=v_record.c_b_bureaunumno
                 where t.s_sex = v_record.c_b_bureaunumno;
                 dbms_output.put_line(c_b_bureaunumno);
             end loop;
  END trg_test;

循環
一般循環大概分為三種:基本循環(loop),WHILE循環, FOR循環

1.基本循環

LOOP 

         statement1; 

         ...... 

          EXIT [WHEN condition]; 

END LOOP; 

當使用基本循環時,無論是否滿足條件,語句至少會被執行一次,當condition為TRUE時,會退出循環,並執行END LOOP後的相應操作。當編寫基本循環時一定要包含EXIT語句,否則會陷入死循環。另外還應該定義循環控制變量,並且在循環體內修改循環控制變量的值。示例:

SQL> declare
    i int:=1;
    begin
    loop
    insert into testloop values(i);
    exit when i=10;
    i:=i+1;
    end loop;
    end;

2.WHILE循環

基本循環至少要執行一次循環體內的語句,而對於WHILE循環來說,只有條件為TRUE時,才會執行循環體內的語句。WHILE循環以WHILE …LOOP開始,以END LOOP結束。

WHILE condition LOOP 

           statement1; 

           statement2; 

           ..... 

END LOOP; 

當condition為TRUE時,執行循環體內的語句,而當condition為FALSE或NULL時,會退出循環,並執行END LOOP後的語句。當使用WHILE循環時,應該定義循環控制變量,並在循環體內改變循環控制變量的值。示例:

SQL> declare
    i int:=1;
    begin
    while i<=10 loop
    insert into testloop values(i);
    i:=i+1;
    end loop;
    end; 

3.FOR循環

當使用基本循環或WHILE循環時,需要定義循環控制變量,並且循環控制變量不僅可以使用NUMBER類型,也可以使用其他數據類型。當使用FOR循環時,ORACLE會隱含定義循環控制變量。

FOR counter in [REVERSE] lower_bound. .upper_bound LOOP 

         statement1; 

         statement2; 

         ....... 

END LOOP; 

在我們查詢的時候是用select和into一起使用,把select的內容放到into裡邊,而cursor給我們提供了一個便利,那麼問題來了
什麼是游標?
①從表中檢索出結果集,從中每次指向一條記錄進行交互的機制。

②關系數據庫中的操作是在完整的行集合上執行的。
由 SELECT 語句返回的行集合包括滿足該語句的 WHERE 子句所列條件的所有行。由該語句返回完整的行集合叫做結果集。
應用程序,尤其是互動和在線應用程序,把完整的結果集作為一個單元處理並不總是有效的。
這些應用程序需要一種機制來一次處理一行或連續的幾行。而游標是對提供這一機制的結果集的擴展。

 游標是通過游標庫來實現的。游標庫是常常作為數據庫系統或數據訪問 API 的一部分而得以實現的軟件,
 用來管理從數據源返回的數據的屬性(結果集)。這些屬性包括並發管理、在結果集中的位置、返回的行數,
 以及是否能夠在結果集中向前和/或向後移動(可滾動性)。

 游標跟蹤結果集中的位置,並允許對結果集逐行執行多個操作,在這個過程中可能返回至原始表,也可能不返回至原始表。
 換句話說,游標從概念上講基於數據庫的表返回結果集。
 由於它指示結果集中的當前位置 ,就像計算機屏幕上的光標指示當前位置一樣,“游標”由此得名。

2,游標有什麼作用?
①指定結果集中特定行的位置。
②基於當前的結果集位置檢索一行或連續的幾行。
③在結果集的當前位置修改行中的數據。
④對其他用戶所做的數據更改定義不同的敏感性級別。
⑤可以以編程的方式訪問數據庫。
3、游標怎麼用

例子1:
  /* conn scott/tiger */
   Declare
     Cursor myCur is select empno,ename,sal from emp;
     vna varchar2(10);
     vno number(4);
     vsal number(7,2);
  Begin
     open myCur;
     fetch myCur into vno,vna,vsal;
     dbms_output.put_line(vno||'    '||vna||'    '||vsal);
     close myCur;
  End;
  /

 例子2:使用loop遍歷游標。
 /* conn scott/tiger */
  Declare
     Cursor myCur is select ename,job,sal,empno from emp;
     varE myCur%rowType;
  Begin
     if myCur%isopen = false then
        open myCur;
       dbms_output.put_line('Opening...');
     end if;
     loop
        fetch myCur into varE;
        exit when myCur%notfound; 
        dbms_output.put_line(myCur%rowCount||'    '||vare.empno||'    '||vare.ename||'    '||vare.sal);
     end loop;
     if myCur%isopen then
        Close myCur;
        dbms_output.put_line('Closing...');
     end if;
  End;
   其實游標還是挺好用的,就和Select 。。。into...一樣,游標大家把他當作是一個表就可以,只不過這個游標還是指向咱們查詢出來表的第一行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved