在调用子程序时,可以使用位置、名称或混合标记来指定实参。
|
位置 |
名称 |
混合 |
|
按形参声明的顺序指定实参 |
可以按任何顺序指定实参 formal => actual |
以位置标记开始,对其它参数使用名称标记 |
|
可以省略尾部的可选参数 |
可以省略任何可选参数 |
在位置标记中可以省略尾部的可选参数,在名称标记中可以省略任何可选参数 |
|
如果按错误的顺序指定了实参,尤其是实参为字面量,则会引起很难发现的问题 |
实参没有错误的顺序 |
在位置标记中,如果按错误的顺序指定了实参,尤其是实参为字面量,则会引起很难发现的问题 |
|
如果形参列表改变了,则子程序调用必须改变,除非列表中只是增加了新的尾部可选参数。 |
只有当参数列表增加了新的参数时,子程序调用才需要改变。 |
对于形参列表的改变,可能需要改变位置标记 |
|
|
当调用由它人定义或维护的子程序时,建议采用这种方式 |
当调用有必须参数和可选参数的子程序,且必须指定少数的几个可选参数的时候,很方便。 |
|
DECLARE emp_num NUMBER(6) := 120; bonus NUMBER(6) := 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(amount => bonus, emp_id => emp_num); -- 按名称 raise_salary(emp_id => emp_num, amount => bonus); -- 按名称 raise_salary(emp_num, amount => bonus); -- 混合 END; / |
|
CREATE OR REPLACE FUNCTION compute_bonus ( emp_id NUMBER, bonus NUMBER ) RETURN NUMBER IS emp_sal NUMBER; BEGIN SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
RETURN emp_sal + bonus; END compute_bonus; / SELECT compute_bonus(120, 50) FROM DUAL; -- 按位置 SELECT compute_bonus(bonus => 50, emp_id => 120) FROM DUAL; -- 按名称 SELECT compute_bonus(120, bonus => 50) FROM DUAL; -- 混合 |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17013648/viewspace-1132818/ ,如需转载,请注明出处,否则将追究法律责任。