*存储过程*
*概念:*
之前我们编写的plsql程序可以进行表的操作,判断、循环逻辑处理的工作,但无法重复调用。
可以理解之前的代码全部编写在了main方法中,是匿名程序,java可以通过封装对象和方法来解决复用问题。
Plsql是将一个个plsql的业务员处理过程存储起来进行复用,这些被存储起来的plsql程序称之为存储过程。
*存储过程作用:*
\1. 在开发程序中,为了一个特定的业务功能,会向数据库进行多次连接关闭(连接关闭是很消费数据库资源的),需要对数据库进行多次i/o读写,性能比较低,如果把这些业务放到plsql中,在应用程序中只需要调用plsql就可以做到连接关闭一次数据库就可以实现我们的业务,可以大大提高效率。
\2. Oracle官方给的建议:能够让数据库操作的不要放在程序中。在数据库中实现基本上不会出现错误,在程序中操作可能会存在错误,(如果在数据库中操作数据,可以有一定的日志恢复等功能)
*语法*
Create or replace procedure 过程名称[(参数列表)] is
Begin
End [过程名称]
根据参数的类型,我们将其分为3类讲解:
不带参数的
带有输入参数的
带输入输出参数(返回值)的
*不带参数的存储过程:*
*小案例(热身)**打印输出:hello world*
create or replace procedure p_hello is
begin
dbms_output.put_line('hello world');
end p_hello;
调用存储过程:
begin
p_hello;
end;
我们刚才创建的存储过程:
注意:***
第一个问题:is 和 as是可以互相使用的,用哪个关键字是没有关系的
第二个问题:过程中没有declare关键字,declare用在语句块中
*带有输入参数的存储过程*
【示例】查询并打印某个员工(如7839号员工)的姓名和薪水-存储过程:要求,调用的时候传入员工编号,自动控制台打印。
create or replace procedure p_querynameandsal(i_empno in emp.empno%type) as
--声明变量
v_name emp.ename%type;
v_sal emp.sal%type;
begin
--查询emp表中某个员工的姓名和薪水并赋值给变量
select ename,sal into v_name,v_sal from emp where empno=i_empno;
dbms_output.put_line(v_name||'-'||v_sal);
end;
--end 后面的存储过程名字必须和前面声明的名字保持一致,要不就不要写
执行:
begin
p_querynameandsal(7839);
end;
执行结果:KING-5000
*带输入输出参数的存储过程*
小案例;查询7839号员工的薪水,并将薪水结果返回并且输出。
create or replace procedure p_querysal_out(i_empno in emp.empno%type,o_sal out emp.sal%type) as
begin
--查询emp表中某个员工的薪水并将查询返回
select sal into o_sal from emp where empno=i_empno;
end;
--end 后面的存储过程名字必须和前面声明的名字保持一致,要不就不要写
执行该存储过程:
declare
--声明变量接收存储过程中的输出参数
v_sal emp.sal%type;
begin
p_querysal_out(7839,v_sal);
dbms_output.put_line('薪水:'||v_sal);
end;
*执行结果:
薪水:5000