通過在CREATE PROCEDURE或CREATE FUNCTION語句中包括DEFAULT子句或使用分配運算符:=,可設置形參的默認值。

形參聲明的常規形式如下:

(name [ IN|OUT|IN OUT ] data_type [{DEFAULT | := } expr ])
  • name是分配給參數的標識符。
  • IN|OUT|IN OUT指定參數模式。
  • data_type是分配給變量的數據類型。
  • expr是分配給參數的默認值。如果未包括DEFAULT子句,則調用方必須為參數提供一個值。

每次調用函數或存儲過程時都會計算默認值。例如,將SYSDATE分配給DATE類型的參數會導致參數具有當前調用的時間,而不是創建存儲過程或函數的時間。

以下簡單存儲過程演示了如何使用分配運算符將SYSDATE的默認值設置到參數hiredate中:

CREATE OR REPLACE PROCEDURE hire_emp (
    p_empno         NUMBER,
    p_ename         VARCHAR2,
    p_hiredate      DATE := SYSDATE
)
IS
BEGIN
    INSERT INTO emp(empno, ename, hiredate)
                   VALUES(p_empno, p_ename, p_hiredate);

    DBMS_OUTPUT.PUT_LINE('Hired!');
END hire_emp;

如果參數聲明包括默認值,則在調用存儲過程時可從實參列表中省略該參數。對示例存儲過程 (hire_emp) 的調用必須包含兩個參數:員工編號 (p_empno) 和員工名稱 (p_empno)。第三個參數 (p_hiredate) 默認為SYSDATE的值:

hire_emp (7575, 'Clark')

如果在調用存儲過程時包括實參的值,則該值優先于默認值:

hire_emp (7575, 'Clark', '15-FEB-2010')

添加了一名新員工,其錄用日期為February15, 2010,而與SYSDATE的當前值無關。

您可以通過將分配運算符替換為DEFAULT關鍵字,編寫同一存儲過程:

CREATE OR REPLACE PROCEDURE hire_emp (
    p_empno         NUMBER,
    p_ename         VARCHAR2,
    p_hiredate      DATE DEFAULT SYSDATE
)
IS
BEGIN
    INSERT INTO emp(empno, ename, hiredate)
                   VALUES(p_empno, p_ename, p_hiredate);

    DBMS_OUTPUT.PUT_LINE('Hired!');
END hire_emp;