存储过程
什么是存储过程【procedure】
事先运用oracle语法,写好的一段具有业务功能的程序片段,长期保存在oracle服务器中,供oracle客户端(sqlplus)和程序语言远程访问,类似于Java的函数。
为什么要用存储过程?
(1)PLSQL每次执行都要整体运行一遍,才有结果
(2)PLSQL不能将其封装起来,长期保存在oracle服务器中
(3)PLSQL不能被其它应用程序调用,例如:Java
存储过程与PLSQL是什么关系?
存储过程是PLSQL的一个方面的应用,而PLSQL是存储过程的基础。即存储过程需要用到PLSQL。
过程和函数的作用
创建存储过程语法:
create [or replace] procedure 过程名 [(参数列表)]
as --声明
;
begin --执行
;
exception --存储过程异常
;
end;
/
--创建无参存储过程
create or replace procedure hello
as
begin
dbms_output.put_line('这是我的第一个存储过程');
end;
/
调用存储过程:
--如果是命令窗口就用exec 存储过程名,举个栗子:
exec hello;
--如果是PL/SQL窗口就用 begin 存储过程名 end; 举个栗子:
begin
hello;
end;
/
--如果是程序中调用就用 call 存储过程名 ,举个栗子:
call hello();
删除存储过程hello,语法:drop procedure 过程名
drop procedure hello;
--创建带参存储过程
create or replace procedure queryempname(sfindno emp.empno%type)
as
sName emp.ename%type;
sjob emp.job%type;
begin
...
exception
...
end;
/
--创建带参存储过程含赋值方法
IN表示参数赋值,是参数的默认模式,可以不写
OUT表示返回值参数,类型可以使用任意Oracle中的合法类型,OUT模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程。
IN OUT表示该参数可以向该过程中传递值,也可以将某个值传出去。
--创建有参存储过程raiseSalary(编号),为7369号员工涨10%的工资,演示in的用法
--定义过程
create or replace procedure raiseSalary(pempno in numeber)
as
begin
update emp set sal=sal*1.2 where empno = pempno;
end;
/
--调用过程
exec raiseSalary(7369);
--创建有参存储过程findEmpNameAndSalAndJob(编号),查询7788号员工的的姓名,职位,月薪,返回多个值,演示out的用法
--定义过程
create or replace procedure findEmpNameAndSalAndJob(pempno in number,pename out varchar2,pjob out varchar2,psal out number)
as
begin
select ename,job,sal into pename,pjob,psal from emp where empno = 7788;
end;
/
--调用过程
declare
pename emp.ename%type;
pjob emp.job%type;
psal emp.sal%type;
begin
findEmpNameAndSalAndJob(7788,pename,pjob,psal);
dbms_output.put_line('7788号员工'||pename||'————'||pjob||'————'||psal);
end;
/