Oracle 存储过程以及存储函数
以下的一些例子是基于scott用户下的emp表的数据,一和二使用的均为in,out参数,最后一个综合练习使用了 in out参数
一.存储过程
1.创建无参的存储过程示例 ------ hello
注意存储过程中的PLSQL部分没有了declare
create or replace procedure hello
as
begin
dbms_output.put_line('ok');
end;
/
2.如何调用?
第一种方式 ----- exec(或者是execute) hello;
第二种方式 ----- 使用PLSQL调用
begin
hello;
end;
/
3.创建有参存储过程raiseSalary(编号),为指定员工涨10%的工资(员工编号从键盘接收)(in的用法)
注意:1.涉及到10%这种带有百分号的运算时一定要转换成相应的数字,例如:0.1
2.in 表示是何种参数,为默认值,可省略
3.&符号的使用,输入时如果是字符串不要忘记' ',输完不要多加分号
--创建
create or replace procedure raiseSalary(pempno in number)
as
begin
update emp set sal = sal * 1.1 where empno = pempno;
end;
/
--调用(exec raiseSalary(&empno);)
begin
raiseSalary(&empno);
end
4.创建有参存储过程findEmpNameAndSalAndJob(编号),查询指定编号员工的的姓名,职位,月薪,返回多个值(out的用法)
注意:用 || 连接字符串,以及使用 ' '表示字符串
--创建
create or replace procedure findEmpNameAndSalAndJob(pempno emp.empno%type,pname out emp.ename%type,pjob out emp.job%type,psal out emp.sal%type)
as
begin
select ename,job,sal into pname,pjob,psal from emp where empno = pempno;
end;
/
--调用
declare
---创建这三个变量去接收传出来的参数
pname emp.ename%type;
pjob emp.job%type;
psal emp.sal%type;
begin
findEmpNameAndSalAndJob(&empno,pname,pjob,psal);
dbms_output.put_line(pname || '----' || pjob || '-----' || psal );
end;
/
总结:从上面的几个例子可以看出如果有存储过程有参数传出的话,那么使用PLSQL调用较好,如果无传出参数的话用exec调用
二.存储函数
存储函数必须有且只有一个返回值和参数类型
1.创建并调用无参的存储过程示例
注意:1.可以看到创建存储函数时的PLSQL部分仍然没有declare
2.调用存储函数时由于函数有返回值所以声明了一个变量去接收
--创建
create or replace function getName return varchar2
as
begin
return 'wyc';
end;
/ --调用
declare
name varchar2(10);
begin
name := getName();
dbms_output.put_line(name);
end;
/
2.创建有参存储函数findEmpIncome(编号),查询指定员工编的年收入(年薪+佣金)(in的用法,默认是in)
--创建
create or replace function findEmpIncome(pempno in number) return number
as
income emp.sal%type;
begin
-- 考虑到emp表中一些员工的佣金为null
select sal + NVL(comm,0) into income from emp where empno = pempno;
return income;
end;
/
--调用
declare
income emp.sal%type;
begin
income := findEmpIncome(&empno);
dbms_output.put_line('收入是' || income);
end;
/
3.创建有参存储函数findEmpNameAndJobAndSal(编号),查询指定编号员工的的姓名(return),职位(out),月薪(out),返回多个值
前面说过存储函数只能有一个返回值,如果有多个返回值的话要结合out参数进行处理
--创建函数
create or replace function findEmpNameAndJobAndSal(pempno in number,pjob out varchar2,psal out varchar2)
return varchar2
as
pname emp.ename%type;
begin
select ename,job,sal into pname,pjob,psal from emp where empno = pempno;
return pname;
end;
/
--调用函数
declare
pjob emp.job%type;
psal emp.sal%type;
pname emp.ename%type; --- 接收返回值
begin
pname :=findEmpNameAndJobAndSal(&empno,pjob,psal);
dbms_output.put_line(pname || '-----' || pjob || '-----' || psal);
end;
/
总结:存储函数与存储过程有些类似但又有不同,只有一个返回值时适合使用存储函数,有多个返回值或者没有返回值时适合使用存储过程
3.综合练习 --- 分别使用存储过程及存储函数计算个人税收(存储函数使用到了in out参数)
1.存储过程计算个人所得税
--创建存储过程 (注意10%一定要写成0.1)
create or replace procedure get_rax(psal in number,rax out number)
as
money number(6);
begin
money := psal - 3500;
if money <= 1500 then
rax := money * 0.03 - 0;
elsif money <= 4500 then
rax := money * 0.1 - 105;
elsif money <= 9000 then
rax := money * 0.2 - 555;
elsif money <= 35000 then
rax := money * 0.25 - 1005;
elsif money <= 55000 then
rax := money * 0.3 - 2755;
elsif money <= 80000 then
rax := money * 0.35 - 5505;
else
rax := money * 0.45 - 13505;
end if;
end;
/
--调用
declare
rax number(20);
begin
get_rax(&sal,rax);
dbms_output.put_line('您要交的税为 : ' || rax);
end;
/
2.存储函数
pname要回传给调用者,从而输出姓名
create or replace function get_rax2(pname in out varchar2,psal in number)
return number
as
money number(6);
rax number(20);
begin
money := psal - 3500;
if money <= 1500 then
rax := money * 0.03 - 0;
elsif money <= 4500 then
rax := money * 0.1 - 105;
elsif money <= 9000 then
rax := money * 0.2 - 555;
elsif money <= 35000 then
rax := money * 0.25 - 1005;
elsif money <= 55000 then
rax := money * 0.3 - 2755;
elsif money <= 80000 then
rax := money * 0.35 - 5505;
else
rax := money * 0.45 - 13505;
end if;
return rax;
end;
/ --调用存储函数
declare
rax number(20);
name varchar2(10);
begin
name := &name;
rax := get_rax2(name,&sal);
dbms_output.put_line('尊敬的' || name || ',您应交的税为 :' || rax);
end;
/
如果还有问题的话,后续再进行补充 ^_^
Oracle 存储过程以及存储函数的更多相关文章
- oracle存储过程和存储函数&触发器
oracle存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程,存储函数 存储过程和存储函数的相同点:完成特定功能的程序 存储过程和存储函数的区别:是否用return语句返回值 ...
- oracle存储过程和存储函数
存储过程 1.存储过程简介 下面先来简单介绍一下oracle的存储过程的语法,如下: create or replace procedure Tony_Process ( num in number, ...
- oracle存储过程与存储函数的区别和联系
相同点:1.创建语法结构相似,都可以携带多个传入参数和传出参数. 2.都是一次编译,多次执行. 不同点:1.存储过程定义关键字用procedure,函数定义用function. 2.存储过程 ...
- Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象
作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么 ...
- 编程开发之--Oracle数据库--存储过程和存储函数(2)
上一小结我们简单介绍了存储过程和存储函数,对存储过程和存储函数有了一个基本的了解,接下来介绍在java程序中如何调用我们创建的存储过程和存储函数 1.在应用程序中调用我们的存储过程 创建一个简单的Ja ...
- 存储过程,存储函数(Oracle)
存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 存储过程和存储函数的区别? 存储函数:可以通过return 语句返回函数值. 存储过程:不能 除此之外我们可以认为 ...
- 编程开发之--Oracle数据库--存储过程和存储函数(1)
1.存储过程和存储函数 描述:指存储在数据库中供所有用户程序调用的子程序叫做存储过程.存储函数 区别:存储函数可以通过return子句返回一个函数的值 (1)存储过程 语法:create [or re ...
- Oracle存储过程和自定义函数
新博客文章链接,欢迎大家评论探讨 概述 存储过程和存储函数是指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 异同点: 存储过程和存储函数的相同点:完成特定功能的程序. 存储过程和存储 ...
- Oracle存储过程和自定义函数笔记
学习地址:https://www.imooc.com/learn/370 存储过程和存储函数定义:指存储在数据库中供所有用户程序调用的子程序叫做存储过程 .存储函数. 相同点:完成特定功能的程序.区别 ...
随机推荐
- 在Visual Studio Code中开发Office Add-in
作者:陈希章 发表于 2017年7月13日 上一篇 我介绍了如何在Visual Studio中开发Office Add-in,因为有标准的项目模板,一系列配套的工具,尤其是自带的一键调试功能,可以让开 ...
- C#基础知识 结构与类的区别
网上看到struct与class之间的区别,都写的很多,当然说的是对的,也很详细.不过我个人不喜欢照本宣科,还是要有自己的理解和认识,方便记忆. (前提:对于值类型与引用类型有一定的认识) 结构最重要 ...
- 《大型网站系统与JAVA中间件实践》【PDF】下载
<大型网站系统与JAVA中间件实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062557 内容简介 到底是本什么书,拥有这样 ...
- IEEE Trans 2009 Stagewise Weak Gradient Pursuits论文学习
论文在第二部分先提出了贪婪算法框架,如下截图所示: 接着根据原子选择的方法不同,提出了SWOMP(分段弱正交匹配追踪)算法,以下部分为转载<压缩感知重构算法之分段弱正交匹配追踪(SWOMP)&g ...
- 【java】文件复制的简单实现
package 文件操作; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...
- UITableView的性能优化
UITableView作为ios中使用最频繁的控件之一,其性能优化也是常常要面对的,尤其是当数据量偏大并且设备性能不足时.本文旨在总结tableview的几个性能优化tips,并且随着认识的深入,本文 ...
- 每周.NET前沿技术文章摘要(2017-05-17)
汇总国外.NET社区相关文章,覆盖.NET ,ASP.NET等内容: .NET .NET Framework 4.7正式发布 链接: http://www.infoq.com/cn/news/2017 ...
- 干货分享!关于APP导航菜单设计你应该了解的一切
导航菜单是人机交互的最主要的桥梁和平台,主要作用是不让用户迷失方向.现在市面上产品的菜单栏种类繁多,到底什么样的才是优秀的导航菜单设计呢?好的菜单设计不仅能提升整个产品的用户体验,而且还能让用户耳目一 ...
- Linux(以CentOS6.5示例)下安装Oracle官方最新版JDK(JDK1.8)
本文地址http://comexchan.cnblogs.com/ ,作者Comex Chan,尊重知识产权,转载请注明出处,谢谢! 我们很多组件都需要使用Oracle最新版的JDK,所以需要在我们的 ...
- Django__WSGI
WEB应用的本质 : 1. 浏览器发送一个http请求 2. 服务器收到请求,生成一个html文档 3. 服务器把HTML文档作为HTTP响应的body发送给浏览器 4. 浏览器收到http响应,从h ...