在將參數傳遞給函數或存儲過程時,您可以使用位置或命名參數表示法。如果使用位置表示法指定參數,則必須按其聲明的順序列出參數;如果使用命名表示法指定參數,則參數的順序無關緊要。
要使用命名表示法指定參數,請列出每個參數的名稱,后跟箭頭 (=>) 和參數值。命名表示法比較冗長,但會使您的代碼更易于閱讀和維護。
一個演示如何使用位置和命名參數表示法的簡單示例如下所示:
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);
如果您確實使用混合表示法,請記住,命名參數不能位于位置參數前面。