ITPub博客

首页 > 数据库 > Oracle > PLSQL Language Reference-PL/SQL子程序-子程序参数-形参和实参

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

原创 Oracle 作者: luisedalian 时间:2014-03-29 08:33:14 0 删除 编辑

子程序参数

形参和实参

如果想子程序拥有参数,需要在子程序的头部声明形参。在每个形参的声明中需要指定名称和数据类型,指定模式默认值。后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)约束子类型的形参

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

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

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

n  如果子类型的基类型为数值类型,则实参继承它的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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    5569016