通过在 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)

添加了一名新员工,其录用日期为 February 15, 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;