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

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

オプションの引数の指定

ストアドプロシージャに オプションの引数 がある場合は、呼び出しの際にオプションの引数を省略できます。オプションの引数それぞれには、引数が省略された場合に使用されるデフォルト値があります。

たとえば、以下のストアドプロシージャには必須引数が1つ、オプション引数が2つあります。オプションの引数それぞれには、デフォルト値があります。

CREATE OR REPLACE PROCEDURE build_string_proc(
    word VARCHAR,
    prefix VARCHAR DEFAULT 'pre-',
    suffix VARCHAR DEFAULT '-post'
  )
  RETURNS VARCHAR
  LANGUAGE SQL
  AS
  $$
    BEGIN
      RETURN prefix || word || suffix;
    END;
  $$
  ;
Copy

オプションの引数は省略可能です。引数を省略すると、その引数のデフォルト値が使用されます。

CALL build_string_proc('hello');
Copy
+-------------------+
| BUILD_STRING_PROC |
|-------------------|
| pre-hello-post    |
+-------------------+
CALL build_string_proc('hello', 'before-');
Copy
+-------------------+
| BUILD_STRING_PROC |
|-------------------|
| before-hello-post |
+-------------------+

オプションの引数を省略し、署名で省略された引数の後に表示される別のオプションの引数を指定する必要がある場合は、位置引数ではなく名前付き引数を使用します。

たとえば、 prefix 引数を省略し、 suffix 引数を指定するとします。 suffix 引数は署名の prefix の後に表示されるため、引数は名前で指定する必要があります。

CALL build_string_proc(word => 'hello', suffix => '-after');
Copy
+-------------------+
| BUILD_STRING_PROC |
|-------------------|
| pre-hello-after   |
+-------------------+

ストアドプロシージャを実行するには、 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

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

ご用心

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