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

 

 

建立過程語句以下:spa

  CREATE [OR REPLACE] PROCEDURE procedure_namecode

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

      {IS | AS}it

      BEGINio

       procedure_bodyfunction

      END procedure_name;class

 

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

調用過程object

    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
相關文章
相關標籤/搜索