すべてのプロダクト
Search
ドキュメントセンター

PolarDB:手順と関数パラメーター

最終更新日:Dec 17, 2024

プロシージャおよび関数を使用する重要な側面は、呼び出しプログラムからプロシージャまたは関数にデータを渡し、プロシージャまたは関数からデータを受け取る機能です。 これはパラメータを使用して完了します。 このトピックでは、パラメーターに関する基本情報について説明します。

パラメータは、プロシージャまたは関数の定義で宣言され、プロシージャまたは関数名の後に括弧 () で囲まれます。 プロシージャまたは関数の定義で宣言されたパラメータは、仮パラメータです。 プロシージャまたは関数が呼び出されると、呼び出しプログラムは、呼び出されたプログラムの処理で使用される実際のデータと、呼び出されたプログラムの処理の結果を受け取るために使用される変数を提供します。 プロシージャまたは関数を呼び出すときに呼び出し側プログラムによって提供されるデータと変数は、実パラメーターです。

次の式は、仮パラメーター宣言の一般的な形式を示しています。

(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