Oracle中的游標(biāo)和函數(shù)詳解
1.游標(biāo)
游標(biāo)是一種 PL/SQL 控制結(jié)構(gòu);可以對 SQL 語句的處理進(jìn)行顯示控制,便于對表的行數(shù)據(jù)
逐條進(jìn)行處理。 游標(biāo)并不是一個數(shù)據(jù)庫對象,只是存留在內(nèi)存中。
操作步驟:
聲明游標(biāo)
打開游標(biāo)
取出結(jié)果,此時的結(jié)果取出的是一行數(shù)據(jù)
關(guān)閉游標(biāo) 到底那種類型可以把一行的數(shù)據(jù)都裝進(jìn)來
此時使用 ROWTYPE 類型,此類型表示可以把一行的數(shù)據(jù)都裝進(jìn)來。 例如:查詢雇員編號為 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 循環(huán)操作游標(biāo)(比較常用)
DECLARE
-- 聲明游標(biāo)
CURSOR mycur IS SELECT * FROM emp where empno=-1;
empInfo emp%ROWTYPE ;
cou NUMBER ;
BEGIN
-- 游標(biāo)操作使用循環(huán),但是在操作之前必須先將游標(biāo)打開
FOR empInfo IN mycur
LOOP
--ROWCOUNT 對游標(biāo)所操作的行數(shù)進(jìn)行記錄
cou := mycur%ROWCOUNT ;
DBMS_OUTPUT.put_line(cou||'雇員編號:'||empInfo.empno) ;
DBMS_OUTPUT.put_line(cou||'雇員姓名:'||empInfo.ename) ;
END LOOP ;
END ;
我們可以看到游標(biāo)FOR循環(huán)確實很好的簡化了游標(biāo)的開發(fā),我們不在需要open、fetch和close語句,不在需要用%FOUND屬性檢測是否到最后一條記錄,這一切Oracle隱式的幫我們完成了。
編寫第一個游標(biāo),輸出全部的信息。
DECLARE
-- 聲明游標(biāo)
CURSOR mycur IS SELECT * FROM emp ; -- 相當(dāng)于一個List (EmpPo)
empInfo emp%ROWTYPE ;
BEGIN
-- 游標(biāo)操作使用循環(huán),但是在操作之前必須先將游標(biāo)打開
OPEN mycur ;
-- 使游標(biāo)向下一行
FETCH mycur INTO empInfo ;
-- 判斷此行是否有數(shù)據(jù)被發(fā)現(xiàn)
WHILE (mycur%FOUND)
LOOP
DBMS_OUTPUT.put_line('雇員編號:'||empInfo.empno) ;
DBMS_OUTPUT.put_line('雇員姓名:'||empInfo.ename) ;
-- 修改游標(biāo),繼續(xù)向下
FETCH mycur INTO empInfo ;
END LOOP ;
END ;
也可以使用另外一種方式循環(huán)游標(biāo):LOOP…END LOOP;
DECLARE
-- 聲明游標(biāo)
CURSOR mycur IS SELECT * FROM emp ;
empInfo emp%ROWTYPE ;
BEGIN
-- 游標(biāo)操作使用循環(huán),但是在操作之前必須先將游標(biāo)打開
OPEN mycur ;
LOOP
-- 使游標(biāo)向下一行
FETCH mycur INTO empInfo ;
EXIT WHEN mycur%NOTFOUND ;
DBMS_OUTPUT.put_line('雇員編號:'||empInfo.empno) ;
DBMS_OUTPUT.put_line('雇員姓名:'||empInfo.ename) ;
END LOOP ;
END ;
注意 1: 在打開游標(biāo)之前最好先判斷游標(biāo)是否已經(jīng)是打開的。
通過 ISOPEN 判斷
格式:
游標(biāo)%ISOPEN IF mycur%ISOPEN THEN
null ;
ELSE
OPEN mycur ;
END IF ;
注意 2:可以使用 ROWCOUNT 對游標(biāo)所操作的行數(shù)進(jìn)行記錄。
DECLARE
-- 聲明游標(biāo)
CURSOR mycur IS SELECT * FROM emp ;
empInfo emp%ROWTYPE ;
cou NUMBER ; BEGIN
-- 游標(biāo)操作使用循環(huán),但是在操作之前必須先將游標(biāo)打開
IF mycur%ISOPEN THEN
null ;
ELSE
OPEN mycur ;
END IF ;
LOOP
-- 使游標(biāo)向下一行
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 ;
2.函數(shù)
函數(shù)就是一個有返回值的過程。
定義一個函數(shù):此函數(shù)可以根據(jù)雇員的編號查詢出雇員的年薪
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 語句,調(diào)用此函數(shù):
SELECT myfun(7369) FROM dual ;
寫一個函數(shù) 輸入一個員工名字,判斷該名字在員工表中是否存在。存在返回 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游標(biāo)的簡易用法
- Oracle游標(biāo)的使用實例詳解
- Oracle中游標(biāo)Cursor基本用法詳解
- 詳解Oracle隱式游標(biāo)和顯式游標(biāo)
- Oracle出現(xiàn)超出打開游標(biāo)最大數(shù)的解決方法
- Oracle顯示游標(biāo)的使用及游標(biāo)for循環(huán)
- Oracle存儲過程返回游標(biāo)實例詳解
- Oracle 游標(biāo)使用總結(jié)
- oracle 在一個存儲過程中調(diào)用另一個返回游標(biāo)的存儲過程
- Oracle游標(biāo)使用參考語句實例解析