日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

自定义sql_【PL/SQL 自定义函数】 常用场景

發(fā)布時(shí)間:2023/12/2 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义sql_【PL/SQL 自定义函数】 常用场景 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

看完這章后你會(huì)學(xué)習(xí)到以下內(nèi)容:

1.練習(xí)場(chǎng)景
2.面試場(chǎng)景
3.工作應(yīng)用場(chǎng)景


總覽思維導(dǎo)圖:


面試部分:
1.創(chuàng)建函數(shù),從emp表中查詢(xún)指定員工編號(hào)的職工的工資

CREATE OR REPLACE FUNCTION CHECK_SAL(F_EMPNO IN EMP.EMPNO%TYPE) RETURN NUMBER ISV_SAL VARCHAR(50);BEGINSELECT SAL INTO V_SAL FROM EMP WHERE EMPNO = F_EMPNO; --- 直接調(diào)用隱式游標(biāo)RETURN V_SAL;EXCEPTION WHEN NO_DATA_FOUND THEN --- 異常值處理V_SAL:='沒(méi)找到任何結(jié)果';RETURN V_SAL;END;--- 調(diào)用函數(shù) SELECT CHECK_SAL(7499) AS 工資 FROM DUAL;

2.*創(chuàng)建函數(shù),返回emp表中指定職工的工資和姓名。
返回值是兩個(gè),可用return返回一個(gè),另一個(gè)用out參數(shù)帶回

CREATE OR REPLACE FUNCTION F_EMP_SALENAME(FEMPNO IN EMP.EMPNO%TYPE,V_ENAME OUT EMP.ENAME%TYPE)RETURN NUMBER IS V_SAL EMP.SAL%TYPE; BEGINSELECT SAL,ENAME INTO V_SAL,V_ENAMEFROM EMPWHERE EMPNO = FEMPNO;RETURN V_SAL;END;--- 第一部分借用IN參數(shù),返回其中一個(gè)SAL --- 第二部分再重新定義一個(gè)OUT參數(shù),不然程序不清楚要調(diào)用那個(gè)類(lèi)型的參數(shù)DECLAREP_ENAME EMP.ENAME%TYPE;p_SAL EMP.SAL%TYPE;BEGINP_SAL:=F_EMP_SALENAME(7369,P_ENAME); --- 定義一個(gè)Out參數(shù)返回function的返回值SalDBMS_OUTPUT.put_line('員工'||P_ENAME||'薪酬'||P_SAL);END;

3.創(chuàng)建函數(shù),根據(jù)給定的部門(mén)編號(hào)(提示: 利用&)計(jì)算該部門(mén)所有職工的平均工資。

CREATE OR REPLACE FUNCTION F_INPUTEMPNO(F_DEPTNO IN DEPT.DEPTNO%TYPE) RETURN NUMBER IS V_SAL NUMBER;BEGIN SELECT AVG(SAL) INTO V_SAL FROM EMP WHERE DEPTNO = F_DEPTNO; RETURN V_SAL; END;--- 調(diào)用時(shí)候,在輸入名稱(chēng)前加入&,類(lèi)似于VBA里的Input函數(shù)SELECT F_INPUTEMPNO(&部門(mén)編號(hào)) AS 平均工資 FROM DUAL;

4.創(chuàng)建一個(gè)函數(shù),僅有一個(gè)形參,它接收調(diào)用函數(shù)中傳遞過(guò)來(lái)的實(shí)參--部門(mén)號(hào),函數(shù)的返回值為該部門(mén)的一整條記錄信息.

CREATE OR REPLACE FUNCTION F_EMPINFO(F_DEPTNO IN DEPT.DEPTNO%TYPE)RETURN DEPT%ROWTYPE ISV_DEPT DEPT%ROWTYPE;BEGINSELECT * INTO V_DEPT FROM DEPT WHERE DEPTNO = F_DEPTNO;RETURN V_DEPT;END;DECLARE V_DEPT DEPT%ROWTYPE;BEGINV_DEPT := F_EMPINFO(20); --- 傳遞參數(shù)給到調(diào)用函數(shù)時(shí)新定義得變量V_Dept;DBMS_OUTPUT.PUT_LINE('部門(mén)名: '||V_DEPT.DNAME || ' 部門(mén)位置: ' || V_DEPT.LOC);END;

5*.創(chuàng)建函數(shù),將emp表中工資低于平均工資的職工工資加上200,并返回修改了工資的總?cè)藬?shù)。注意:Update后面要加上Where語(yǔ)句否則全部都更新,其次我們善用%ROWCOUNT.

CREATE OR REPLACE FUNCTION F_MODIFY RETURN NUMBER IS BEGINUPDATE EMP SET SAL=SAL+200 WHERE SAL<(SELECT AVG(SAL) FROM EMP);RETURN SQL%ROWCOUNT; /* sql%rowcount用于記錄修改的條數(shù),必須放在一個(gè)更新或者刪除等修改類(lèi)語(yǔ)句后面執(zhí)行,select語(yǔ)句用于查詢(xún)的話(huà)無(wú)法使用,當(dāng)你執(zhí)行多條修改語(yǔ)句時(shí),按照sql%rowcount 之前執(zhí)行的最后一條語(yǔ)句修改數(shù)為準(zhǔn)。*/ END; / 調(diào)用 BEGINDBMS_OUTPUT.PUT_LINE(F_MODIFY); END; /

面試過(guò)程
1.輸入2個(gè)整數(shù),返回最小到最大數(shù)之間的連乘的結(jié)果(兩個(gè)整數(shù)在1到20之間);
思路: 先對(duì)兩個(gè)數(shù)進(jìn)行范圍的設(shè)置,用IF加AND判斷。
然后兩個(gè)數(shù)字一共三種可能:
A大于B,A小于B,A等于B 用IF Elsif 方式做條件判斷。

CREATE OR REPLACE FUNCTION FUNB(P1 IN INT, P2 IN INT) RETURN INTEGER IS --- 這兩個(gè)的數(shù)據(jù)類(lèi)型一定要一致V_RESULT INTEGER := 1;BEGINIF (P1 < 1 AND P1 > 20) AND (P2< 1 AND P2 > 20) THENIF P2 > P1 THENFOR I IN P1 .. P2 LOOPV_RESULT := V_RESULT * I;END LOOP;ELSIF P2 < P1 THENFOR I IN P2 .. P1 LOOPV_RESULT := V_RESULT * I;END LOOP;ELSEV_RESULT := P1 * P2;END IF;ELSE DBMS_OUTPUT.put_line('請(qǐng)輸入正確的范圍值'); END IF; RETURN V_RESULT; END;

2.輸入3個(gè)整數(shù),取中位數(shù)。

--- 方法一 CREATE OR REPLACE FUNCTION FUNA(P1 IN INT,P2 IN INT,P3 IN INT)RETURN INTEGER IS V_RESULT INTEGER;BEGIN SELECT CASE WHEN P1 >= P2 AND P1 <= P3 THEN P1WHEN P2 >= P1 AND P2 <= P3 THEN P2WHEN P3 >= P1 AND P3 <= P2 THEN P3 ENDINTO V_RESULT FROM DUAL;RETURN V_RESULT;END;----- 方法二 CREATE OR REPLACE FUNCTION FUN_middle(X1 IN NUMBER,X2 IN NUMBER,X3 IN NUMBER)RETURN numberIS BEGINIF (X1-X2)*(X1-X3)<=0 then return x1;elsif (x2-x1)*(x2-x3)<=0 then return x2;elsif(x3-x1)*(x3-x2)<=0 then return x3;end if;end;

3. 對(duì)比兩個(gè)數(shù),返回一個(gè)最大值。可以在設(shè)置參數(shù)時(shí),順帶設(shè)置默認(rèn)值

-- 傳入兩個(gè)參數(shù),返回最大值CREATE OR REPLACE FUNCTION FUN_MAX (P_NUM1 IN NUMBER, P_NUM2 IN NUMBER DEFAULT 99)RETURN NUMBER -- 函數(shù)的返回類(lèi)型ISBEGINIF P_NUM1>P_NUM2 THEN RETURN P_NUM1; ELSE RETURN P_NUM2; END IF;END;

3. 工作場(chǎng)景(一)
-- 函數(shù)返回類(lèi)型為游標(biāo)(對(duì)應(yīng)報(bào)表接口)

-- 傳入部門(mén)編號(hào),返回整個(gè)部門(mén)的員工信息(函數(shù)) CREATE OR REPLACE FUNCTION FUN_REF(P_DEPTNO EMP.DEPTNO%TYPE)RETURN SYS_REFCURSOR ISC_EMP SYS_REFCURSOR;BEGINOPEN C_EMP FOR -- 不要忘記添加FORSELECT * FROM EMP WHERE DEPTNO = P_DEPTNO;RETURN C_EMP;END FUN_REF;-- 直接在Dual 表里直接調(diào)用SELECT FUN_REF(30) FROM DUAL;

總結(jié)

以上是生活随笔為你收集整理的自定义sql_【PL/SQL 自定义函数】 常用场景的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。