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

81d0b5aaf7361553a2ac2cac304840fb.png

看完这章后你会学习到以下内容:

1.练习场景
2.面试场景
3.工作应用场景


总览思维导图:

c7fe6da4cff957693eec42a4c3aaf4bf.png

面试部分:
1.创建函数,从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;  --- 直接调用隐式游标RETURN V_SAL;EXCEPTION WHEN NO_DATA_FOUND THEN     --- 异常值处理V_SAL:='没找到任何结果';RETURN V_SAL;END;--- 调用函数
SELECT CHECK_SAL(7499) AS 工资 FROM DUAL;

2.*创建函数,返回emp表中指定职工的工资和姓名。
返回值是两个,可用return返回一个,另一个用out参数带回

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参数,返回其中一个SAL
--- 第二部分再重新定义一个OUT参数,不然程序不清楚要调用那个类型的参数DECLAREP_ENAME EMP.ENAME%TYPE;p_SAL EMP.SAL%TYPE;BEGINP_SAL:=F_EMP_SALENAME(7369,P_ENAME);      --- 定义一个Out参数返回function的返回值SalDBMS_OUTPUT.put_line('员工'||P_ENAME||'薪酬'||P_SAL);END;

3.创建函数,根据给定的部门编号(提示: 利用&)计算该部门所有职工的平均工资。

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;--- 调用时候,在输入名称前加入&,类似于VBA里的Input函数SELECT  F_INPUTEMPNO(&部门编号) AS 平均工资 FROM DUAL;

4.创建一个函数,仅有一个形参,它接收调用函数中传递过来的实参--部门号,函数的返回值为该部门的一整条记录信息.

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);   --- 传递参数给到调用函数时新定义得变量V_Dept;DBMS_OUTPUT.PUT_LINE('部门名: '||V_DEPT.DNAME || '  部门位置: ' || V_DEPT.LOC);END;

5*.创建函数,将emp表中工资低于平均工资的职工工资加上200,并返回修改了工资的总人数。注意: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用于记录修改的条数,必须放在一个更新或者删除等修改类语句后面执行,select语句用于查询的话无法使用,当你执行多条修改语句时,按照sql%rowcount 之前执行的最后一条语句修改数为准。*/
END;
/
调用
BEGINDBMS_OUTPUT.PUT_LINE(F_MODIFY);
END; 
/

面试过程
1.输入2个整数,返回最小到最大数之间的连乘的结果(两个整数在1到20之间);
思路: 先对两个数进行范围的设置,用IF加AND判断。
然后两个数字一共三种可能:
A大于B,A小于B,A等于B 用IF Elsif 方式做条件判断。

CREATE OR REPLACE FUNCTION FUNB(P1 IN INT, P2 IN INT) RETURN INTEGER IS  --- 这两个的数据类型一定要一致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个整数,取中位数。

--- 方法一	  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. 对比两个数,返回一个最大值。可以在设置参数时,顺带设置默认值

-- 传入两个参数,返回最大值CREATE OR REPLACE FUNCTION FUN_MAX (P_NUM1 IN NUMBER, P_NUM2 IN NUMBER DEFAULT 99)RETURN NUMBER    -- 函数的返回类型ISBEGINIF P_NUM1>P_NUM2 THEN RETURN P_NUM1;	ELSE RETURN P_NUM2; END IF;END;

3. 工作场景(一)
-- 函数返回类型为游标(对应报表接口)

-- 传入部门编号,返回整个部门的员工信息(函数)
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 表里直接调用SELECT FUN_REF(30) FROM DUAL;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让一个非窗口组件(non-windowed component)可以接受来自Windows的消息

为什么要这样做&#xff1f;有时候我们需要一个非窗口组件(比如一个非继承自TWinContrl的组件)可以接受Windows消息。要接受消息就需要一个窗口句柄&#xff0c;但是非窗口组件却没有句柄。这篇文章将讲述怎么让一个没有句柄的组件如何通过一个隐藏的窗口接受消息这是怎么做到的…

进阶– Java EE 7前端5强

系列继续。 在初步概述和Arjan关于最重要的后端功能的文章之后 &#xff0c;我现在非常高兴让Ed Burns&#xff08; edburns &#xff09;使用他最喜欢的Java EE 7前端功能完成本系列。 感谢Markus Eisele让我有机会在他非常受欢迎的博客上发表帖子。 我和Markus的关系可以追溯…

一杯水怎么测试_一杯水就能鉴别翡翠真假的高招

大家好&#xff0c;小生有礼&#xff01;鄙人是秋玉蝉珠宝的杨杨&#xff0c;很高兴能在茫茫互联网中相识就是有缘。先简单介绍一下秋玉蝉珠宝&#xff0c;我们是年轻的品牌&#xff0c;我们的理念一直秉承坚持做真翡翠&#xff0c;好翡翠&#xff0c;把握翡翠的精髓&#xff0…

214

python 进程&#xff1a;process 线程&#xff1a;thread转载于:https://www.cnblogs.com/jtlin/p/6397533.html

SpringBoot:与MyBatis合作

MyBatis是一个SQL映射框架&#xff0c;支持自定义SQL&#xff0c;存储过程和高级映射。 SpringBoot不为MyBatis集成提供官方支持&#xff0c;但MyBatis社区为MyBatis构建了SpringBoot入门程序。 您可以在http://blog.mybatis.org/2015/11/mybatis-spring-boot-released.html上…

wordpress房产信息网_Realia v3.1.2 wordpress房地产模板 租房网站模板

Product DescriptionRealia租赁门户模板。创造你自己的简单的方法房地产门户。教具支持dsidxpress WordPress插件和新的WP主题定制的API&#xff0c;它允许你做出实时的设计变化&#xff01;你也可以选择20种颜色的变化&#xff0c;10的背景图案&#xff0c;3头的设置和盒装或全…

r语言dataellipse_r – 在ggplot2中微调stat_ellipse()

我想创建一个具有95&#xff05;“精确”置信椭圆的二元正态分布的散点图.library(mvtnorm)library(ggplot2)set.seed(1)n c95 rho Sigma 我从双变量法线生成了1000个观测值,平均值为零,方差西格玛x z for(i in 1:n){z[i] p95[i] }我们可以使用stat_ellipse轻松地在生成数据的散…

openjpa_以编程方式向OpenJPA注册实体类型

openjpa我刚刚开始为Isis开发 OpenJPA对象库 。 在一般情况下&#xff0c;可以在persistence.xml文件中注册实体类型。 但是&#xff0c;Isis是一个框架&#xff0c;可以构建自己的元模型&#xff0c;并且可以自行确定哪些类构成实体。 因此&#xff0c;我不想强​​迫开发人员…

记录踩过的坑——代理IP

网络错误&#xff0c;查看是否有代理IP。转载于:https://www.cnblogs.com/dayang12525/p/6402068.html

php连接mysql_PHP连接MySQL数据库的三种方式

本篇文章给大家介绍一下PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)&#xff0c;结合实例形式分析了PHP基于mysql、mysqli、pdo三种方式连接MySQL数据库的相关操作技巧与注意事项。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助…

使用Vert.x进行响应式开发

最近&#xff0c;似乎我们正在听到有关Java的最新和最好的框架的消息。 忍者 &#xff0c; SparkJava和Play等工具; 但是每个人都固执己见&#xff0c;使您感到您需要重新设计整个应用程序以利用它们的出色功能。 这就是为什么当我发现Vert.x时令我感到宽慰的原因。 Vert.x不是…

使用xtrabackup(innobackupex)实现MySQL的热备

mysql 的热备http://www.178linux.com/10139http://www.linuxidc.com/Linux/2014-04/99671.htmhttp://634871.blog.51cto.com/624871/1351049http://www.cnblogs.com/galengao/p/5755835.htmlhttp://heylinux.com/archives/3777.html 遇到问题&#xff0c;解决链接 http://blog…

mysql查看执行计划_MySql中如何使用 explain 查询 SQL 的执行计划

explain命令是查看查询优化器如何决定执行查询的主要方法。这个功能有局限性&#xff0c;并不总会说出真相&#xff0c;但它的输出是可以获取的最好信息&#xff0c;值得花时间去了解&#xff0c;因为可以学习到查询是如何执行的。1、什么是MySQL执行计划要对执行计划有个比较好…

vim的tab键设定

多在windows上编程的童鞋可能习惯于感受tab键为4个空格的长度&#xff0c;不过在linux系统中一般默认设定tab键为8个空格长度来显示。事实上tab也确实是8个空格的长度。不过由于习惯问题&#xff0c;某些童鞋还是希望在linux上也感受tab键为4个空格长度的显示&#xff0c;因为v…

依赖注入

依赖注入指的就是类A依赖于类B&#xff0c;通过外部注入的方式来实现&#xff0c;而不是通过自身去实现。 这样做的好处就是可以使得代码之间更加的解耦。 举个例子&#xff0c;船&#xff08;ship&#xff09;包含有船桨&#xff08;oar&#xff09;&#xff0c;以下为高耦合的…

idea内置junit5_JUnit的内置Hamcrest Core Matcher支持

idea内置junit5在通过JUnit和Hamcrest改善对assertEquals的文章中&#xff0c;我简要讨论了Hamcrest “ 核心 ”匹配器与JUnit的现代版本“结合”在一起的情况。 在那篇文章中&#xff0c;我特别关注了JUnit的assertThat&#xff08;T&#xff0c;Matcher&#xff09;静态方法与…

jenkins 发送邮件模板

jenkins 发送邮件模板 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>${ENV, var"JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title> </head><body leftmargin"8" marginwidth"…

centos lnmp源码安装mysql_CentOS 6.6 下源码编译安装MySQL 5.7.5

说明&#xff1a;CentOS 6.6 下源码编译安装MySQL 5.7.51. 安装相关工具# yum -y install gcc-c ncurses-devel cmake make perl \gcc autoconf automake zlib libxml libgcrypt libtool bison2. 清理环境检查boost版本&#xff1a;# rpm -qa boost*卸载boost-*等库&#xff1a…

Oracle Spring Clean JavaFX应该吗?

我们确实在Codename One上依赖JavaFX&#xff0c;我们的模拟器需要它。 我们的桌面版本使用它&#xff0c;而我们的设计器工具基于Swing。 我们希望它成功&#xff0c;这对我们的业务至关重要&#xff01; 即使您是Java EE开发人员并且不关心桌面编程&#xff0c;我们也不是一个…

laravel mysql 锁表_Laravel中MySQL的乐观锁与悲观锁

MySQL/InnoDB的加锁&#xff0c;是一个老生常谈的话题。在数据库高并发请求下&#xff0c;如何兼顾数据完整性与用户体验的敏捷性是一代又一代程序员一直在思考的问题。乐观锁乐观锁之所以叫乐观&#xff0c;是因为这个模式不会对数据加锁。而是对数据操作保持一种乐观的心态&a…