プロシージャおよび関数を使用する重要な側面は、呼び出しプログラムからプロシージャまたは関数にデータを渡し、プロシージャまたは関数からデータを受け取る機能です。 これはパラメータを使用して完了します。 このトピックでは、パラメーターに関する基本情報について説明します。
パラメータは、プロシージャまたは関数の定義で宣言され、プロシージャまたは関数名の後に括弧 () で囲まれます。 プロシージャまたは関数の定義で宣言されたパラメータは、仮パラメータです。 プロシージャまたは関数が呼び出されると、呼び出しプログラムは、呼び出されたプログラムの処理で使用される実際のデータと、呼び出されたプログラムの処理の結果を受け取るために使用される変数を提供します。 プロシージャまたは関数を呼び出すときに呼び出し側プログラムによって提供されるデータと変数は、実パラメーターです。
次の式は、仮パラメーター宣言の一般的な形式を示しています。
(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