Oracle中的游標(biāo)和函數(shù)詳解
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的獻(xiàn)縣網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
1.游標(biāo)
游標(biāo)是一種 PL/SQL 控制結(jié)構(gòu);可以對(duì) SQL 語(yǔ)句的處理進(jìn)行顯示控制,便于對(duì)表的行數(shù)據(jù)
逐條進(jìn)行處理。 游標(biāo)并不是一個(gè)數(shù)據(jù)庫(kù)對(duì)象,只是存留在內(nèi)存中。
操作步驟:
聲明游標(biāo)
打開(kāi)游標(biāo)
取出結(jié)果,此時(shí)的結(jié)果取出的是一行數(shù)據(jù)
關(guān)閉游標(biāo) 到底那種類型可以把一行的數(shù)據(jù)都裝進(jìn)來(lái)
此時(shí)使用 ROWTYPE 類型,此類型表示可以把一行的數(shù)據(jù)都裝進(jìn)來(lái)。 例如:查詢雇員編號(hào)為 7369 的信息(肯定是一行信息)。
例:查詢雇員編號(hào)為 7369 的信息(肯定是一行信息)。
DECLARE eno emp.empno%TYPE ; empInfo emp%ROWTYPE ; BEGIN eno := &en ; SELECT * INTO empInfo FROM emp WHERE empno=eno ; DBMS_OUTPUT.put_line('雇員編號(hào):'||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)打開(kāi) FOR empInfo IN mycur LOOP --ROWCOUNT 對(duì)游標(biāo)所操作的行數(shù)進(jìn)行記錄 cou := mycur%ROWCOUNT ; DBMS_OUTPUT.put_line(cou||'雇員編號(hào):'||empInfo.empno) ; DBMS_OUTPUT.put_line(cou||'雇員姓名:'||empInfo.ename) ; END LOOP ; END ;
我們可以看到游標(biāo)FOR循環(huán)確實(shí)很好的簡(jiǎn)化了游標(biāo)的開(kāi)發(fā),我們不在需要open、fetch和close語(yǔ)句,不在需要用%FOUND屬性檢測(cè)是否到最后一條記錄,這一切Oracle隱式的幫我們完成了。
編寫(xiě)第一個(gè)游標(biāo),輸出全部的信息。
DECLARE -- 聲明游標(biāo) CURSOR mycur IS SELECT * FROM emp ; -- 相當(dāng)于一個(gè)List (EmpPo) empInfo emp%ROWTYPE ; BEGIN -- 游標(biāo)操作使用循環(huán),但是在操作之前必須先將游標(biāo)打開(kāi) OPEN mycur ; -- 使游標(biāo)向下一行 FETCH mycur INTO empInfo ; -- 判斷此行是否有數(shù)據(jù)被發(fā)現(xiàn) WHILE (mycur%FOUND) LOOP DBMS_OUTPUT.put_line('雇員編號(hào):'||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)打開(kāi) OPEN mycur ; LOOP -- 使游標(biāo)向下一行 FETCH mycur INTO empInfo ; EXIT WHEN mycur%NOTFOUND ; DBMS_OUTPUT.put_line('雇員編號(hào):'||empInfo.empno) ; DBMS_OUTPUT.put_line('雇員姓名:'||empInfo.ename) ; END LOOP ; END ;
注意 1: 在打開(kāi)游標(biāo)之前最好先判斷游標(biāo)是否已經(jīng)是打開(kāi)的。
通過(guò) ISOPEN 判斷
格式:
游標(biāo)%ISOPEN IF mycur%ISOPEN THEN null ; ELSE OPEN mycur ; END IF ;
注意 2:可以使用 ROWCOUNT 對(duì)游標(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)打開(kāi) 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||'雇員編號(hào):'||empInfo.empno) ; DBMS_OUTPUT.put_line(cou||'雇員姓名:'||empInfo.ename) ; END LOOP ; END ;
2.函數(shù)
函數(shù)就是一個(gè)有返回值的過(guò)程。
定義一個(gè)函數(shù):此函數(shù)可以根據(jù)雇員的編號(hào)查詢出雇員的年薪
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 ;
直接寫(xiě) SQL 語(yǔ)句,調(diào)用此函數(shù):
SELECT myfun(7369) FROM dual ;
寫(xiě)一個(gè)函數(shù) 輸入一個(gè)員工名字,判斷該名字在員工表中是否存在。存在返回 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;
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
本文標(biāo)題:Oracle中的游標(biāo)和函數(shù)詳解
標(biāo)題URL:http://chinadenli.net/article48/jsihhp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)、網(wǎng)站改版、微信公眾號(hào)、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)