轉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/sql的api , such as : Knowledge Xpert for PLSQL
這兩個屬性代表找到/找不到, 是個boolean 值,所有我們可以用if來判斷.
關於游標里的局部變量:
a_var varchar2(32);
要知道table所查出的欄位的數據類型, 我們可以讓oracle 自己去查到這個類型,用
a%rowtype.寫法比較獨特.
我們可以理解成select into 是一種隱式cursor
以上只是基本的了解.以后寫程序的時候需要進一步理解.
作者: 理性的浪漫