• Oracle存储过程及函数


    示例所要用到的表结构及相关数据:

     1 SQL> desc emp;
     2 Name     Type         Nullable Default Comments 
     3 -------- ------------ -------- ------- -------- 
     4 EMPNO    NUMBER(4)                              
     5 ENAME    VARCHAR2(10) Y                         
     6 JOB      VARCHAR2(9)  Y                         
     7 MGR      NUMBER(4)    Y                         
     8 HIREDATE DATE         Y                         
     9 SAL      NUMBER(7,2)  Y                         
    10 COMM     NUMBER(7,2)  Y                         
    11 DEPTNO   NUMBER(2)    Y                         
    12  
    13 SQL> select * from emp;
    14  
    15 EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    16 ----- ---------- --------- ----- ----------- --------- --------- ------
    17  7369 SMITH      CLERK      7902 1980/12/17     880.00               20
    18  7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30
    19  7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30
    20  7566 JONES      MANAGER    7839 1981/4/2      2975.00               20
    21  7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30
    22  7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30
    23  7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10
    24  7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20
    25  7839 KING       PRESIDENT       1981/11/17    5000.00               10
    26  7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30
    27  7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20
    28  7900 JAMES      CLERK      7698 1981/12/3      950.00               30
    29  7902 FORD       ANALYST    7566 1981/12/3     3000.00               20
    30  7934 MILLER     CLERK      7782 1982/1/23     1300.00               10
    31  
    32 14 rows selected

    创建过程语句如下:

      CREATE [OR REPLACE] PROCEDURE procedure_name

          [(parameter_name [IN | OUT | IN OUT] type [, ...])]

          {IS | AS}

          BEGIN

           procedure_body

          END procedure_name;

    • OR REPLACE 说明如果过程已经存在,则替换已有的过程
    • procedure_name 指定过程名。
    • parameter_name 指定传递给过程的函数名。可以向一个过程传递多个参数。
    • IN | OUT | IN OUT 定义了参数的模式。每一个参数都可以选择下列模式之一:
      • IN 是参数的默认模式。这种模式定义的参数在程序运行的时候已经具有值,在过程体中不能改变IN参数的值。
      • OUT模式定义的参数只在过程体内部赋值。
      • IN OUT模式定义的参数当过程运行是可能已经具有值,但是在过程体中也可以修改此值。
    • type指定参数的类型
    • procedure_body包含过程的实际代码。

    eg: 根据传入的员工姓名将对应员工的薪水进行调整,调整规则为如果有传入薪水值则以传入值为标准,如果没有传入薪水值则在原来的幅度上上涨10%,最后返回员工的boss的姓名。 

     1 create or replace procedure procedure_demo (
     2        vname in varchar2,
     3        vbossname out varchar2,
     4        vsal in out number
     5 )
     6 as
     7     v_count number;
     8 begin
     9   select count(1into v_count from emp t   where t.ename=vname;
    10   
    11   /*如果输入姓名有误则返回*/
    12   if v_count = 0 then
    13     dbms_output.put_line('输入姓名有误.');
    14     return;
    15    end if;
    16 
    17    /*如果提供了salary则将对应员工的薪水改为传入的薪水值否则在原来的基础上添加10%*/
    18    if vsal is null then
    19      update emp t set t.sal=t.sal*1.1 where t.ename=vname;
    20     else
    21       update emp t set t.sal=vsal where t.ename=vname;
    22     end if;
    23 
    24     select case when t2.ename is null then '自己' else t2.ename end , t1.sal into vbossname, vsal from emp t1, emp t2 where t1.mgr=t2.empno(+and t1.ename=vname ;
    25 
    26     dbms_output.put_line('员工' || vname || '薪水是' || vsal || '他的boss是' || vbossname);
    27     
    28     commit;
    29 
    30 end  procedure_demo;

    调用过程

        CALL procure_name(parameter1, parameter2,...);    

     1 SQL> var ina varchar2;
     2 SQL> var outb varchar2;
     3 SQL> var inoutc number;
     4 SQL> exec :ina := 'SMITH';
     5  
     6 PL/SQL procedure successfully completed
     7 ina
     8 ---------
     9 SMITH
    10  
    11 SQL> exec :inoutc := 800;
    12  
    13 PL/SQL procedure successfully completed
    14 inoutc
    15 ---------
    16 800
    17  
    18 SQL> call procedure_demo(vname => :ina, vbossname => :outb, vsal => :inoutc);
    19  
    20 Method called
    21 ina
    22 ---------
    23 SMITH
    24 outb
    25 ---------
    26 FORD
    27 inoutc
    28 ---------
    29 800
    30  
    31 SQL> select * from emp t where t.ename='SMITH';
    32  
    33 EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    34 ----- ---------- --------- ----- ----------- --------- --------- ------
    35  7369 SMITH      CLERK      7902 1980/12/17     800.00               20
    36  

    删除过程

         DROP PROCEDURE procedure_name;

     eg:    

    1  
    2 SQL> drop procedure procedure_demo;
    3  
    4 Procedure dropped
    5  
    6 SQL> view procedure_demo;
    7 Unknown object: procedure_demo
    8  
    9 SQL> 

    创建函数语句如下:

           CREATE [OR REPLACE] FUNCTION fuction_name

        [(parameter_name [IN | OUT  | IN OUT] type [, ...])]

        RETURN type

        {IS | AS}

        BEGIN

          function_body

        END function_name;

    • OR REPLACE表示如果函数已经存在,则替换现有的函数。
    • function_name指定函数名。
    • parameter_name指定传递给函数的参数名。
    • IN | OUT | IN OUT指定参数的模式。
    • type 指定参数的类型。
    • function_body 包含函数的实际代码。函数体不像过程体,它必须有返回值,其类型在RETURN子句中指定。

    eg:查出emp表中的总人数。

     1 create or replace function tarbitrary return number
     2 
     3 as 
     4  v_count number;
     5 begin
     6    select count(1) into v_count from emp;
     7    
     8    return v_count;
     9 end;
    10 /

       

     调用函数

        select function_name([parmater1, parameter2, ...]) from dual; 

    1 SQL> select tarbitrary() from dual;
    2  
    3 TARBITRARY()
    4 ------------
    5           14

    删除函数

       DROP FUNCTION function_name; 

    1 SQL> drop function tarbitrary;
    2  
    3 Function dropped
  • 相关阅读:
    2020 CCPC Wannafly Winter Camp Day2 E阔力梯的树(树上启发式合并)
    牛客练习赛73D 离别(线段树)
    从零开始部署图书管理系统
    linux下安装nginx(编译安装)及反向代理及负载均衡
    linux下MariaDB安装
    linux下virtualenvwrapper安装
    linux下安装虚拟环境
    linux下安装django2.2
    linux下安装nginx(yum源安装)
    linux系统优化命令--day03
  • 原文地址:https://www.cnblogs.com/tarbitrary/p/4014682.html
Copyright © 2020-2023  润新知