使用預存程序和函數的一個重要方面是,能夠將資料從調用程式傳遞給預存程序或函數,並能夠從預存程序或函數接收回資料。這將通過使用參數來實現。
參數在預存程序或函數定義中聲明,在預存程序或函數名稱後面用圓括弧(())括起。在預存程序或函數定義中聲明的參數稱為形參。當調用預存程序或函數時,調用程式提供要在被調用程式處理中使用的實際資料,以及要接收被調用程式處理結果的變數。調用程式在調用預存程序或函數時提供的資料和變數稱為實參。
下面是形參聲明的常規格式。
(name [ IN | OUT | IN OUT ] data_type [ DEFAULT value ])name是分配給形參的標識符。如果指定,IN定義用於接收輸入資料並將其儲存到預存程序或函數的參數。
IN參數也可初始化為預設值。如果指定,OUT定義用於從預存程序或函數返回資料的參數。如果指定,IN OUT允許參數既用於輸入也用於輸出。如果IN、OUT和IN OUT全都被省略,則參數的行為與預設情況下它定義為IN時的相同。無論參數是IN、OUT還是IN OUT,都統稱為參數模式。
data_type定義參數的資料類型。
value是在調用中未指定實參時,在被調用程式中分配給IN參數的預設值。
樣本
下面是一個採用參數的預存程序的樣本:
CREATE OR REPLACE PROCEDURE emp_query (
p_deptno IN NUMBER,
p_empno IN OUT NUMBER,
p_ename IN OUT VARCHAR2,
p_job OUT VARCHAR2,
p_hiredate OUT DATE,
p_sal OUT NUMBER
)
IS
BEGIN
SELECT empno, ename, job, hiredate, sal
INTO p_empno, p_ename, p_job, p_hiredate, p_sal
FROM emp
WHERE deptno = p_deptno
AND (empno = p_empno
OR ename = UPPER(p_ename));
END;在此樣本中,p_deptno是IN形參,p_empno和p_ename是IN OUT形參,p_job、p_hiredate和p_sal是OUT形參。
在上一樣本中,沒有在VARCHAR2參數中指定最大長度,並且沒有在 NUMBER 參數中指定精度和小數位元。在參數聲明中指定長度、精度、小數位元或其他約束是非法的。這些約束自動從調用預存程序或函數時使用的實參繼承。
emp_query預存程序可由另一個程式調用,從而將實參傳遞給該程式。下面是調用emp_query的另一個SPL程式的樣本。
DECLARE
v_deptno NUMBER(2);
v_empno NUMBER(4);
v_ename VARCHAR2(10);
v_job VARCHAR2(9);
v_hiredate DATE;
v_sal NUMBER;
BEGIN
v_deptno := 30;
v_empno := 7900;
v_ename := '';
emp_query(v_deptno, v_empno, v_ename, v_job, v_hiredate, v_sal);
DBMS_OUTPUT.PUT_LINE('Department : ' || v_deptno);
DBMS_OUTPUT.PUT_LINE('Employee No: ' || v_empno);
DBMS_OUTPUT.PUT_LINE('Name : ' || v_ename);
DBMS_OUTPUT.PUT_LINE('Job : ' || v_job);
DBMS_OUTPUT.PUT_LINE('Hire Date : ' || v_hiredate);
DBMS_OUTPUT.PUT_LINE('Salary : ' || v_sal);
END;在此樣本中,v_deptno、v_empno、v_ename、v_job、v_hiredate和v_sal是實參。
上一樣本的輸出如下所示:
Department : 30
Employee No: 7900
Name : JAMES
Job : CLERK
Hire Date : 03-DEC-81
Salary : 950