使用out引數模式的過程

skyin_1603發表於2016-11-14

過程或者函式引數的傳遞模式有3中:in、out與in out三種。
out模式的引數就是作為結果輸出的引數。

---建立一個使用out引數模式過程:

--切換到Scott使用者:

scott@PROD>show user

USER is "SCOTT"

 

--檢視emp表的表結構與資料:

--表結構:

scott@PROD>desc emp;

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 EMPNO                                     NOT NULL NUMBER(4)

 ENAME                                              VARCHAR2(10)

 JOB                                                VARCHAR2(9)

 MGR                                                NUMBER(4)

 HIREDATE                                           DATE

 SAL                                                NUMBER(7,2)

 COMM                                               NUMBER(7,2)

 DEPTNO                                             NUMBER(2)

 

--表記錄:

scott@PROD>select empno,ename,job,sal,deptno

  2  from emp;

     EMPNO ENAME      JOB              SAL     DEPTNO

---------- ---------- --------- ---------- ----------

      7369 SMITH      CLERK            800         20

      7499 ALLEN      SALESMAN        1600         30

      7521 WARD       SALESMAN        1250         30

      7566 JONES      MANAGER         2975         20

      7654 MARTIN     SALESMAN        1250         30

      7698 BLAKE      MANAGER         2850         30

      7782 CLARK      MANAGER         2450         10

      7788 SCOTT      ANALYST         3000         20

      7839 KING       PRESIDENT       5000         10

      7844 TURNER     SALESMAN        1500         30

      7876 ADAMS      CLERK           1100         20

 

     EMPNO ENAME      JOB              SAL     DEPTNO

---------- ---------- --------- ---------- ----------

      7900 JAMES      CLERK            950         30

      7902 FORD       ANALYST         3000         20

      7934 MILLER     CLERK           1300         10

14 rows selected.

 

--透過員工號,根據不同工作來確定該員工加薪,president1000manager500

salesman300,其他加100,最後並顯示員工的姓名與工資,使用inout引數:

scott@PROD>create or replace procedure display_wage(

  2  v_id in emp.empno%type,

  3  v_name out emp.ename%type,

  4  v_wage out emp.sal%type)

  5  as

  6  v_work emp.job%type;

  7  begin

  8  select job into v_work

  9  from emp where empno=v_id;

 10  case

 11  when v_work='PRESIDENT' then

 12  update emp set sal = sal+1000

 13  where empno = v_id;

 14  when v_work ='MANAGER' then

 15  update emp set sal = sal+500

 16  where empno = v_id;

 17  when v_work ='SALESMAN' then

 18  update emp set sal = sal+300

 19  where empno = v_id;

 20  else

 21  update emp set sal = sal+100

 22   where empno = v_id;

 23  end case;

 24  select ename,sal into v_name,v_wage

 25  from emp where empno = v_id;

 26  end display_wage;

 27  /

Procedure created.

#過程已經成功建立。

 

---呼叫過程:

scott@PROD>call display_wage(7839,:v_name,:v_wage);

Call completed.

scott@PROD>variable v_name varchar2(10)

scott@PROD>variable v_wage number

scott@PROD>call display_wage(7839,:v_name,:v_wage);

Call completed.

 

scott@PROD>print v_name v_wage

V_NAME

--------------------------------

KING

    V_WAGE

----------

      6000

 

---執行過程後與直接SQL查詢對比:

scott@PROD>select ename,job,sal

  2  from emp where empno=7839;

ENAME      JOB              SAL

---------- --------- ----------

KING       PRESIDENT       6000

#這個顯然是執行過程後作了更新的資料。

 

--更新之前的資料:

7839 KING       PRESIDENT       5000         10

 

---再次檢視另外員工號為7698員工的姓名與工資:

--執行過程更新後的資料:

scott@PROD>execute display_wage(7698,:v_name,:v_wage);

PL/SQL procedure successfully completed.

 

scott@PROD>print v_name v_wage

V_NAME

--------------------------------

BLAKE

 

    V_WAGE

----------

      3350

---回滾與執行過程前的對比:

Rollback complete.

scott@PROD>select ename,job,sal

  2  from emp where empno=7698;

ENAME      JOB              SAL

---------- --------- ----------

BLAKE      MANAGER         2850

#可以看出增加了過程中執行的新增500元。

#因為之前已經明確過v_namev_wage兩個引數變數。

scott@PROD>variable v_name varchar2(10)

scott@PROD>variable v_wage number

--本例子中,同時使用了in與out兩種模式,這裡作了一個很好的對比。
in模式就是透過輸入引數值給過程呼叫,而out就是過程透過呼叫過程把
結果傳遞給形參:v_name,:v_wage,然後形參再傳遞給實參 v_name v_wage,
而這兩個就是作為輸出結果。




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31392094/viewspace-2128471/,如需轉載,請註明出處,否則將追究法律責任。

相關文章