Oracle中的游標(biāo)和函數(shù)詳解
Oracle中的游標(biāo)和函數(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ì)本站的支持!
相關(guān)文章
Oracle數(shù)據(jù)庫(kù)url連接最后一個(gè)orcl代表的是配置的數(shù)據(jù)庫(kù)SID
今天小編就為大家分享一篇關(guān)于Oracle數(shù)據(jù)庫(kù)url連接最后一個(gè)orcl代表的是配置的數(shù)據(jù)庫(kù)SID,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
Oracle中多表關(guān)聯(lián)批量插入批量更新與批量刪除操作
這篇文章主要介紹了Oracle中多表關(guān)聯(lián)批量插入,批量更新與批量刪除操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
Oracle使用range分區(qū)并根據(jù)時(shí)間列自動(dòng)創(chuàng)建分區(qū)
這篇文章主要介紹了Oracle使用range分區(qū)并根據(jù)時(shí)間列自動(dòng)創(chuàng)建分區(qū),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
Oracle中nvl()和nvl2()函數(shù)實(shí)例詳解
NVL函數(shù)的功能是實(shí)現(xiàn)空值的轉(zhuǎn)換,根據(jù)第一個(gè)表達(dá)式的值是否為空值來(lái)返回響應(yīng)的列名或表達(dá)式,下面這篇文章主要給大家介紹了關(guān)于Oracle中nvl()和nvl2()函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-05-05
Oracle使用in語(yǔ)句不能超過(guò)1000問(wèn)題的解決辦法
最近項(xiàng)目中使用到了Oracle中where語(yǔ)句中的in條件查詢語(yǔ)句,在使用中發(fā)現(xiàn)了問(wèn)題,所以下面這篇文章主要給大家介紹了關(guān)于Oracle使用in語(yǔ)句不能超過(guò)1000問(wèn)題的解決辦法,需要的朋友可以參考下2022-05-05
Oracle數(shù)據(jù)庫(kù)集復(fù)制方法淺議
Oracle數(shù)據(jù)庫(kù)集復(fù)制方法淺議...2007-03-03
ORACLE數(shù)據(jù)庫(kù)查看執(zhí)行計(jì)劃的方法
基于ORACLE的應(yīng)用系統(tǒng)很多性能問(wèn)題,是由應(yīng)用系統(tǒng)SQL性能低劣引起的,所以,SQL的性能優(yōu)化很重要,分析與優(yōu)化SQL的性能我們一般通過(guò)查看該SQL的執(zhí)行計(jì)劃,本文就如何看懂執(zhí)行計(jì)劃,以及如何通過(guò)分析執(zhí)行計(jì)劃對(duì)SQL進(jìn)行優(yōu)化做相應(yīng)說(shuō)明2012-05-05

