この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。
先日、Snowflakeでプレビューリリースされた新しいSnowflake SQLのプロシージャ用拡張機能「Snowflake Scripting」についてエントリーを書きました。
このエントリで、記載したとおり「SnowSQL(CLI経由)」の場合と「従来のウェブインターフェイス」の場合にはSnowflakeスクリプトのブロックを「一重引用符または二重ドル記号」で囲む必要がありました。
一方で、「Python Connectorを利用する場合にはどうしたら良いのか?」というのが気になったので実際に試してみました。
検証用コード
検証用コードとしては、以下のエントリで作成したクエリを実行するコードをそのまま利用します。
追加修正したポイントとしては以下の通りです。
if __name__ == "__main__":
zeller_file_path = 'sql/zeller.sql'
exec_async_query(zeller_file_path)
call_file_path = 'sql/call.sql'
exec_async_query(call_file_path)
プロシージャを作成するクエリファイルsql/zeller.sql
と、プロシージャを実行するクエリファイルsql/call.sql
を指定して実行するようにしました。
sql/zeller.sql
create or replace procedure zeller()
returns number(1,0)
language sql
as
declare
year number(4,0);
month number(2,0);
day number(2,0);
w number;
x number(1,0);
begin
year := 2022;
month := 1;
day := 25;
if (month <= 2) then
year := year - 1;
month := month + 10;
else
month := month - 2;
end if;
w := day + ((13 * month - 1) / 5)::integer + year + (year / 4)::integer - (year / 100)::integer + (year / 400)::integer;
x := w % 7;
return x;
end;
ストアドプロシージャを作成するクエリです。こちらのクエリでは「一重引用符または二重ドル記号」でスクリプトブロックを囲んでいません。
sql/call.sql
call zeller();
ストアドプロシージャを呼び出すクエリです。単純にcall
で呼んでいるだけですね。
実行してみる
実際に実行した結果がこちらです。
$ python procedure.py
async query executed.
waiting query results...
recieved query results.
query result:
[{'status': '関数 ZELLER が正常に作成されました。'}]
async query executed.
waiting query results...
recieved query results.
query result:
[{'ZELLER': 2}]
問題なく作成されており、実行にも成功しています!
まとめ
以上、「Snowflake Scripting」で記述したプロシージャをPython Connectorで登録してみました。
当初はSnowSQLと同じ扱いになりそうなので「一重引用符または二重ドル記号」でスクリプトブロックを囲んであげないとエラーになるのかな?と思っていたのですが、意外にそのまま問題なく実行できました。個人的には「一重引用符または二重ドル記号」を書かないほうが好みなので、嬉しかったです。
どなたかのお役に立てば幸いです。それでは!