*存储过程*

*概念:*

之前我们编写的plsql程序可以进行表的操作,判断、循环逻辑处理的工作,但无法重复调用。

可以理解之前的代码全部编写在了main方法中,是匿名程序,java可以通过封装对象和方法来解决复用问题。

Plsql是将一个个plsql的业务员处理过程存储起来进行复用,这些被存储起来的plsql程序称之为存储过程。

*存储过程作用:*

\1. 在开发程序中,为了一个特定的业务功能,会向数据库进行多次连接关闭(连接关闭是很消费数据库资源的),需要对数据库进行多次i/o读写,性能比较低,如果把这些业务放到plsql中,在应用程序中只需要调用plsql就可以做到连接关闭一次数据库就可以实现我们的业务,可以大大提高效率。

\2. Oracle官方给的建议:能够让数据库操作的不要放在程序中。在数据库中实现基本上不会出现错误,在程序中操作可能会存在错误,(如果在数据库中操作数据,可以有一定的日志恢复等功能)

*语法*

Create or replace procedure 过程名称[(参数列表)] is
Begin

End [过程名称]

根据参数的类型,我们将其分为3类讲解:

不带参数的

带有输入参数的

带输入输出参数(返回值)的

*不带参数的存储过程:*

oracle储存过程--存储过程_带参数
*小案例(热身)**打印输出:hello world*

create or replace procedure p_hello is
begin
   dbms_output.put_line('hello world');
end p_hello;

调用存储过程:

begin
 p_hello;
end;

我们刚才创建的存储过程:
oracle储存过程--存储过程_存储过程_02

注意:***

第一个问题: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