【小ネタ】「Snowflake Scripting」で記述したプロシージャをPython Connectorで登録してみた

2022.01.26

こんにちは!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と同じ扱いになりそうなので「一重引用符または二重ドル記号」でスクリプトブロックを囲んであげないとエラーになるのかな?と思っていたのですが、意外にそのまま問題なく実行できました。個人的には「一重引用符または二重ドル記号」を書かないほうが好みなので、嬉しかったです。

どなたかのお役に立てば幸いです。それでは!