Oracle中的游標和函式

2021-07-25 09:01:53 字數 3658 閱讀 6922

游標是一種 pl/sql 控制結構;可以對 sql 語句的處理進行顯示控制,便於對錶的行資料

逐條進行處理。 游標並不是乙個資料庫物件,只是存留在記憶體中。

操作步驟:

宣告游標

開啟游標

取出結果,此時的結果取出的是一行資料

關閉游標 到底那種型別可以把一行的資料都裝進來

此時使用 rowtype 型別,此型別表示可以把一行的資料都裝進來。 例如:查詢雇員編號為 7369 的資訊(肯定是一行資訊)。

例:查詢雇員編號為 7369 的資訊(肯定是一行資訊)。

declare

eno emp.empno%type ;

empinfo emp%rowtype ;

begin

eno := &en ;

select * into empinfo from emp where empno=eno ;

dbms_output.put_line('雇員編號:'||empinfo.empno) ;

dbms_output.put_line('雇員姓名:'||empinfo.ename) ;

end ;

使用 for 迴圈操作游標(比較常用)

declare

-- 宣告游標

cursor mycur is select * from emp where empno=-1;

empinfo emp%rowtype ;

cou number ;

begin

-- 游標操作使用迴圈,但是在操作之前必須先將游標開啟

for empinfo in mycur

loop

--rowcount 對游標所操作的行數進行記錄

cou := mycur%rowcount ;

dbms_output.put_line(cou||'雇員編號:'||empinfo.empno) ;

dbms_output.put_line(cou||'雇員姓名:'||empinfo.ename) ;

end loop ;

end ;

我們可以看到游標for迴圈確實很好的簡化了游標的開發,我們不在需要open、fetch和close語句,

不在需要用%found屬性檢測是否到最後一條記錄,這一切oracle隱式的幫我們完成了。  

編寫第乙個游標,輸出全部的資訊。

declare

-- 宣告游標

cursor mycur is select * from emp ; -- 相當於乙個list (emppo)

empinfo emp%rowtype ;

begin

-- 游標操作使用迴圈,但是在操作之前必須先將游標開啟

open mycur ;

-- 使游標向下一行

fetch mycur into empinfo ;

-- 判斷此行是否有資料被發現

while (mycur%found)

loop

dbms_output.put_line('雇員編號:'||empinfo.empno) ;

dbms_output.put_line('雇員姓名:'||empinfo.ename) ;

-- 修改游標,繼續向下

fetch mycur into empinfo ;

end loop ;

end ;

也可以使用另外一種方式迴圈游標:loop…end loop;

declare

-- 宣告游標

cursor mycur is select * from emp ;

empinfo emp%rowtype ;

begin

-- 游標操作使用迴圈,但是在操作之前必須先將游標開啟

open mycur ;

loop

-- 使游標向下一行

fetch mycur into empinfo ;

exit when mycur%notfound ;

dbms_output.put_line('雇員編號:'||empinfo.empno) ;

dbms_output.put_line('雇員姓名:'||empinfo.ename) ;

end loop ;

end ;

注意 1: 在開啟游標之前最好先判斷游標是否已經是開啟的。

通過 isopen 判斷

格式:

游標%isopen if mycur%isopen then

null ;

else

open mycur ;

end if ;

注意 2:可以使用 rowcount 對游標所操作的行數進行記錄。

declare

-- 宣告游標

cursor mycur is select * from emp ;

empinfo emp%rowtype ;

cou number ; begin

-- 游標操作使用迴圈,但是在操作之前必須先將游標開啟

if mycur%isopen then

null ;

else

open mycur ;

end if ;

loop

-- 使游標向下一行

fetch mycur into empinfo ;

exit when mycur%notfound ;

cou := mycur%rowcount ;

dbms_output.put_line(cou||'雇員編號:'||empinfo.empno) ;

dbms_output.put_line(cou||'雇員姓名:'||empinfo.ename) ;

end loop ;

end ;

函式就是乙個有返回值的過程。

定義乙個函式:此函式可以根據雇員的編號查詢出雇員的年薪

create or replace function myfun(eno emp.empno%type) 

return number as rsal number ;

begin

select (sal+nvl(comm,0))*12 into rsal from emp where empno=eno ;

return rsal ;

end ;

直接寫 sql 語句,呼叫此函式:

select myfun(7369) from dual ;
寫乙個函式  輸入乙個員工名字,判斷該名字在員工表中是否存在。存在返回 1,不存在返回 0

create or replace function empfun(en emp.ename%type) 

return number as is_exist number;

begin

select count(*) into is_exist from emp where ename=upper(en);

return is_exist;

end;

Oracle中的游標和函式詳解

oracle中的游標和函式詳解 1.游標 游標是一種 pl sql 控制結構 可以對 sql 語句的處理進行顯示控制,便於對錶的行資料 逐條進行處理。游標並不是乙個資料庫物件,只是存留在記憶體中。操作步驟 宣告游標 開啟游標 取出結果,此時的結果取出的是一行資料 關閉游標 到底那種型別可以把一行的資...

oracle 中函式,游標的使用

建立函式並且呼叫 create function fun1 v in ename varchar2 return number is v annual sal number begin select sal nvl comm,0 13 into v annual sal from emp where...

Oracle中的游標

cursor found最近一次讀取是否成功 notfound isopen游標開啟時返回true rowcount返回已從游標讀取的記錄數 輸出年齡大於等於18的使用者的id跟name declare v id t.id type v name t.name type cursor c user ...