oracle实验41:编写存储过程
存储过程
- 是命了名的PL/SQL块
 - 可以有零个或多个参数
 - 可以没有返回值,也可以有一个或多个返回值
 - 以编译后的形式存放在数据库中
 - 由开发语言调用或者PL/SQL块中调用。
 - 是一种用来执行某些操作的子程序。
 
存储过程创建语法
CREATE [OR REPLACE] PROCEDURE 
[schema.]procedure_name[(argument [in|out|inout] type…)]
IS | AS
[本地变量声明]
BEGIN
  -执行语句部分
[EXCEPTION]
  -错误处理部分
END[procedure_name];
-在Sql*Plus 中使用CREATE OR REPLACE子句创建存储程序单元。
-在头部定义所有参数。
-在IS之后,声明本地变量,不需要使用DECLARE开始声明。
-BEGIN开始程序的执行主体。
-oracle图形化界面“Enterprise Manager Console”来创建存储过程。
参数
参数可以为任何合法的PL/SQL类型
参数模式:IN,OUT,IN OUT。
- 
- IN,就是从调用环境通过参数传入值,在过程中只能被读取,不能改变。
 - OUT,由过程赋值并传递给调用环境。不能是具有默认值的变量,也不能是常量,过程中要给OUT参数传递返回值。
 - IN OUT ,具有IN 参数和OUT 参数两者的特性,在过程中即可传入值,也可传出值。
 
 
实验41:编写存储过程
参数导入型的存储过程(in)
SQL> create or replace procedure p1
    (v_id in emp.empno%type)
    is
    begin
    update emp
    set sal=sal+1
    where empno=v_id;
    commit;
    end p1;
    /
过程已创建。
验证原程序
SQL> select text from user_source where name='P1';
TEXT                                                                            
--------------------------------------------------------------------------------
procedure p1                                                                    
(v_id in emp.empno%type)                                                        
is                                                                              
begin                                                                           
update emp                                                                      
set sal=sal+1                                                                   
where empno=v_id;                                                               
commit;                                                                         
end p1;                                                                         
已选择9行。
在user_objects数据字典中查看存储过程。
SQL> COL OBJECT_NAME FOR A12
SQL> select object_name,object_type,status from user_objects where object_type='PROCEDURE';
OBJECT_NAME  OBJECT_TYPE         STATUS                                         
--------------- -------------------- ---------                                    
P1                   PROCEDURE            VALID                                          
执行存储过程
SQL> EXECUTE P1(7369) --单独执行过程
PL/SQL 过程已成功完成。
SQL> SELECT EMPNO , SAL FROM EMP;
     EMPNO        SAL                                                           
---------- ----------                                                           
      7369        801                                                           
      7499       1600                                                           
      7521       1250                                                           
      7566       2975                                                           
      7654       1250                                                           
      7698       2850                                                           
      7782       2450                                                           
      7839       5000                                                           
      7844       1500                                                           
      7900        950                                                           
      7902       3000                                                           
     EMPNO        SAL                                                           
---------- ----------                                                           
      7934       1300                                                           
已选择12行。
 SQL> BEGIN  --在模块中调用
  2      P1(7499);
  3      P1(7844);
  4      P1(7902);
  5      END;
  6      /
PL/SQL 过程已成功完成。
SQL> SELECT EMPNO , SAL FROM EMP;
     EMPNO        SAL                                                           
---------- ----------                                                           
      7369        801                                                           
      7499       1601                                                           
      7521       1250                                                           
      7566       2975                                                           
      7654       1250                                                           
      7698       2850                                                           
      7782       2450                                                           
      7839       5000                                                           
      7844       1501                                                           
      7900        950                                                           
      7902       3001                                                                                                                    
      7934       1300                                                           
已选择12行。
参数导入和导出型的存储过程(in/out)
SQL> create or replace procedure query_emp
    (v_id in emp.empno%type,
     v_name out emp.ename%type,
     v_salary out emp.sal%type,
     v_comm out emp.comm%type)
    is
    begin
    select ename,sal,comm
    into v_name,v_salary,v_comm
    from emp
    where empno=v_id;
    end query_emp;
    /
过程已创建。
SQL> select empno,ename,sal,comm from emp;
     EMPNO ENAME             SAL       COMM                                     
---------- ---------- ---------- ----------                                     
      7369 SMITH             801                                                
      7499 ALLEN            1601        300                                     
      7521 WARD             1250        500                                     
      7566 JONES            2975                                                
      7654 MARTIN           1250       1400                                     
      7698 BLAKE            2850                                                
      7782 CLARK            2450                                                
      7839 KING               5000                                                
      7844 TURNER           1501          0                                     
      7900 JAMES             950                                                
      7902 FORD             3001                                                                                     
      7934 MILLER           1300                                                
已选择12行。
传变量到调用的模块
SQL> declare
  2  v1 emp.ename%type;
  3  v2 emp.sal%type;
  4  v3 emp.comm%type;
  5  begin
  6  query_emp(7654,v1,v2,v3);
  7  dbms_output.put_line(v1);
  8  dbms_output.put_line(v2);
  9  dbms_output.put_line(v3);
 10  end;
 11  /
MARTIN                                                                          
1250                                                                            
1400                                                                            
PL/SQL 过程已成功完成。
SQL> select empno,ename,sal,comm from emp where empno=7654;
     EMPNO ENAME             SAL       COMM                                     
---------- ---------- ---------- ----------                                     
      7654 MARTIN           1250       1400                                     
参数导入和导出共用变量型的存储过程(in out)
SQL> create or replace procedure format_phone
  2  (v_phone_no in out varchar2)
  3  is
  4  begin
  5  v_phone_no:='('||substr(v_phone_no,1,3)||')'||substr(v_phone_no,4,3)||'-'||substr(v_phone_no,7);
  6  end format_phone;
  7  /
过程已创建。
传变量到调用的模块
SQL> declare
  2  v1 varchar2(20);
  3  begin
  4  v1:='010456789';
  5  format_phone(v1);
  6  dbms_output.put_line(v1);
  7  end;
  8  /
(010)456-789                                                                    
PL/SQL 过程已成功完成。
删除存储过程
DROP PROCEDURE [procedure_name];
SQL> drop procedure query_emp;
过程已删除。
                    
                
                
            
        
浙公网安备 33010602011771号