游標是一種 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 ...