在將參數傳遞給函數或存儲過程時,您可以使用位置或命名參數表示法。如果使用位置表示法指定參數,則必須按其聲明的順序列出參數;如果使用命名表示法指定參數,則參數的順序無關緊要。

要使用命名表示法指定參數,請列出每個參數的名稱,后跟箭頭 (=>) 和參數值。命名表示法比較冗長,但會使您的代碼更易于閱讀和維護。

一個演示如何使用位置和命名參數表示法的簡單示例如下所示:

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

如果您確實使用混合表示法,請記住,命名參數不能位于位置參數前面。