• 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;

    过程已删除。

  • 相关阅读:
    zipfile模块——读取(查看)zip压缩文件
    line[:1]和split(',')
    csv文件——简单读操作01
    读取文件内容——读取一个二进制文件,然后保存到另外一个文件
    zipfile模块——从zip文件中 解压缩
    读写操作文件——open()函数与读写文件01
    文件的操作
    csv文件——简单读操作01
    读写操作文件——open()函数与读写文件02
    读取文件内容——open函数
  • 原文地址:https://www.cnblogs.com/downpour/p/3145118.html
Copyright © 2020-2023  润新知