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