IN模式子程序参数默认值
当声明了IN模式的形参,可以为它指定默认值。带有默认值的参数称为可选参数,因为在子程序调用时,相应的实参是可选的。如果实参被忽略,则调用会将默认值赋值给形参。没有默认值的形参称为必须参数,因为在子程序调用时,相应的实参是必须的。
忽略实参不会使相应的形参的值为NULL。如果想使形参的值为NULL,则需要将NULL指定为该形参的默认值或指定给形参。
DECLARE PROCEDURE raise_salary ( emp_id IN employees.employee_id%TYPE, amount IN employees.salary%TYPE := 100, extra IN employees.salary%TYPE := 50 ) IS BEGIN UPDATE employees SET salary = salary + amount + extra WHERE employee_id = emp_id; END raise_salary;
BEGIN raise_salary(120); -- 相当于raise_salary(120, 100, 50) raise_salary(121, 200); -- 相当于raise_salary(121, 200, 50) END; |
在上例中过程的调用指定实参与形参定义的顺序一致,即调用使用位置符号;位置符号不允许你忽略第2个参数而指定第3个参数,如果要这样做必须使用名称符号或混合符号。
形参的默认值可以是任何表达式,它的值可以被赋值给该形参,即值和形参必须有兼容的数据类型。如果子程序调用为形参指定了实参,则调用中不会计算默认值。
--提供默认参数值 DECLARE global PLS_INTEGER := 0;
FUNCTION f RETURN PLS_INTEGER IS BEGIN DBMS_OUTPUT.PUT_LINE('在函数f中.'); global := global + 1; RETURN global * 2; END f;
PROCEDURE p (x IN PLS_INTEGER := f()) IS BEGIN DBMS_OUTPUT.PUT_LINE ('在P中. ' || ' global = ' || global || ', x = ' || x || '.' ); DBMS_OUTPUT.PUT_LINE('--------------------------------'); END p;
PROCEDURE pre_p IS BEGIN DBMS_OUTPUT.PUT_LINE ('调用P之前, global = ' || global || '.'); DBMS_OUTPUT.PUT_LINE('调用P.'); END pre_p;
BEGIN pre_p; p(); -- 默认值被计算
pre_p; p(100); -- 默认值不被计算
pre_p; p(); -- 默认值被计算 END;
|
--创建子程序 CREATE OR REPLACE PROCEDURE print_name ( first VARCHAR2, last VARCHAR2) IS BEGIN DBMS_OUTPUT.PUT_LINE(first || ' ' || last); END print_name; /
--调用子程序 BEGIN print_name('John', 'Doe'); END; /
--给子程序添加一个新的参数,不影响原有对子程序的调用 CREATE OR REPLACE PROCEDURE print_name ( first VARCHAR2, last VARCHAR2, mi VARCHAR2 := NULL ) IS BEGIN IF mi IS NULL THEN DBMS_OUTPUT.PUT_LINE(first || ' ' || last); ELSE DBMS_OUTPUT.PUT_LINE(first || ' ' || mi || '. ' || last); END IF; END print_name; / BEGIN print_name('John', 'Doe'); -- 原始的调用 print_name('John', 'Public', 'Q'); -- 新的调用 END;
|
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1131976/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17013648/viewspace-1131976/