一、什么是存储过程:

存储过程(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 过程已成功完成。

 

】 一个带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;

             过程已删除。