PLSQL Language Reference-PL/SQL子程序-子程序参数-形参和实参

子程序参数

形参和实参

如果想子程序拥有参数,需要在子程序的头部声明形参。在每个形参的声明中需要指定名称和数据类型,指定模式默认值。后2者是可选的。在子程序的执行部分通过名称来引用形参。

当调用子程序时指定实参,它的值被赋值给形参。对应的形参和实参必须有兼容的数据类型。

技巧:为了避免混淆,实参和形参使用不同的名称。

DECLARE

    emp_num NUMBER(6) := 120;

    bonus   NUMBER(6) := 100;

    merit   NUMBER(4) := 50;

 

    PROCEDURE raise_salary (

        emp_id NUMBER,  -- 形参

        amount NUMBER   -- 形参

    ) IS

    BEGIN

        UPDATE employees

        SET salary = salary + amount  -- 引用形参

        WHERE employee_id = emp_id;   -- 引用形参

    END raise_salary;

 

BEGIN

  raise_salary(emp_num, bonus);          -- 实参

  raise_salary(emp_num, merit + bonus);  -- 实参 

END;

/

 

1)约束子类型的形参

如果形参的数据类型为约束子类型,则:

如果子类型有NOT NULL约束,则实参继承它

如果子类型的基类型为VARCHAR2,则实参不继承子类型的size

如果子类型的基类型为数值类型,则实参继承它的range,但不继承它的precisionscale

注意:在函数中, RETURN datatype声明了隐藏的形参,语句RETURN value指定了相应的实参,因此如果datatype为约束子类型,则前面的规则也适用它。

DECLARE

    SUBTYPE License IS VARCHAR2(7) NOT NULL;

    n  License := 'DLLLDDD';

 

    PROCEDURE p (x License) IS

    BEGIN

        DBMS_OUTPUT.PUT_LINE(x);

    END;

 

BEGIN

    p('1ABC123456789');  -- 成功,因为大小没有继承来

    p(NULL);               -- 产生错误, NOT NULL被继承来了

END;

 

--只继承范围,不继承精度

DECLARE

    FUNCTION test (p INTEGER) RETURN INTEGER IS

    BEGIN

        DBMS_OUTPUT.PUT_LINE('p = ' || p);

        RETURN p;

    END test;

 

BEGIN

    DBMS_OUTPUT.PUT_LINE('test(p) = ' || test(0.66));

END;

 

DECLARE

    FUNCTION test (p NUMBER) RETURN NUMBER IS

        q INTEGER := p;  -- 隐式将p转换为INTEGER

    BEGIN

        DBMS_OUTPUT.PUT_LINE('p = ' || q);  -- 显示q,而不是p

        RETURN q;                           -- 返回q,而不是p

    END test;

 

BEGIN

    DBMS_OUTPUT.PUT_LINE('test(p) = ' || test(0.66));

END;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1131972/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17013648/viewspace-1131972/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值