カテゴリ:

ユーザー定義関数、外部関数、およびストアドプロシージャ用の DDL

CREATE PROCEDURE

新しい ストアドプロシージャ を作成します。ストアドプロシージャには JavaScript コードが含まれています。

こちらもご参照ください:

ALTER PROCEDURE , DESCRIBE PROCEDURE , DROP PROCEDURE , SHOW PROCEDURES

CALL

構文

CREATE [ OR REPLACE ] PROCEDURE <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS <result_data_type> [ NOT NULL ]
  LANGUAGE JAVASCRIPT
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ VOLATILE | IMMUTABLE ]
  [ COMMENT = '<string_literal>' ]
  [ EXECUTE AS { CALLER | OWNER } ]
  AS '<procedure_definition>'

重要

JavaScript は大文字と小文字を区別しますが、SQL は区別しません。JavaScript コードでのストアドプロシージャの引数名の使用に関する重要な情報については、 JavaScript 引数の大文字と小文字の区別 をご参照ください。

必須パラメーター

名前 ( [ 引数名 引数データ型 ] [ , ... ] )

ストアドプロシージャの識別子(およびオプションで1つ以上の引数/入力)を指定します。ストアドプロシージャは名前と引数の種類によって識別および解決されるため、識別子はプロシージャが作成されるスキーマに対して一意である必要はありません。

ただし、識別子はアルファベットで始まる必要があり、識別子文字列全体が二重引用符で囲まれていない限り、スペースや特殊文字を含めることはできません(例: "My object")。二重引用符で囲まれた識別子も大文字と小文字が区別されます。

詳細については、 識別子の要件 をご参照ください。

RETURNS 結果データ型 [ NOT NULL ]

ストアドプロシージャによって返される結果を指定します。

実際問題として、呼び出しは式の一部とすることはできないため、戻り値は使用できません。

LANGUAGE JAVASCRIPT

ストアドプロシージャに JavaScript コードが含まれることを指定します。現在、サポートされている言語は JavaScript のみです。他の言語を指定すると、エラーメッセージが表示されます。

AS プロシージャ定義

ストアドプロシージャによって実行されるJavaScriptコードを定義します。定義は、任意の有効な JavaScript で構成できます。ただし、Snowflakeはストアドプロシージャの作成時にコードを検証しません(つまり、コードが有効かどうかに関係なく、ストアドプロシージャの作成は成功します)。コードが有効でない場合、ストアドプロシージャが呼び出されたときにエラーが返されます。

プロシージャ定義 を囲む区切り文字は、単一引用符またはドル記号のペアのいずれかです。区切り文字として「$$」を使用すると、単一引用符を含むストアドプロシージャを簡単に記述できます。

JavaScript 改行を含む文字列の周りに逆引用符(「バックティック」とも呼ばれる)を許可します。

次の例では、ストアドプロシージャの本文に一重引用符と二重引用符が含まれているため、「$$」と逆引用符を使用しています。

CREATE OR REPLACE TABLE table1 ("column 1" VARCHAR);
CREATE or replace PROCEDURE proc3()
  RETURNS VARCHAR
  LANGUAGE javascript
  AS
  $$
  var rs = snowflake.execute( { sqlText: 
      `INSERT INTO table1 ("column 1") 
           SELECT 'value 1' AS "column 1" ;`
       } );
  return 'Done.';
  $$;

ストアドプロシージャの詳細については、 以下をご参照ください。

オプションのパラメーター

CALLED ON NULL INPUT または . RETURNS NULL ON NULL INPUT | STRICT

null入力で呼び出されたときのストアドプロシージャの動作を指定します。入力がnullの場合は常にnullを返すシステム定義関数とは対照的に、ストアドプロシージャはnull入力を処理でき、入力がnullの場合でもnull以外の値を返します。

  • CALLED ON NULL INPUT 常にnull入力でストアドプロシージャを呼び出します。そのような値を適切に処理するのは手順次第です。

  • RETURNS NULL ON NULL INPUT (またはその同義語 STRICT)は、入力がnullの場合にストアドプロシージャを呼び出さないため、ストアドプロシージャ内のステートメントは実行されません。代わりに、null値が常に返されます。プロシージャは、null以外の入力に対してもnullを返す場合があります。

デフォルト: CALLED ON NULL INPUT

VOLATILE | IMMUTABLE

結果を返すときのストアドプロシージャの動作を指定します。

  • VOLATILE:プロシージャは、同じ入力でも(例えば、非決定性とステートフルネスのため)、異なる行に対して異なる値を返す場合があります。

  • IMMUTABLE:この手順は、同じ入力で呼び出された場合、常に同じ結果を返すことを前提としています。この保証はチェックされません。同じ入力に対して異なる値を返すプロシージャに IMMUTABLE を指定すると、未定義の動作が発生します。

デフォルト: VOLATILE

COMMENT = '文字列リテラル'

SHOW PROCEDURES 出力の DESCRIPTION 列に表示されるストアドプロシージャのコメントを指定します。

デフォルト: stored procedure

EXECUTE AS CALLER | OWNER

ストアドプロシージャは、所有者の権限(「所有者の権利」ストアドプロシージャ)または呼び出し元の権限(「呼び出し元の権利」ストアドプロシージャ)で実行できます。ステートメント CREATE PROCEDURE を実行すると...EXECUTE AS CALLER、その後、プロシージャは呼び出し元の権限プロシージャとして実行されます。 CREATE PROCEDURE を実行すると...EXECUTE AS OWNER 、その後、プロシージャは所有者の権利プロシージャとして実行されます。デフォルトでは(プロシージャの作成時に OWNER も CALLER も明示的に指定されていない場合)、プロシージャは所有者の権限のストアドプロシージャとして実行されます。所有者の権利のストアドプロシージャは、呼び出し側の環境(呼び出し側のセッション変数など)へのアクセスが少なく、Snowflakeはデフォルトでこの高いレベルのプライバシーとセキュリティを使用します。所有者と呼び出し元の権利の手順の詳細については、 ストアドプロシージャがアクセスするデータベースオブジェクトの権限 をご参照ください。

デフォルト: OWNER

使用上の注意

  • ストアドプロシージャは、文字列(成功/失敗インジケータなど)や数値(エラーコードなど)などの単一の値のみを返すことができます。より広範な情報を返す必要がある場合は、区切り文字(コンマなど)で区切られた値を含む VARCHAR 、または VARIANT などの半構造化データ型を返すことができます。

  • ストアドプロシージャはオーバーロードをサポートします。2つのプロシージャは、パラメーターの数またはパラメーターのデータ型が異なる場合、同じ名前を持つことができます。

ちなみに

組織が呼び出し元の権利と所有者の権利のストアドプロシージャを組み合わせて使用している場合、ストアドプロシージャの命名規則を使用して、個々のストアドプロシージャが呼び出し元の権利のストアドプロシージャか所有者の権利のストアドプロシージャかを示すことができます。

これにより、ハードコードされた値を返す簡単なストアドプロシージャが作成されます。これは非現実的ですが、最小限の JavaScript コードで基本的な SQL 構文を示しています。

create or replace procedure sp_pi()
    returns float not null
    language javascript
    as
    $$
    return 3.1415926;
    $$
    ;

これは、 JavaScript API への呼び出しを含むより現実的な例を示しています。このプロシージャのより広範なバージョンでは、ユーザーが直接挿入する権限を持っていないテーブルにデータを挿入できます。JavaScript ステートメントは、特定の要件が満たされた場合にのみ、入力パラメーターをチェックし、 SQL INSERT を実行できます。

create or replace procedure stproc1(FLOAT_PARAM1 FLOAT)
    returns string
    language javascript
    strict
    execute as owner
    as
    $$
    var sql_command = 
     "INSERT INTO stproc_test_table1 (num_col1) VALUES (" + FLOAT_PARAM1 + ")";
    try {
        snowflake.execute (
            {sqlText: sql_command}
            );
        return "Succeeded.";   // Return a success/error indicator.
        }
    catch (err)  {
        return "Failed: " + err;   // Return a success/error indicator.
        }
    $$
    ;

その他の例については、 ストアドプロシージャの使用 をご参照ください。