ストアドプロシージャからの選択¶
ストアドプロシージャの中には、表形式のデータを返すものがあります。このテーブルデータを選択して操作するには、 SELECT ステートメントの FROM 句でこれらのメソッドを呼び出します。
TABLE キーワードを使用して、 SELECT ステートメントを実行します。¶
ストアドプロシージャを呼び出すときは、 CALL コマンドを省略します。その代わりに、 TABLE キーワードを使用し、括弧の中にプロシージャ名を付けます。
SELECT ... FROM TABLE( <stored_procedure_name>( <arg> [ , <arg> ... ] ) );
ストアドプロシージャから選択する例¶
この例では、以下のテーブルのデータを使用します。
CREATE OR REPLACE TABLE orders (
order_id INT,
u_id VARCHAR,
order_date DATE,
order_amount NUMBER(12,2));
INSERT INTO orders VALUES (1, 'user_id_001', current_date, 500.00);
INSERT INTO orders VALUES (2, 'user_id_003', current_date, 225.00);
INSERT INTO orders VALUES (3, 'user_id_001', current_date, 725.00);
INSERT INTO orders VALUES (4, 'user_id_002', current_date, 150.00);
INSERT INTO orders VALUES (5, 'user_id_002', current_date, 900.00);
次のストアド プロシージャは、ユーザー ID に基づいて注文情報を返します。
CREATE OR REPLACE PROCEDURE find_orders_by_user_id(user_id VARCHAR)
RETURNS TABLE (
order_id INT, order_date DATE, order_amount NUMBER(12,2)
)
LANGUAGE SQL AS
DECLARE
res RESULTSET;
BEGIN
res := (SELECT order_id, order_date, order_amount FROM orders WHERE u_id = :user_id);
RETURN TABLE(res);
END;
注: SnowSQL、 Classic Console、 execute_stream
または execute_string
メソッドを Python Connector コードで使用している場合は、代わりにこの例を使用してください(SnowSQL、 Classic Console、Python ConnectorでSnowflakeスクリプトを使用する を参照)。
CREATE OR REPLACE PROCEDURE find_orders_by_user_id(user_id VARCHAR)
RETURNS TABLE (
order_id INT, order_date DATE, order_amount NUMBER(12,2)
)
LANGUAGE SQL AS
$$
DECLARE
res RESULTSET;
BEGIN
res := (SELECT order_id, order_date, order_amount FROM orders WHERE u_id = :user_id);
RETURN TABLE(res);
END;
$$
;
次の SELECT ステートメントは、ストアド プロシージャの結果を取得します。
SELECT * FROM TABLE(find_orders_by_user_id('user_id_001'));
+----------+------------+--------------+
| ORDER_ID | ORDER_DATE | ORDER_AMOUNT |
|----------+------------+--------------|
| 1 | 2024-08-30 | 500.00 |
| 3 | 2024-08-30 | 725.00 |
+----------+------------+--------------+
ストアドプロシージャからの選択の制限¶
ストアド・プロシージャからの選択には以下の制限があります。
SELECT ステートメントの FROM 句には、 SELECT、 SHOW、 DESCRIBE、 CALL ステートメントを実行するストアド プロシージャのみを配置できます。DDL、または DML 操作を使用して変更を行うストアドプロシージャは許可されません。CALL ステートメントを発行するストアドプロシージャの場合、これらの制限は呼び出されるストアドプロシージャに適用されます。
静的な出力スキーマを持つ表データを返すストアドプロシージャだけを、 SELECT ステートメントの FROM 句に入れることができます。出力列には名前と型が必要です。例えば、以下の RETURNS 句を持つストアドプロシージャがサポートされています。
RETURNS TABLE (col1 INT, col2 STRING)
以下の RETURNS 句を持つストアド・プロシージャは、表形式のデータを返さないためサポートされていません。
RETURNS STRING
以下の RETURNS 句を持つストアド・プロシージャは、固定出力スキーマを提供しないため、サポートされていません。
RETURNS TABLE()
ストアド・プロシージャは、 SELECT ブロックの FROM 句で、以下のいずれかのステートメントの中で呼び出す必要があります。
ストアド・プロシージャは、 SELECT ステートメントの外部で定義された CTE への参照のような、外部スコープからの相関入力引数を受け取ることはできません。
引数にサブクエリが含まれている場合、そのサブクエリは WITH 句で定義された CTE を使用することはできません。
ストアド・プロシージャの呼び出しを含む SELECT ステートメントは、ビュー本体、ユーザー定義関数(UDF)、ユーザー定義テーブル関数(UDTF)、または 行アクセス・ポリシー や データ・マスキング・ポリシー などのオブジェクトでは使用できません。