子程序参数
形参和实参
如果想子程序拥有参数,需要在子程序的头部声明形参。在每个形参的声明中需要指定名称和数据类型,指定模式和默认值。后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,但不继承它的precision和scale。
注意:在函数中, 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/