ストアドプロシージャの作成¶
ロジックに使用するハンドラーなど、プロシージャのプロパティを指定する CREATE PROCEDURE コマンドを使用して、ストアドプロシージャを作成します。
このトピックでは、プロシージャを作成するステップをリストします。例については、 CREATE PROCEDURE リファレンス をご参照ください。
注釈
後で使用するために保存されていないプロシージャを作成して呼び出すこともできます。この種のプロシージャのプロパティの多くは、ストアドプロシージャと同じです。詳細については、 CALL (匿名プロシージャの場合) をご参照ください。
ストアドプロシージャの作成¶
次のステップでストアドプロシージャを作成します。
プロシージャが呼び出されたときに実行されるハンドラーコードを記述します。
サポートされているハンドラー言語のいずれかを使用できます。詳細については、 サポートされている言語 をご参照ください。
ハンドラーコードを CREATE PROCEDURE SQL ステートメントとインラインで保持するか、ステージで参照するかを選択します。
それぞれに利点があります。詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。
プロシージャのプロパティを指定して、 SQL で CREATE PROCEDURE ステートメントを実行します。
次の例のコードは、インラインハンドラー
MyClass.myMethod
を持つmyProc
というプロシージャを作成します。ハンドラー言語はJavaであり、(ScalaやPythonで記述されたプロシージャハンドラーと同様に)Snowparkライブラリのセッションオブジェクトが必要です。ここで、 PACKAGES 句は、Snowflakeに含まれるSnowparkライブラリを参照します。CREATE OR REPLACE PROCEDURE myProc(fromTable STRING, toTable STRING, count INT) RETURNS STRING LANGUAGE JAVA RUNTIME_VERSION = '11' PACKAGES = ('com.snowflake:snowpark:latest') HANDLER = 'MyClass.myMethod' AS $$ import com.snowflake.snowpark_java.*; public class MyClass { public String myMethod(Session session, String fromTable, String toTable, int count) { session.table(fromTable).limit(count).write().saveAsTable(toTable); return "Success"; } } $$;
次に、プロシージャを作成するときに必要な、または通常使用される、プロパティの一部について説明します。
プロシージャ名。
名前は、ハンドラーメソッドの名前と一致する必要はありません。CREATE PROCEDURE ステートメントは、プロシージャ名をハンドラーに関連付けます。
名前の制約と規則の詳細については、 プロシージャおよび UDFs の命名とオーバーロード をご参照ください。
プロシージャの引数(存在する場合)。
UDFs およびストアドプロシージャの引数の定義 をご参照ください。
RETURNS 句を使用した戻り型。
Snowflakeが SQL データ型をハンドラーデータ型にマップする方法については、 SQL-Javaデータ型マッピング をご参照ください。
HANDLER 句を使用したハンドラー名。
必要な場合、これは、プロシージャが呼び出されたときに実行されるコードを含むクラスまたはメソッドの名前です。Java、Python、およびScalaで記述されたハンドラーに対してのみ、ハンドラー名を指定する必要があります。JavaScript およびSnowflakeスクリプトハンドラーの場合、インラインで指定されたすべてのコードがハンドラーとして実行されます。
次のテーブルは、ハンドラー言語に基づく HANDLER 句の値の形式を示しています。
ハンドラー言語
値の形式
Java
クラスとメソッド名。
例:
MyClass.myMethod
JavaScript
なし。
Python
クラスが使用されている場合は、クラスとメソッド名。それ以外の場合は、関数名。
例:
module.my_function
またはmy_function
Scala
オブジェクトとメソッド名。
例:
MyObject.myMethod
Snowflakeスクリプト
なし。
IMPORTS または PACKAGES 句を使用したハンドラーが必要とする依存関係(存在する場合)。
Java、Python、またはScalaで記述されたハンドラーの場合は、 CREATE PROCEDURE リファレンスで説明されているように、必ずSnowparkライブラリを指定してください。
ハンドラーで依存関係を利用できるようにする方法の詳細については、 コードで依存関係を利用できるようにする方法 をご参照ください。
RUNTIME_VERSION 句を使用したハンドラー言語ランタイム。
ハンドラー言語がJava、Python、またはScalaの場合は、 RUNTIME_VERSION 句を使用して、使用するサポート対象のランタイムバージョンを指定します。句を省略すると、Snowflakeに対してデフォルトを使用するように求められますが、これは将来変更される可能性があります。
例¶
インラインハンドラー¶
次の例のコードは、Pythonインラインハンドラー関数 run
を使用して my_proc
というプロシージャを作成します。コードは、 PACKAGES 句を介して、含まれているPython用のSnowparkライブラリを参照します。Pythonがプロシージャハンドラー言語である場合は、その Session
が必要です。
CREATE OR REPLACE PROCEDURE my_proc(from_table STRING, to_table STRING, count INT)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = '3.8'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'run'
AS
$$
def run(session, from_table, to_table, count):
session.table(from_table).limit(count).write.save_as_table(to_table)
return "SUCCESS"
$$;
ステージングされたハンドラー¶
次の例のコードは、ステージングされたJavaハンドラーメソッド MyClass.myMethod
を使用して my_proc
というプロシージャを作成します。コードは、 PACKAGES 句を介して、含まれているJava用のSnowparkライブラリを参照します。Javaがプロシージャハンドラー言語である場合は、その Session
が必要です。IMPORTS 句を使用すると、コードはハンドラーコードを含むステージングされた JAR ファイルを参照します。
CREATE OR REPLACE PROCEDURE my_proc(fromTable STRING, toTable STRING, count INT)
RETURNS STRING
LANGUAGE JAVA
RUNTIME_VERSION = '11'
PACKAGES = ('com.snowflake:snowpark:latest')
IMPORRTS = ('@mystage/myjar.jar')
HANDLER = 'MyClass.myMethod';