存储过程
一、什么是存储过程:
存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。在ORACLE 中,若干个有联系的过程可以组合在一起构成程序包。其优点如下:
1. 存储过程和函数以命名的数据库对象形式存储于数据库当中。存储在数据库中的优点是很明显的,因为代码不保存在本地,用户可以在任何客户机上登录到数据库,并调用或修改代码。
2. 存储过程和函数可由数据库提供安全保证,要想使用存储过程和函数,需要有存储过程和函数的所有者的授权,只有被授权的用户或创建者本身才能执行存储过程或调用函数。
3. 存储过程和函数的信息是写入数据字典的,所以存储过程可以看作是一个公用模块,用户编写的PL/SQL程序或其他存储过程都可以调用它(但存储过程和函数不能调用PL/SQL程序)。一个重复使用的功能,可以设计成为存储过程。
4. 像其他高级语言的过程和函数一样,可以传递参数给存储过程或函数,参数的传递也有多种方式。存储过程可以有返回值,也可以没有返回值,存储过程的返回值必须通过参数带回;函数有一定的数据类型,像其他的标准函数一样,我们可以通过对函数名的调用返回函数值。
5. 存储过程和函数需要进行编译,以排除语法错误,只有编译通过才能调用。
二、 创建存储过程:
create [or replace] procedure 存储过程名 [(输入、输出参数、in/out模式参数)]
is/as
begin
sentences;
[exception
sentences;]
end 存储过程名;
【例1】 一个没有参数的存储过程:
SQL>set serveroutput on
SQL> create or replace procedure pro_no_par is
2 begin
3 update emp set sal=sal+800 where id=3;
4 commit;
5 dbms_output.put_line('工资已经调整!!');
6 end pro_no_par;
7 /
SQL> execute pro_no_par;
工资已经调整!!
PL/SQL 过程已成功完成。
【例2】 一个带in模式参数的存储过程( 参数的方式有三种:指定名称传递;按位置传递;混合方式传递)
SQL> set serveroutput on
SQL> create or replace procedure pro_in_par
2 (var_1 in nvarchar2,
3 var_2 in number) is
4 begin
5 update emp set sal=sal+var_2 where ename=var_1;
6 commit;
7 dbms_output.put_line(var_1 ||'的工资已经增加了'||var_2||'元!');
8 end pro_in_par;
9 /
SQL> execute pro_in_par('Smith',1500);
Smith的工资已经增加了1500元!
【例3】 一个带out模式和in out模式参数存储过程
SQL> create or replace procedure pro_out_par
2 (var_1 in out number,
3 var_2 out emp.ename%type,
4 var_3 out emp.sal%type) is
5 begin
6 select ename,sal into var_2,var_3 from emp where id=var_1;
7 end pro_out_par;
8 /
SQL>set serveroutput on
SQL>declare
2 ex_var_1 number;
3 ex_var_2 emp.ename%type;
4 ex_var_3 emp.sal%type;
5 begin
6 ex_var_1:=8;
7 pro_out_par(ex_var_1,ex_var_2,ex_var_3);
8 dbms_output.put_line('员工号为'||ex_var_1||'的员工姓名是:'||ex_var_2||'工资是:'||ex_var_3);
9 end;
10 /
员工号为8的员工姓名是:周瑜工资是:8500
三、存储过程参数说明:三种形式的参数
1. IN 定义一个输入参数变量,用于传递参数给存储过程
2. OUT 定义一个输出参数变量,用于从存储过程获取数据
3. IN OUT 定义一个输入、输出参数变量,兼有以上两者的功能
四、 删除存储过程
DROP PROCEDURE 存储过程名;
例如:
SQL> drop procedure pro_no_par;
过程已删除。