oracle存储过程总结2

1 存储子程序
存储子程序是指被命名的PL/SQL块,以编译的形式存储在数据库服务器中,可以在应用程序中进行调用,是PL/SQL程序模块化的一种体现。PL/SQL中的存储子程序包括存储过程和(存储)函数两种。通常,存储过程用于执行特定的操作,不需要返回值;而函数则用于返回特定的数据。在调用时,存储过程可以作为一个独立的表达式被调用,而函数只能作为表达式的一个组成部分被调用。
存储子程序是以独立对象的形式存储在数据库服务器中的,因此是一种全局结构,与之对应的是局部子程序,即嵌套在PL/SQL块中的局部过程和函数,其存储位置取决于其所在的父块的位置。
2 存储过程
3.存储过程的创建
create [or replace] procedure procedure_name(
parameter1_name [mode] datatype [default|:=value]
[,parameter2_name [mode] datatype [default|:=value],...]
)
as|is
/*declarative section is here*/
begin
/*executable section is here*/
exception
/*exception section is here*/
end[procedure_name];
--参数说明:
(1)参数的模式
PL/SQL子程序参数模式包括IN,OUT,IN OUT三种。
* IN(默认参数模式)表示当过程被调用时,实参值被传递个形参;在过程内,
形参起常数作用,只能读改参数,而不能修改该参数;当子程序调用
结束返回调用环境时,实参没有被改变。
* OUT表示当过程被调用时,实参值被忽略;在过程内,形参起未初始化的PL/SQL
变量作用,初始值为NULL,可以进行读/写操作;当子程序调用结束后
返回调用环境时,形参的值被赋给实参。
* IN OUT表示当过程被调用时,实参值被传递给形参;在过程内,形参起已初始
化的PL/SQL变量作用,可读可写;当子程序调用结束返回调用环境时,
形参值被赋给实参。
(2)参数的限制
在声明参数时,不能定义形参的长度或精度、刻度,他们是作为参数传递机制的一部分被传递的,是由实参决定的。
(3)参数传递方式
当子程序被调用时,实参与形参之间值的传递方式取决于参数的模式。IN参数为引用传递,即实参指针被传递给形参;OUT,IN OUT参数为值传递,即实参的值被复制给形参。
--例如,创建一个存储过程,以部门号为参数,查询该部门的平均工资,并输出该部门中比平均工资高的员工号,员工名。
create or replace procedure show_emp(
p_deptno emp.deptno%type
)
as
v_sal emp.sal%type;
begin
select avg(sal) into v_sal from emp where deptno=p_deptno;
dbms_output.put_line(p_deptno||' '||'average salary is:'||v_sal);
for v_emp in (select * from emp where deptno=p_deptno and sal>v_sal)
   loop
     dbms_output.put_line(v_emp.empno||' '||v_emp.ename);
end loop;
exception
when no_data_found then
   dbms_output.put_line('the department doesn''t exists!');
end show_emp;
通常,存储过程不需要返回值,如果需要返回一个值可以通过函数调用来实现。但是如果希望返回多个值,可以使用OUT或IN OUT模式参数来实现。
--例如,创建一个存储过程,以部门号为参数,返回该部门的人数和平均工资。
create or replace procedure return_deptinfo(
p_deptno emp.deptno%type,
p_avgsal out emp.sal%type,
p_count out number
)
as
begin
select avg(sal),count(*) into p_avgsal,p_count from emp
   where deptno=p_deptno;
exception
when no_data_found then
   dbms_output.put_line('the department don''t exists!');
end return_deptinfo;
4  存储过程的调用
存储子程序创建后,以编译的形式存储于数据库服务器端,供应用程序调用。如果不调用,存储子程序是不会执行的。通过子程序名称调用子程序时,实参的数量、顺序、类型要与形参的数量、顺序、类型相匹配。此外,由于OUT、IN OUT模式参数在子程序调用结束时,将形参的值赋给实参,因此实参必须是变量,而不能是常量,但是对于IN模式的实参可以是常量,也可以是变量。
(1)在SQL*PLUS中调用存储过程
execute show_emp(10);

call show_emp(10);
(2)在PL/SQL程序中调用存储过程
--在PL/SQL程序中,存储过程可以作为一个独立的表达式被调用。
declare
v_avgsal emp.sal%type;
v_count number;
begin
show_emp(20);
return_deptinfo(10,v_avgsal,v_count);
dbms_output.put_line(v_avgsal||' '||v_count);
end;
/
5.  存储过程的管理
(1)修改存储过程
为了修改存储过程,可以先删除该存储过程,然后重新创建,但是这样需要为新创建的存储过程重新进行权限分配。如果采用create or replace procedure方式重新创建并覆盖原由的存储过程,则会保留原有的权限分配。
(2)重新编译存储过程
使用alter procedure...compile命令重新编译存储过程。
alter procedure show_emp compile;
(3)删除存储过程
drop procedure show_emp; [/size]

你可能感兴趣的:(数据结构,oracle,sql,应用服务器)