SQL で作成したストアドプロシージャで Scala を使って表形式を返します。¶
表形式フォームでデータを返すプロシージャを書くことができます。表形式データを返すプロシージャを作成するには、次の手順を実行します。
CREATE PROCEDURE ステートメントで、プロシージャの戻り値の型として
TABLE(...)
を指定します。TABLE パラメータとして、返されたデータの列名と 型 がわかっている場合はそれらを指定できます。プロシージャを定義するときに返される列がわからない場合(実行時に指定する場合など)は、 TABLE パラメーターを省略することができます。そうすると、プロシージャの戻り値の列は、そのハンドラーが返すデータフレームの列から変換されます。列データ型は、 SQL-Scalaデータ型マッピング で指定されたマッピングに従って、 SQL に変換されます。
Snowparkデータフレームで表形式の結果を返すようにハンドラーを記述します。
データフレームの詳細については、 Snowpark Scalaでの DataFrames の操作 をご参照ください。
注釈
プロシージャがランタイム時にエラーを発生させるのは、以下のいずれかが真である場合です。
戻り値の型として TABLE を宣言しているが、そのハンドラーはデータフレームを返さない。
そのハンドラーはデータフレームを返しているが、プロシージャは TABLE を戻り値の型として宣言しない。
例¶
このセクションの例は、列が文字列と一致する行をフィルターするプロシージャーから表形式の値を返すことを示しています。
データの定義¶
次の例のコードは、従業員のテーブルを作成します。
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');
行をフィルターするプロシージャの宣言¶
次の2つの例のコードは、テーブル名とロールを引数として受け取るストアドプロシージャを作成し、ロール列の値が引数として指定されたロールと一致するテーブル内の行を返します。
戻り列の名前と型の指定¶
この例では、 RETURNS TABLE()
ステートメントで列の名前と型を指定しています。
CREATE OR REPLACE PROCEDURE filter_by_role(table_name VARCHAR, role VARCHAR)
RETURNS TABLE(id NUMBER, name VARCHAR, role VARCHAR)
LANGUAGE SCALA
RUNTIME_VERSION = '2.12'
PACKAGES = ('com.snowflake:snowpark:latest')
HANDLER = 'Filter.filterByRole'
AS
$$
import com.snowflake.snowpark.functions._
import com.snowflake.snowpark._
object Filter {
def filterByRole(session: Session, tableName: String, role: String): DataFrame = {
val table = session.table(tableName)
val filteredRows = table.filter(col("role") === role)
return filteredRows
}
}
$$;
注釈
現在、 RETURNS TABLE(...)
句では、 GEOGRAPHY を列タイプとして指定することはできません。これは、ストアドプロシージャまたは匿名プロシージャを作成する場合に適用されます。
CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
RETURNS TABLE(g GEOGRAPHY)
...
WITH test_return_geography_table_1() AS PROCEDURE
RETURNS TABLE(g GEOGRAPHY)
...
CALL test_return_geography_table_1();
列タイプとして GEOGRAPHY を指定しようとすると、ストアドプロシージャの呼び出しはエラーになります。
Stored procedure execution error: data type of returned table does not match expected returned table type
この問題を回避するには、 RETURNS TABLE()
の列の引数と型を省略します。
CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
RETURNS TABLE()
...
WITH test_return_geography_table_1() AS PROCEDURE
RETURNS TABLE()
...
CALL test_return_geography_table_1();
戻り列の名前と型の省略¶
次の例のコードは、戻り値の列名と型をハンドラーの戻り値の列から挿入できるようにするプロシージャを宣言します。 RETURNS TABLE()
ステートメントから列名と型が省略されています。
CREATE OR REPLACE PROCEDURE filter_by_role(table_name VARCHAR, role VARCHAR)
RETURNS TABLE()
LANGUAGE SCALA
RUNTIME_VERSION = '2.12'
PACKAGES = ('com.snowflake:snowpark:latest')
HANDLER = 'Filter.filterByRole'
AS
$$
import com.snowflake.snowpark.functions._
import com.snowflake.snowpark._
object Filter {
def filterByRole(session: Session, tableName: String, role: String): DataFrame = {
val table = session.table(tableName)
val filteredRows = table.filter(col("role") === role)
return filteredRows
}
}
$$;
プロシージャの呼び出し¶
次の例では、ストアドプロシージャを呼び出します。
CALL filter_by_role('employees', 'dev');
プロシージャの呼び出しにより、次の出力が生成されます。
+----+-------+------+
| ID | NAME | ROLE |
+----+-------+------+
| 2 | Bob | dev |
| 3 | Cindy | dev |
+----+-------+------+