Oracle系列:(29)存储过程和存储函数

前端之家收集整理的这篇文章主要介绍了Oracle系列:(29)存储过程和存储函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


1、存储过程【procedure】


什么是存储过程?

事先运用oracle语法写好的一段具有业务功能的程序片段,长期保存在oracle服务器中,供oracle客户端(例如,sqlplus)和程序语言远程访问,类似于Java中的函数



为什么要用存储过程?

(1)PLsql每次执行都要整体运行一遍,才有结果

(2)PLsql不能将其封装起来,长期保存在oracle服务器中

(3)PLsql不能被其它应用程序调用,例如:Java


存储过程与PLsql是什么关系?

存储过程是PLsql的一个方面的应用,而PLsql是存储过程的基础。

即存储过程需要用到PLsql


--------------------------------------------------------存储过程


语法:

create[orreplace]procedure过程名[(参数列表)]
as
PLsql程序体;


注意:存储过程中有【begin…end;/】,无declare


创建无参存储过程hello,无返回值,语法:create or replace procedure 过程名 as PLsql程序

createorreplaceprocedurehello
as
begin
dbms_output.put_line('这是我的第一个存储过程');
end;
/


删除存储过程hello,语法:drop procedure 过程名

dropprocedurehello;


调用存储过程方式一,exec 存储过程名

exechello;


调用存储过程方式二,PLsql程序

begin
hello;
end;
/

wKioL1fVT4DQUYZJAABzyHYtUy4172.jpg


调用存储过程方式三,Java程序

JDBC中讲过一个对象:CallableStatement


创建有参存储过程raiseSalary(编号),为7369号员工涨10%的工资,演示in的用法,默认in,大小写不敏感

--定义过程
createorreplaceprocedureraiseSalary(pempnonumber)
as
begin
updateempsetsal=sal*1.2whereempno=pempno;
end;
/

--调用过程
execraiseSalary(7369);

wKiom1fVUOXQv5CLAAB9nNBe5-A878.jpg


创建有参存储过程findEmpNameAndSalAndJob(编号),查询7788号员工的的姓名,职位,月薪,返回多个值,演示out的用法

--定义过程
createorreplaceprocedurefindEmpNameAndSalAndJob(pempnoinnumber,penameoutvarchar2,pjoboutvarchar2,psaloutnumber)
as
begin
selectename,job,salintopename,pjob,psalfromempwhereempno=pempno;
end;
/
--调用过程
declare
penameemp.ename%type;
pjobemp.job%type;
psalemp.sal%type;
begin
findEmpNameAndSalAndJob(7369,pename,psal);
dbms_output.put_line('7369号员工的姓名是'||pename||',职位是'||pjob||',月薪是'||psal);
end;
/

wKiom1fVWY7Aidi_AADctoOCqio886.jpg


什么情况下用exec调用,什么情况下用PLsql调用存储过程?

exec适合于调用存储过程无返回值

plsql适合于调用存储过程有返回值,不管多少个


用存储过程,写一个计算个人所得税的功能

--定义存储过程
createorreplaceprocedureget_rax(salinnumber,raxoutnumber)
as
--sal表示收入
--bal表示需要交税的收收入
balnumber;
begin
bal:=sal-3500;
ifbal<=1500then
rax:=bal*0.03-0;
elsifbal<=4500then
rax:=bal*0.1-105;
elsifbal<=9000then
rax:=bal*0.2-555;
elsifbal<=35000then
rax:=bal*0.25-1005;
elsifbal<=55000then
rax:=bal*0.3-2755;
elsifbal<=80000then
rax:=bal*0.35-5505;
else
rax:=bal*0.45-13505;
endif;
end;
/


--调用存储过程
declare
--需要交的税
raxnumber;
begin
get_rax(&sal,rax);
dbms_output.put_line('你需要交税'||rax);
end;
/

wKioL1fVX6mBSFdJAAC0QtxHYjs076.jpg


2、存储函数



创建无参存储函数getName,有返回值,语法:create or replace function 函数名 return 返回类型 as PLsql程序段

createorreplacefunctionget_namereturnvarchar2
as
begin
return'hello你好';
end;
/


删除存储函数getName,语法:drop function 函数

dropfunctionget_name;


调用存储函数方式一,PLsql程序

declare
namevarchar2(20);
begin
name:=get_name();
dbms_output.put_line(name);
end;
/


调用存储函数方式二,Java程序


创建有参存储函数findEmpIncome(编号),查询7369号员工的年收入,演示in的用法,默认in

--定义存储函数
createorreplacefunctionfindEmpIncome(pempnoinnumber)returnnumber
as
incomenumber;
begin
selectsal*12+NVL(comm,0)intoincomefromempwhereempno=pempno;
returnincome;
end;
/
--调用存储函数
declare
incomenumber;
begin
income:=findEmpIncome(&income);
dbms_output.put_line('该员工的年收入为'||income);
end;
/

wKiom1fVY__jL_zbAACZPDIPKxs205.jpg

创建有参存储函数findEmpNameAndJobAndSal(编号),查询7788号员工的的姓名(return),职位(out),月薪(out),返回多个值

--定义存储函数
createorreplacefunctionfindEmpNameAndJobAndSal(pempnoinnumber,psaloutnumber)returnvarchar2
as
penameemp.ename%type;
begin
selectename,psalfromempwhereempno=pempno;
returnpename;
end;
/

--调用存储函数
declare
penameemp.ename%type;
pjobemp.job%type;
psalemp.sal%type;
begin
pename:=findEmpNameAndJobAndSal(&empno,psal);
dbms_output.put_line('7369号员工的姓名是'||pename||',职位是'||pjob||',月薪是'||psal);
end;
/


3、存储过程和存储函数的适合场景



注意:适合不是强行要使用,只是优先考虑


什么情况下【适合使用】存储过程?什么情况下【适合使用】存储函数

【适合使用】存储过程:无返回值 或 有多个返回值时,适合用过程

【适合使用】存储函数:有且只有一个返回值时,适合用函数

什么情况【适合使用】过程函数,什么情况【适合使用】sql

【适合使用】过程函数

》需要长期保存在数据库

》需要被多个用户重复调用

》业务逻辑相同,只是参数不一样

》批操作大量数据,例如:批量插入很多数据

【适合使用】sql

》凡是上述反面,都可使用sql

》对表,视图,序列,索引,等这些还是要用sql


批量添加操作示例:

--定义过程
createorreplaceprocedurebatchInsert
as
inumber(4):=1;
begin
foriin1..999
loop
insertintoemp(empno,ename)values(i,'员工'||i);
endloop;
end;
/

--调用过程
execbatchInsert;
原文链接:https://www.f2er.com/oracle/212647.html

猜你在找的Oracle相关文章