在将参数传递给函数或存储过程时,您可以使用位置或命名参数表示法。如果使用位置表示法指定参数,则必须按其声明的顺序列出参数;如果使用命名表示法指定参数,则参数的顺序无关紧要。
要使用命名表示法指定参数,请列出每个参数的名称,后跟箭头 (=>) 和参数值。命名表示法比较冗长,但会使您的代码更易于阅读和维护。
一个演示如何使用位置和命名参数表示法的简单示例如下所示:
CREATE OR REPLACE PROCEDURE emp_info (
p_deptno IN NUMBER,
p_empno IN OUT NUMBER,
p_ename IN OUT VARCHAR2
)
IS
BEGIN
dbms_output.put_line('Department Number =' || p_deptno);
dbms_output.put_line('Employee Number =' || p_empno);
dbms_output.put_line('Employee Name =' || p_ename);
END;
要使用位置表示法调用存储过程,请传递以下参数:
emp_info(30, 7455, 'Clark');
要使用命名表示法调用存储过程,请传递以下参数:
emp_info(p_ename =>'Clark', p_empno=>7455, p_deptno=>30);
通过使用命名表示法,可在存储过程的参数列表发生更改,参数重新排序或添加了新可选参数的情况下,减少重新排列参数列表的需要。
如果某一参数具有默认值,并且该参数不是尾随参数,您必须使用命名表示法来调用存储过程或函数。以下示例演示了存储过程两个前导默认参数。
CREATE OR REPLACE PROCEDURE check_balance (
p_customerID IN NUMBER DEFAULT NULL,
p_balance IN NUMBER DEFAULT NULL,
p_amount IN NUMBER
)
IS
DECLARE
balance NUMBER;
BEGIN
IF (p_balance IS NULL AND p_customerID IS NULL) THEN
RAISE_APPLICATION_ERROR
(-20010, 'Must provide balance or customer');
ELSEIF (p_balance IS NOT NULL AND p_customerID IS NOT NULL) THEN
RAISE_APPLICATION_ERROR
(-20020,'Must provide balance or customer, not both');
ELSEIF (p_balance IS NULL) THEN
balance := getCustomerBalance(p_customerID);
ELSE
balance := p_balance;
END IF;
IF (amount > balance) THEN
RAISE_APPLICATION_ERROR
(-20030, 'Balance insufficient');
END IF;
END;
只能使用命名表示法省略非尾随参数值(调用此存储过程时);使用位置表示法时,只允许尾随参数为默认参数。可使用以下参数调用此存储过程:
check_balance(p_customerID => 10, p_amount = 500.00)
check_balance(p_balance => 1000.00, p_amount = 500.00)
可使用位置和命名表示法的组合(混合表示法)指定参数。一个演示使用混合参数表示法的简单示例如下所示:
CREATE OR REPLACE PROCEDURE emp_info (
p_deptno IN NUMBER,
p_empno IN OUT NUMBER,
p_ename IN OUT VARCHAR2,
)
IS
BEGIN
dbms_output.put_line('Department Number =' || p_deptno);
dbms_output.put_line('Employee Number =' || p_empno);
dbms_output.put_line('Employee Name =' || p_ename);
END;
可使用混合表示法调用存储过程:
emp_info(30, p_ename =>'Clark', p_empno=>7455);
如果您确实使用混合表示法,请记住,命名参数不能位于位置参数前面。