存储过程

一、什么是存储过程:
     存储过程(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;
             过程已删除。
posted @ 2019-12-21 22:51  w'c's  阅读(1606)  评论(0编辑  收藏  举报