在将参数传递给函数或存储过程时,您可以使用位置或命名参数表示法。如果使用位置表示法指定参数,则必须按其声明的顺序列出参数;如果使用命名表示法指定参数,则参数的顺序无关紧要。

要使用命名表示法指定参数,请列出每个参数的名称,后跟箭头 (=>) 和参数值。命名表示法比较冗长,但会使您的代码更易于阅读和维护。

一个演示如何使用位置和命名参数表示法的简单示例如下所示:

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);

如果您确实使用混合表示法,请记住,命名参数不能位于位置参数前面。