Oracle 存儲過程與函數的創建 以及二者區別

--創建過程

  --語法形式如下

   CREATE [OR REPLACE] PROCEDURE pname

   [ (param1 [mode1]        type1,

      param2 [mode2]        type2,

      …)]

   IS | AS

   [variable1    type3 :=0;

    variable2    type4 :=0;]

   BEGIN   PL/SQL Block

   END [pname];

 

  --OR REPLACE:表示如果同名對象已經存在就覆蓋

  --pname:過程名稱

  --param1、param2:形參名稱

 --mode1、mode2:參數模式,包括IN(輸入參數 默認)、OUT(輸出參數)、IN OUT(既是輸入又是輸出)

  --type1、type2、type3、type4:參數數據類型

  --variable1、variable2:局部變量

  --PL/SQL Block:PL/SQL代碼塊

 

--例:假設現在要創建這樣的過程,實現的功能是要給指定的(通過僱員編號指定)僱員加薪,如果僱員編號在7500以內加薪10%,僱員編號大於等於7500則加薪15%,創建存儲過程的SQL語句如下:

 

CREATE OR REPLACE PROCEDURE raise_salary

  (p_id IN emp.empno%TYPE)

IS

BEGIN

  IF p_id >= 7500 THEN

    BEGIN

      UPDATE emp

      SET sal = sal * 1.15

      WHERE empno = p_id;

    END;

  END IF;

  IF p_id < 7500 THEN

    BEGIN

      UPDATE emp

      SET sal = sal * 1.10

      WHERE empno = p_id;

    END;

  END IF;

END raise_salary;

 

--注意:

  --1.end、end if 、end 過程名 後一定要加;號

  --2.if裏面的begin end 可以省略

  --3.update執行語句後加;號

  --4.emp.empno%TYPE 表示與emp表裏的empno列數據類型相同

 

--整理後

CREATE OR REPLACE PROCEDURE raise_salary

  (p_id IN number)

IS

BEGIN

  IF p_id >= 7500 THEN

      UPDATE emp

      SET sal = sal * 1.15

      WHERE empno = p_id;

  else

      UPDATE emp

      SET sal = sal * 1.10

      WHERE empno = p_id;

  END IF;

END raise_salary;

 

--調用過程

  --通過PL/SQL Dev查看Procedures文件夾,右鍵點擊raise_salary過程,選擇“Test”,在彈出的窗口中對應p_id這個形參輸入實參然後選中彈出窗口中的代碼進行執行即可

 

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

 

--創建函數

  --創建函數的語法形式如下

CREATE [OR REPLACE] FUNCTION fname

 [ (param1        [mode1]        type1,

    param2        [mode2]        type2,

      …)]

RETURN type     //這一行後不能加;號

IS | AS

        [variable1    type3 :=0;

         variable2    type4 :=0;]

BEGIN

PL/SQL Block

END [fname]

 

--注意:

  --1.end、end if 、end 過程名 後一定要加;號

 

--例1假設要創建一個通過員工號獲取上級管理者編號的函數,其SQL語句如下

CREATE OR REPLACE FUNCTION get_mgr_id

  (p_id IN number)

  RETURN NUMBER

IS

  v_mgr_id number :=0;

BEGIN

  SELECT mgr INTO v_mgr_id

  FROM emp WHERE empno = p_id;

  RETURN v_mgr_id;

END get_mgr_id;

 

 

--例2:函數功能:判斷一個數是否能整除另一個數,可以返回1,不可以返回0

CREATE OR REPLACE FUNCTION division
  (divisor IN number,
     dividend IN number)
  RETURN NUMBER
IS
BEGIN
  IF mod(divisor,dividend)=0 then
     RETURN 1;
    ELSE
       RETURN 0;
    END IF;
END division;

 

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

 

--函數與過程的區別

  --1.函數多用於計算,過程用於執行特定的任務

  --2.函數聲明爲FUNCTION,過程聲明爲PROCEDURE

  --3.函數需要描述返回類型,並且PL/SQL語句塊中至少有一個有效的RETURN語句;過程無返回值,可通過輸出參數返回多個值

  --4.函數不能獨立運行,過程可作爲一個獨立的PL/SQL語句運行

  --5.在DML和DQL中可以調用函數,但不能調用過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章