---
title: SnowflakeのProcedureとFunctionをJavascriptベースで試してみた
description: SnowflakeのProcedure（Stored Procedure）とFunction（UDFs, UDTFs）をJavascriptベースで試してみた
---

[Snowflake Knowledge - INSIGHT LAB](https://knowledge.insight-lab.co.jp/snowflake)

# [SnowflakeのProcedureとFunctionをJavascriptベースで試してみた](https://knowledge.insight-lab.co.jp/snowflake/stored-function-procedure-01)

 作成者: [Chris Hirasawa](https://knowledge.insight-lab.co.jp/snowflake/author/chris)｜2020年12月23日

## まえがき

本記事は[Snowflake Advent Calendar 2020](https://adventar.org/calendars/5085)の24日目の記事となります。

今回は、Snowflakeのユーザ側で定義できるFunctionやProcedureについて紹介いたします。

少々細かい部分かと思いますが、DB側で関数を利用する際はアンチパターンの場合もあったり使い所がなかなか難しいと感じた方も多いのではないでしょうか？

この記事がユーザ定義関数を利用する上で良い判断材料や何か新しい運用アイディアにつながればと思います。

## SnowflakeのUDFs, UDTFs, UDPsについて

先ずは、色々なパターンがあるので一旦表にまとめてみました。

| 種類 | 言語 | 引数 | 戻り値 | 補足 |
| --- | --- | --- | --- | --- |
| **UDFs** | **JavaScript** | **1以上** | **スカラー** | **クエリが発行できない** |
| SQL  | 1以上 | スカラー | スクリプトライクな利用はできない |  |
| **UDTFs** | **JavaScript** | **1以上** | **テーブル** | **クエリが発行できない** |
| SQL | 1以上 | テーブル | スクリプトライクな利用はできない |  |
| **UDPs** | **JavaScript** | **0以上** | **不可（なし）** | **ステートメント扱い, SQLを発行できる** |
| SQL | 0以上 | なし（なし） | ステートメント扱い |  |

※UDFs = User Defined Functions, UDTFs = User Defined Table Functions, UDPs = User Defined Procedures

上記の表を参考にJavaScriptにフォーカスをして利用していきたいと思います。  
因みにStored ProcedureのことをUDPsとあえて記載しておりますが、一般的ではないですのでご留意下さい。

また、公式ドキュメントは下記となります。

- # [UDFsの概要](https://docs.snowflake.com/ja/sql-reference/udf-overview.html)
- # [JavaScript UDFs](https://docs.snowflake.com/ja/sql-reference/udf-js.html)
- # [SQL UDFs](https://docs.snowflake.com/ja/sql-reference/udf-sql.html)
- # [JavaScript UDTFs](https://docs.snowflake.com/ja/sql-reference/udf-js-table-functions.html)
- # [SQL UDTFs](https://docs.snowflake.com/ja/sql-reference/udf-table-functions.html)
- # [ストアドプロシージャの概要](https://docs.snowflake.com/ja/sql-reference/stored-procedures.html)

### Functionについて

Functionは、基本的にSQLのステートメントに組み込む形で利用されます。  
例として下記のようになります。

返り値がスカラーの場合は、SELECT句やWHERE句などに利用されます。  
また、返り値がテーブルの場合は、FROM句でTABLE()にキャストしてから利用されます。

### Procedureについて

Proceduresは、MySQLや他のクエリ言語と同じですが一つのステートメントとして実行されます。  
例として下記のようになります。

 

### ユースケースのご紹介

今回は、Procedureを利用してマスタテーブルを引数を使ってセレクトした結果を再利用するといったユースケースをご紹介します。

コードに記載の通り、大まかな流れとしては下記のようになります。

1. テーブル作成
2. プロシージャ作成
3. プロシージャの呼び出し
4. プロシージャが実行した結果を読み込みパースしてテーブルとして表示

上記のコードでは、引数に応じてスクリプトライクに条件分岐ができ、かつクエリの実行と結果の利用もできます。

今回は、RESULT\_SCAN(LAST\_QUERY\_ID())を利用していますが、より運用面を意識するならば、TMPテーブルをCREATEして利用した後にDROPするようにすれば活用の場面が増えると考えています。

## あとがき

いかがでしたでしょうか。

今回は、細かい部分でしたがある場面ではかなり実用性のあるユーザ定義関数及びプロシージャを紹介させて頂きました。

1点注意としては、2020/12/23 現在Snowflakeのブラウザコンソール上でGUIとして、関数が管理できない部分があります。

データベースやスキーマを明示しないまま意図しない場所に作成された場合は、  
`show user functions in account;`などを利用して確認することができます。

今後利用する予定がある場合は、ユースケースにマッチするかどうかで関数を活用していきたいと私自身も気をつけたいです。

以上「SnowflakeのProcedureとFunctionをJavascriptベースで試してみた」でした。

``````

[完全な記事を表示](https://knowledge.insight-lab.co.jp/snowflake/stored-function-procedure-01)

```json
{
  "@context" : "http://schema.org",
  "@type" : "BlogPosting",
  "author" : {
    "@type" : "Person",
    "name" : "Chris Hirasawa"
  },
  "dateModified" : "2020-12-24T02:01:35.394Z",
  "datePublished" : "2020-12-23T15:00:00Z",
  "headline" : "SnowflakeのProcedureとFunctionをJavascriptベースで試してみた",
  "image" : {
    "@type" : "ImageObject",
    "height" : 427,
    "url" : "https://download.insight-lab.co.jp/hubfs/Snowflake-Logo.png",
    "width" : 640
  },
  "mainEntityOfPage" : "https://knowledge.insight-lab.co.jp/snowflake/stored-function-procedure-01",
  "publisher" : {
    "@type" : "Organization",
    "logo" : {
      "@type" : "ImageObject",
      "height" : 60,
      "url" : "/hs/hsstatic/content_shared_assets/static-1.4092/img/default-amp-logo.png",
      "width" : 60
    },
    "name" : "snowflakeナレッジ"
  }
}
```