【Snowflake】ストアドプロシージャの戻り値でテーブル情報を返す方法。サンプルコードあり

分析

Snowflakeのストアドプロシージャには、戻り値にテーブル情報を指定できる機能があることをご存じでしたか?

この戻り値にテーブル情報を指定できる機能はとても便利です。

これまではストアドプロシージャで処理を実行し、結果についてはSelect文を実行して確認という2ステップ必要だった手順が、ストアドプロシージャを実行するだけの1ステップで実行結果が表示できるようになり、作業効率も上がります。

分析屋としては、データクレンジングの際に何度も使うストアドプロシージャには、必須の機能だと考えます。

すぐに使えるサンプルコードもありますので、是非試してください。

処理手順の概要とサンプルコード

ストアドプロシージャで戻り値にSelect文の実行結果を返すためには、いくつかの手順が必要です。

処理の流れは以下の通りです。

①ストアドプロシージャの戻り値の型を指定

②Select文の結果を保持するResultSet変数を定義

③Select文を実行し②のResultSet変数に設定

④return文でテーブル情報を返す

以下サンプルSQLを示します。

CREATE OR REPLACE PROCEDURE TEST_P (in_t varchar(100))
    // ① ストアドプロシージャの戻り値の型を指定
    RETURNS TABLE()
    LANGUAGE SQL

AS
$$
DECLARE
    // ② Select文の結果を保持するResultSet変数を定義
    res RESULTSET;
BEGIN

    create or replace temporary table _test as select 1 as no;
 
    // ③ Select文を実行し②のResultSet変数に設定
    res := (select * from _test);

    // ④ return文でテーブル情報を返す
    return TABLE(res);  

end;
$$;

以下、各処理の説明を記載します。

①ストアドプロシージャの戻り値の型を指定

CREATE OR REPLACE PROCEDURE 構文の Returnsパラメータは、戻り値の型を指定するパラメータです。

文字列を戻り値としたい場合は「String」を指定しますが、テーブル情報を戻り値としたい場合は「TABLE()」を指定します。

②Select文の結果を保持するResultSet変数を定義

ResultSet変数の定義は、必ずDECLARE と BEGIN で囲まれた部分に記載する必要があります。

Snowflakeのお作法だと理解してください。変数名は何をつけても問題ありません。

変数名を変えた場合、サンプルコードの「res」も置き換えるようにしてください。

③Select文を実行しResultSet変数に設定

戻り値を制御しているのが、この部分の記述です。Select文を変えることで、戻り値の内容を変えることができます。

なお、Snowflakeのお作法として、ResultSet変数にSelect文の結果を設定する場合、Select文はカッコで囲む必要があります。

また、ResultSet変数への値の設定には「:=」(コロンイコール)を指定する必要があります。

Snowflake初心者だと、「=」と「:=」の使い分けが難しく感じてしまいますよね。

DECLARE ~BEGINで囲まれた領域で定義した変数に値を設定するには「:=」(コロンイコール)を使うと覚えてしまうのが簡単です。

④return文でテーブル情報を返す

return 文に指定した内容が、ストアドプロシージャの戻り値として返されます。

テーブル情報を返す場合は、「TABLE(ResultSet変数名)」を指定します。

このReturn文は便利で、ストアドプロシージャのデバッグにも使えます。

例えば①のReturnsパラメータでStringを指定した場合、Returnで任意の文字列を返し処理結果として表示することが可能です。

その他

サンプルコードの「$$」は、Webベースのアプリでストアドプロシージャを実行するために必要なお作法です。

プロシージャの関数の始まりと終わりを表しているとのことですので、深い意味は考えずに AS と DECLAREの間と END;の後に「$$」を指定しましょう。

ストアドプロシージャーの実行手順

ストアドプロシージャの実行には、call 文を利用し、作成した関数を呼び出します。

下記のサンプルコードを実行し、ストアドプロシージャの戻り値がWebUI上に表示されることを確認ください。

//  作成したストアドプロシージャの実行
call TEST_P(IN_T => 'TEST');

実行結果が以下のよう表示されれば成功です。

なお、今回の関数では引数の値を利用しませんでしたが、ストアドプロシージャの引数に値を設定する場合は「=>」を指定します。

上記サンプルでは、変数「IN_T」に文字列’test’を設定した上で、ストアドプロシージャを実行しています。

コメント

タイトルとURLをコピーしました