ストアドプロシージャからの選択

ストアドプロシージャの中には、表形式のデータを返すものがあります。このテーブルデータを選択して操作するには、 SELECT ステートメントの FROM 句でこれらのメソッドを呼び出します。

TABLE キーワードを使用して、 SELECT ステートメントを実行します。

ストアドプロシージャを呼び出すときは、 CALL コマンドを省略します。その代わりに、 TABLE キーワードを使用し、括弧の中にプロシージャ名を付けます。

SELECT ... FROM TABLE( <stored_procedure_name>( <arg> [ , <arg> ... ] ) );
Copy

ストアドプロシージャから選択する例

この例では、以下のテーブルのデータを使用します。

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);
Copy

次のストアド プロシージャは、ユーザー 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;
Copy

注: SnowSQLClassic Consoleexecute_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;
$$
;
Copy

次の SELECT ステートメントは、ストアド プロシージャの結果を取得します。

SELECT * FROM TABLE(find_orders_by_user_id('user_id_001'));
Copy
+----------+------------+--------------+
| 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)
    
    Copy

    以下の RETURNS 句を持つストアド・プロシージャは、表形式のデータを返さないためサポートされていません。

    RETURNS STRING
    
    Copy

    以下の RETURNS 句を持つストアド・プロシージャは、固定出力スキーマを提供しないため、サポートされていません。

    RETURNS TABLE()
    
    Copy
  • ストアド・プロシージャは、 SELECT ブロックの FROM 句で、以下のいずれかのステートメントの中で呼び出す必要があります。

  • ストアド・プロシージャは、 SELECT ステートメントの外部で定義された CTE への参照のような、外部スコープからの相関入力引数を受け取ることはできません。

  • 引数にサブクエリが含まれている場合、そのサブクエリは WITH 句で定義された CTE を使用することはできません。

  • ストアド・プロシージャの呼び出しを含む SELECT ステートメントは、ビュー本体、ユーザー定義関数(UDF)、ユーザー定義テーブル関数(UDTF)、または 行アクセス・ポリシーデータ・マスキング・ポリシー などのオブジェクトでは使用できません。