Functionを使う事で、Flutterのクライアントではサポートしていない複雑なクエリ処理を実現したり、「ユーザーが登録されたら自動でデータベースに登録」といったトリガー処理が可能になります。今回はsupabaseのコンソール側で、functionの作成やプレビューを行ってみます。

関数作成環境の準備

まずは関数を作成するための準備を行います。

SQLエディタで新しいクエリを作る

左メニューからSQL Editorのアイコンをクリック後、「+New query」をクリックします。

「New Query」という名前の新しい空のクエリが出来ます。メニューからこれを選択し、「Rename query」を選択します。

名前を「MyQuerys」としておきます。Discriptionはお好みで。

確認用のクエリも準備

もう1つ同じ手順でクエリを作成します。名前は「TestQuery」とします。

こんな感じで2つ出来たら準備完了です。

HelloWorldの作成

一番単純な、文字列返却をするだけの関数を作成します。

MyQuerysに「Hello_world」関数の記載

それでは、早速関数を作っていきましょう。下記をMyQuerysに記述します。

CREATE OR REPLACE Function hello_world() 
returns text as 
$$
DECLARE
  first_mes  text;
  second_mes text;
  fix_mes    text;
BEGIN
  first_mes  = 'ハロー';
  second_mes = '世界';
  fix_mes    = first_mes || second_mes;
RETURN fix_mes;
END;
$$
LANGUAGE plpgsql;

右下にある「Run」ボタンを押します。正しくクエリが生成されるとSuccess. No rows returnedが出ます。

TestQueryに記載と実行

TestQuery側に、先ほど作った関数名の呼び出しを書きます。

select hello_world();

こちらをRunを押して実行すると、「ハロー世界」が出力される事が確認出来ます。これはMyQuerys記載した「hello_world」関数の出力結果となります。

関数の解説

これはPostgreSQLのストアドプロシージャと呼ばれる書式です。書き方が独特で、定型をまずは覚える(コピペでも)のが良いかも知れません。

【01】 CREATE OR REPLACE Function hello_world() 
【02】 returns text as 
【03】 $$
【04】 DECLARE
【05】   first_mes  text;
【06】   second_mes text;
【07】   fix_mes    text;
【08】 BEGIN
【09】   first_mes  = 'ハロー';
【10】   second_mes = '世界';
【11】   fix_mes    = first_mes || second_mes;
【12】 RETURN fix_mes;
【13】 END;
【14】 $$
【15】 LANGUAGE plpgsql;

それぞれの意味の記載となります。定義的なものはハイライト表記にします。

  1. 関数名の定義です。hello_world()の部分を適宜変更します。その前の部分は作成タイプです。引数も入れられます(後述)。
  2. 返り値の型を記載します。今回はText型になります。(こちらはStringではなくTextになります)
  3. $$で囲みます。ここでは定型的なものとして覚えておきます。
  4. DECLAREとBEGINの間に変数が定義出来ます。
  5. 変数宣言。text型の「first_mes」を宣言しています。型が後に来ます。
  6. 変数宣言。text型の「second_mes」を宣言しています。型が後に来ます。
  7. 変数宣言。text型の「fix_mes」を宣言しています。型が後に来ます。
  8. BEGINから処理が始まります。
  9. 処理。first_mesに「ハロー」という文字を入れています。
  10. 処理。second_mesに「世界」をいう文字を入れています。
  11. 処理。first_mesとsecond_mesを連結したものをfix_mesにしています。文字列連結は「||」となります。
  12. 処理。fix_mesを返却します。
  13. 処理の終わりを示します。
  14. $$で囲みます。ここでは定型的なものとして覚えておきます。
  15. 言語がplpgsqlで書かれている事を宣言しています。

引数付きの関数作成

続いて、引数付きの関数を作ります。

関数の作成とテストの作成

MyQuerysを選択し、先ほどのhello_worldの下にこちらを追加してください。

CREATE OR REPLACE Function joint_text(before_text text , after_number int) 
returns text as 
$$
DECLARE
  fix_mes text;
BEGIN
  fix_mes = before_text || cast(after_number as text);
RETURN fix_mes;
END;
$$
LANGUAGE plpgsql;

↓な感じに、前の関数の下に追加しちゃってください。1クエリ―の中に関数は複数記載出来ます。

右下にある「Run」ボタンを押し、Success. No rows returnedが出たらTestQueryの方は書き換えます

select joint_text('テストだよ',123);

実行すると結果が出ます。

コード解説

前回と変わらない部分が多いので、今回新しい箇所だけピックアップします。

【01】 CREATE OR REPLACE Function joint_text(before_text text , after_number int) 
【02】 returns text as 
【03】 $$
【04】 DECLARE
【05】   fix_mes text;
【06】 BEGIN
【07】   fix_mes = before_text || cast(after_number as text);
【08】 RETURN fix_mes;
【09】 END;
【10】 $$
【11】 LANGUAGE plpgsql;

【01】引数定義

CREATE OR REPLACE Function joint_text(before_text text , after_number int)

関数定義に引数が追加されています。今回はtext型のbefore_textと、int型のafter_numberを受け取る事にしました。引数の書式は変数の定義と同じように後に型が来ます。

【07】数値→テキスト型への変換(キャスト)

cast(after_number as text);

この部分ですが、after_numberをtext型に変換するキャストの処理を行っています。こちらのページを参考にさせていただきました。

作った関数の確認と削除

作った関数は別の場所に登録されています。これを知らないと次のトラブルが発生します。

※caution※

  • クエリエディタから関数コードを消しただけでは、作成した関数自体は消えません。
    • 実行が出来てしまいます。
  • 作成した関数の引数や戻り値を変えようとすると、変更できませんと怒られます。
    • 一回削除してから再登録する必要があります(変更手段があるかも知れないが不明)

左メニューのDataBaseアイコンをクリック、「Functions」をクリックすると作成した関数の一覧が出てきます。消去する時は右側の「…」をクリックし「Delete function」を選択後、確認のため関数名を入れろと言われるので入力する事で関数の実体を消去する事が出来ます。