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;

过程已删除。

原文地址:https://www.cnblogs.com/downpour/p/3145118.html