Oracle 子程序:过程

子程序的概述:

  —— 子程序是一个被命名的PL/SQL块,被编译好并存储在了数据库当中。

 

 

  笔者在学习的过程中发现:在掌握了PL/SQL块以及Cursor之后,便能够解决一些较为复杂的业务逻辑了,但是同时也发觉这样的一段代码块只是“一次性产物”,如何能够让代码块体现出复用性? 无疑,子程序就能很好的解决这样问题。子程序不仅实现了复用性,同时还具备安全性、可维护性的优点,当提起子程序,引出的其一便是【过程】

 

  过程:用于完成某种任务的子程序;创建一个过程大大简化了程序的开发。(但是众所周知,越是在底层的地方解决业务逻辑,就越是难以维护)

 

  如何创建过程[创建过程的语法]:

 

1     create [or replace] procedure <procedure_name>[(parameter list)]  
2     as|is  
3       <local variable declaration>  
4     begin  
5       <executable statements>  
6     [exception <exception handlers>]  
7     end;  
8       
9     --需要注意的是过程体内不可以select不可用于查询,而只做赋值作用 select ... into param form ...  

 

  首先尝试,创建过程来实现一个功能:查询出emp表中最高薪资以及最低薪资分别是多少;

 

    /*  
    create or replace procedure 过程名[(参数列表)]  
    as|is  
        申明变量  
    begin  
        可执行部分  
    exception  
        例外处理  
    end;  
    */  
      
    --创建"查询出emp表中最高薪资自己最低薪资分别是多少"的过程  
      
    create or replace procedure proc_max_min  
    as  
        v_max emp.sal%type;  
        v_min emp.sal%type;  
    begin  
        select max(sal),min(sal) into v_max,v_min from emp;  
        dbms_output.put_line('最高薪资:'||v_max);  
        dbms_output.put_line('最低薪资:'||v_min);  
    end;  

 

非常的简单,并没有什么难度。接下来再写几个较为简单,但是带有参数的过程。

    /*过程中的参数有三种类型:in , out , in out  
    in : 默认的参数类型,作输入  
    out : 作输出  
    in out : 可输入,可输出  
    */  
      
    --根据传入的薪资范围,统计在这个范围内的有多少人;  
      
    create or replace procedure proc_checksal(  
        v_start emp.sal%type,  
        v_end emp.sal%type  
    )  
    as  
        v_count numer;  
    begin  
        select count(*) into v_count from emp  
        where sal between v_start and v_end;  
      
        dbms_output.put_line('在指定薪资范围内的人数统计为:'||v_count);  
    end;  
      
      
    /*  
      请查询出员工待遇最高的员工姓名(out参数)  
    */  
    create or replace procedure proc_checkname(  
          v_name out emp.ename%type  
    )  
    as  
    begin  
      select ename into v_name from emp where sal=(  
        select max(sal) from emp   
      );  
    end;  
    -----调用-----  
    declare  
    v_name emp.ename%type;  
    begin  
      proc_checkname(v_name);  
      dbms_output.put_line('最高工资员工姓名是:'||v_name);  
    end;  

需要注意的是,过程创建之后,只属于当前创建用户,而其他非DBA用户想要调用这个过程是不具备权限的。必须由DBA或过程创建角色授予其他角色过程的execute权限才可以调用,具体的授权方法如下:

    grant execute on procedure_name to user_name  

过程创建之后,还可以通过user_objects查看,如果想要查看源码可以通过user_source查看;

    select * from user_objects;  
      
    select name,line,text from user_source where name = 'PROCEDURE_NAME'  

  如果要删除一个过程可以使用drop

drop procedure procedure_name;  

 

 

 

posted @ 2017-08-02 16:57  木栩  阅读(537)  评论(0编辑  收藏  举报