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

ストアドプロシージャを呼び出すには、いくつかの方法があります。

プロシージャを呼び出すツール

プロシージャを呼び出すツールを選択します。

言語

アプローチ

SQL

Snowsight などで SQL コマンドを実行。

SQL CALL コマンド を実行し、プロシージャを呼び出します。

Snowparkを使用したJava、Python、またはScala

サポートされている言語でローカルにコードを記述し、Snowflakeで実行させます。

Snowpark APIs を使用するクライアントコードを以下のいずれかの言語で実行します。

コマンドライン

コマンドラインからコマンドを実行して、Snowflakeエンティティを作成および管理します。

Snowflake CLI のコマンドを実行します。

Python

クライアント上で、Snowflakeの管理操作を実行するコードを記述します。

Snowflake Python API を使用するコードを実行します。

RESTful APIs (言語にとらわれない)

RESTful エンドポイントにリクエストを行い、Snowflake エンティティを作成および管理します。

Snowflake REST API を使用したプロシージャの作成をリクエストします。

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

注釈

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

使用上の注意

  • プロシージャ名はスキーマ内で必ずしも一意ではありません。ストアドプロシージャは、名前だけでなく引数のタイプによっても識別され、解決されます(つまり、ストアドプロシージャはオーバーロードすることができます)。

  • Snowflakeスクリプトのブロック 外では、呼び出しを式の一部にすることはできないため、ストアドプロシージャによって返される値は使用できません。

    Snowflakeスクリプトのブロックでは、 INTO :snowflake_scripting_variable を指定して、ストアドプロシージャからの戻り値をSnowflakeスクリプト変数にキャプチャできます。

  • ストアドプロシージャはアトミックではありません。ストアドプロシージャ内の1つのステートメントが失敗した場合、ストアドプロシージャ内の他のステートメントは必ずしもロールバックされるとは限りません。ストアドプロシージャとトランザクションについては、 トランザクション管理 をご参照ください。

  • CALL (匿名プロシージャでの場合) を使用して匿名プロシージャを作成し、呼び出すこともできます。

SQL でストアドプロシージャを呼び出します。

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

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

CREATE OR REPLACE PROCEDURE sp_concatenate_strings(
    first_arg VARCHAR,
    second_arg VARCHAR,
    third_arg VARCHAR)
  RETURNS VARCHAR
  LANGUAGE SQL
  AS
  $$
  BEGIN
    RETURN first_arg || second_arg || third_arg;
  END;
  $$;
Copy

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

CALL sp_concatenate_strings(
  first_arg => 'one',
  second_arg => 'two',
  third_arg => 'three');
Copy
+------------------------+
| SP_CONCATENATE_STRINGS |
|------------------------|
| onetwothree            |
+------------------------+

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

CALL sp_concatenate_strings(
  third_arg => 'three',
  first_arg => 'one',
  second_arg => 'two');
Copy
+------------------------+
| SP_CONCATENATE_STRINGS |
|------------------------|
| onetwothree            |
+------------------------+

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

CALL sp_concatenate_strings(
  'one',
  'two',
  'three');
Copy
+------------------------+
| SP_CONCATENATE_STRINGS |
|------------------------|
| onetwothree            |
+------------------------+

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

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

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

  • 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   |
+-------------------+