在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的参数会使这个参数具有当前的调用时间,而不是创建存储过程或函数的时间。

下列存储过程演示了如何使用赋值运算符来设置参数hiredate中SYSDATE的缺省值:
CREATE OR REPLACE PROCEDURE hire_emp (
    p_empno         NUMBER,
    p_ename         VARCHAR2,
    p_hiredate      DATE := SYSDATE
) RETURN 
IS
BEGIN
    INSERT INTO emp(empno, ename, hiredate)
                   VALUES(p_empno, p_ename, p_hiredate);

    DBMS_OUTPUT.PUT_LINE('Hired!');
END emp_comp;
如果在参数声明中包括了缺省值,那么当调用函数时我们就可以从实际参数列表中省略参数。对于上述示例存储过程(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
) RETURN 
IS
BEGIN
    INSERT INTO emp(empno, ename, hiredate)
                   VALUES(p_empno, p_ename, p_hiredate);

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