ストアドプロシージャの呼び出し

SQL CALL コマンドを使用して、ストアドプロシージャを呼び出すことができます。

ユーザーがストアドプロシージャを呼び出すには、ユーザーのロールに、ストアドプロシージャの USAGE 権限 が必要です。

ストアドプロシージャを呼び出す権限を取得すると、 CALL ステートメントを使用してストアドプロシージャを呼び出すことができます。

注釈

匿名プロシージャの作成と呼び出しの両方を実行するには、 CALL (匿名プロシージャの場合) を使用します。匿名プロシージャの作成と呼び出しには、 CREATE PROCEDURE スキーマ権限を持つロールは必要ありません。

ストアドプロシージャに引数がある場合は、それらの引数を名前または位置で指定できます。

たとえば、次のストアドプロシージャは、3つの引数を受け付けます。

CREATE OR REPLACE PROCEDURE sp_concatenate_strings(
    first VARCHAR,
    second VARCHAR,
    third VARCHAR)
  RETURNS VARCHAR
  LANGUAGE SQL
  AS
  $$
  BEGIN
    RETURN first || second || third;
  END;
  $$;
Copy

プロシージャの呼び出し時に、引数を名前で指定できます。

CALL sp_concatenate_strings(
  first => 'one',
  second => 'two',
  third => 'three');
Copy

引数を名前で指定する場合は、引数を特定の順序で指定する必要はありません。

CALL sp_concatenate_strings(
  third => 'three',
  first => 'one',
  second => 'two');
Copy

また、引数を位置で指定することもできます。

CALL sp_concatenate_strings(
  'one',
  'two',
  'three');
Copy

次の点に注意してください。

  • すべての引数を名前または位置のいずれかで指定する必要があります。一部の引数を名前で、他の引数を位置で指定することはできません。

    引数を名前で指定する場合は、引数名を二重引用符で囲むことはできません。

  • 2つの関数または2つのプロシージャが同じ名前で引数の型が異なり、引数名が異なる場合は、引数名を使ってどの関数またはプロシージャを実行するかを指定することができます。 プロシージャおよび関数のオーバーロード をご参照ください。

ストアドプロシージャを実行するには、 CALL ステートメントを使用します。例:

call stproc1(5.14::FLOAT);
Copy

ストアドプロシージャの各引数は、一般的な式にすることができます。

CALL stproc1(2 * 5.14::FLOAT);
Copy

引数はサブクエリにすることができます。

CALL stproc1(SELECT COUNT(*) FROM stproc_test_table1);
Copy

CALL ステートメントごとに1つのストアドプロシージャのみを呼び出すことができます。例えば、次のステートメントは失敗します。

call proc1(1), proc2(2);                          -- Not allowed
Copy

また、ストアドプロシージャ CALL を式の一部として使用することはできません。例えば、次のステートメントはすべて失敗します。

call proc1(1) + proc1(2);                         -- Not allowed
call proc1(1) + 1;                                -- Not allowed
call proc1(proc2(x));                             -- Not allowed
select * from (call proc1(1));                    -- Not allowed
Copy

ただし、ストアドプロシージャ内では、ストアドプロシージャは別のストアドプロシージャを呼び出すことも、再帰的に呼び出すこともできます。

ご用心

ネストされた呼び出しは、許可される最大スタック深度を超える可能性があるため、呼び出しをネストするとき、特に再帰を使用するときは注意してください。