oracle觸發器select into和cursor用法的區別


http://moonsoft.bokee.com/4242018.html

PL/SQL 中的select ..into.. 以及 游標(Cursor)

                                     

Select  empno, ename  from emp;返回的是多於一條數據, 這個是肯定的.但是我們聲明兩個變量來依次獲得每條數據的話, 我們只能獲得一條記錄,因為他們不是數組.

這種不匹配的現象在電子線路中類似於阻抗不匹配.

 

如果只是檢索一條數據,那么我們可以用

declare

   var_empno number(10);

   var_ename varchar2(32);

begin

   select empno , ename into var_empno, var_ename

   from emp

   where empno=7369;

   DBMS_output.put_line(var_empno);

   DBMS_output.put_line(var_ename);

end;

/

 

這是很簡單地檢索一條數據的方法.

 

但是我們稍微改一下:

declare

   var_empno number(10);

   var_ename varchar2(32);

begin

   select empno , ename into var_empno, var_ename

   from emp;

   DBMS_output.put_line(var_empno);

   DBMS_output.put_line(var_ename);

end;

/

這樣就會引發異常:-1422

如果再該一下,檢索不到數據就回得到100的異常代碼.

 

當然我們可以處理這些異常

When

Condition

Then

Do somethings;

 

但是如果我們要檢索多行數據的每一條數據, 那么單單用

Select * from table; 是不行的.

這里我們就需要用游標.

一個很好的比喻是每次取一點冰塊的故事.游標cursor 相當於一個指針,這里沒有指向內存,而是指向了一個每次能夠取得一條記錄的select 語句.

 

一個在form 里寫的post_query(顯示完所有的item 進行的)觸發:

declare

            CURSOR a IS select dname from dept where deptno=:emp.deptno;

            a_var varchar2(32);

begin

            open a ;

            fetch a into a_var;

            :emp.department_name:=a_var;

            if a%notfound then

                        :emp.department_name:='error';

                        end if;

            close a;

end;

 

聲明不用說了,要先打開,執行,關閉.

游標的屬性

Cursor%notfound

Cursor%found

 

具體可以查閱pl/sqlapi , such as : Knowledge Xpert for PLSQL

這兩個屬性代表找到/找不到, 是個boolean ,所有我們可以用if來判斷.

 

關於游標里的局部變量:

a_var varchar2(32);

 

要知道table所查出的欄位的數據類型, 我們可以讓oracle 自己去查到這個類型,

a%rowtype.寫法比較獨特.

 

我們可以理解成select into 是一種隱式cursor

 

以上只是基本的了解.以后寫程序的時候需要進一步理解.

作者: 理性的浪漫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM