PLSQL Language Reference-PL/SQL子程序-子程序参数-IN模式子程序参数默认值

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值