Pythonストアドプロシージャから表形式データを返す¶
表形式フォームでデータを返すプロシージャを書くことができます。表形式データを返すプロシージャを作成するには、次の手順を実行します。
CREATE PROCEDURE ステートメントで、プロシージャの戻り値の型として
TABLE(...)
を指定します。TABLE パラメータとして、返されたデータの列名と 型 がわかっている場合はそれらを指定できます。実行時に指定された場合など、プロシージャを定義するときに返される列がわからない場合は、 TABLE パラメーターを省略できます。これを実行すると、プロシージャの戻り値の列は、そのハンドラーによって返された
DataFrame
の列から変換されます。列のデータ型は、 SQL-Pythonデータ型マッピング で指定されたマッピングに従って SQL に変換されます。Snowpark DataFrame で表形式の結果を返すようにハンドラーを記述します。
データフレームの詳細については、 Snowpark PythonでのDataFramesの使用 をご参照ください。
例¶
このセクションの例は、列が文字列と一致する行をフィルターするプロシージャーから表形式の値を返すことを示しています。
データの定義¶
次の例のコードは、従業員のテーブルを作成します。
CREATE OR REPLACE TABLE employees(id NUMBER, name VARCHAR, role VARCHAR);
INSERT INTO employees (id, name, role) VALUES (1, 'Alice', 'op'), (2, 'Bob', 'dev'), (3, 'Cindy', 'dev');
戻り列の名前と型の指定¶
この例では、 RETURNS TABLE()
ステートメントで列の名前と型を指定しています。
CREATE OR REPLACE PROCEDURE filterByRole(tableName VARCHAR, role VARCHAR)
RETURNS TABLE(id NUMBER, name VARCHAR, role VARCHAR)
LANGUAGE PYTHON
RUNTIME_VERSION = '3.9'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'filter_by_role'
AS
$$
from snowflake.snowpark.functions import col
def filter_by_role(session, table_name, role):
df = session.table(table_name)
return df.filter(col("role") == role)
$$;
戻り列の名前と型の省略¶
次の例のコードは、戻り値の列名と型をハンドラーの戻り値の列から挿入できるようにするプロシージャを宣言します。 RETURNS TABLE()
ステートメントから列名と型が省略されています。
CREATE OR REPLACE PROCEDURE filterByRole(tableName VARCHAR, role VARCHAR)
RETURNS TABLE()
LANGUAGE PYTHON
RUNTIME_VERSION = '3.9'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'filter_by_role'
AS
$$
from snowflake.snowpark.functions import col
def filter_by_role(session, table_name, role):
df = session.table(table_name)
return df.filter(col("role") == role)
$$;
プロシージャの呼び出し¶
次の例では、ストアドプロシージャを呼び出します。
CALL filterByRole('employees', 'dev');
プロシージャの呼び出しにより、次の出力が生成されます。
+----+-------+------+
| ID | NAME | ROLE |
+----+-------+------+
| 2 | Bob | dev |
| 3 | Cindy | dev |
+----+-------+------+