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

歡迎訪問 生活随笔!

生活随笔

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

数据库

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

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

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

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


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


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

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:='沒找到任何結(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è)類型的參數(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ù)給定的部門編號(提示: 利用&)計(jì)算該部門所有職工的平均工資。

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í)候,在輸入名稱前加入&,類似于VBA里的Input函數(shù)SELECT F_INPUTEMPNO(&部門編號) AS 平均工資 FROM DUAL;

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

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('部門名: '||V_DEPT.DNAME || ' 部門位置: ' || V_DEPT.LOC);END;

5*.創(chuàng)建函數(shù),將emp表中工資低于平均工資的職工工資加上200,并返回修改了工資的總?cè)藬?shù)。注意:Update后面要加上Where語句否則全部都更新,其次我們善用%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è)更新或者刪除等修改類語句后面執(zhí)行,select語句用于查詢的話無法使用,當(dāng)你執(zhí)行多條修改語句時(shí),按照sql%rowcount 之前執(zhí)行的最后一條語句修改數(shù)為準(zhǔn)。*/ END; / 調(diào)用 BEGINDBMS_OUTPUT.PUT_LINE(F_MODIFY); END; /

面試過程
1.輸入2個(gè)整數(shù),返回最小到最大數(shù)之間的連乘的結(jié)果(兩個(gè)整數(shù)在1到20之間);
思路: 先對兩個(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ù)類型一定要一致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('請輸入正確的范圍值'); 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. 對比兩個(gè)數(shù),返回一個(gè)最大值??梢栽谠O(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ù)的返回類型ISBEGINIF P_NUM1>P_NUM2 THEN RETURN P_NUM1; ELSE RETURN P_NUM2; END IF;END;

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

-- 傳入部門編號,返回整個(gè)部門的員工信息(函數(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 自定义函数】 常用场景的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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