2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【SQL】突然始まるPostgreSQL §1 関数作成

Last updated at Posted at 2018-07-20

PostgreSQLの関数 書き方

はじめに

CodewarsというサイトでSQLの問題にチャレンジしている際に書けてしまったので、
発見は記録しておこうということでこちらに書いていこうかなということで記事にしました。

こんなコード書いたんです

書式
DROP FUNCTION IF EXISTS weekdays(DATE,DATE);

CREATE OR REPLACE FUNCTION weekdays(DATE,DATE)
RETURNS INTEGER AS $$
  select $1 - $2
$$
LANGUAGE sql;

問題の内容

Codewarsで出題された問題なんですが、以下のような感じでした。
※この記事書いてる時点では解けていないです笑

二つの日付(DATE型)を引数として与えられた関数が
その二つの引数間の営業日ベース(土日除く)で日数をカウントして、
INTEGERのデータ型がカウントした日数を出力せい 

実行結果と分析

まず、実行した結果からお伝えします。

実行結果
| weekdays |
|   --:    |
|   -9     |

まぁ、これがお作法なのかは全く分からないまま書き連ねているのですが…

とりあえず、最初の一文「DROP FUNCTION IF EXISTS weekdays(DATE,DATE);」で関数自体の初期化をしています。

DROP FUNCTION なので、処理としては「読んで字の如く」ですね。
最初に関数の定義自体を捨てています。このことを私が勝手に初期化とかかっこつけて呼んでます。
これを行う理由としては引数を変えた時にPostgreSQLが引数の情報を更新できないことがあるからだそうです。

※以下の方の記事を参考にさせていただきました。ありがとうございます。
【PostgreSQLで関数を作って、使う[PL/pgSQL入門]】
https://qiita.com/SRsawaguchi/items/411801e254ee66f511f1

初期化をした後に以下のような形式で関数の定義を行なっています。

関数定義
CREATE OR REPLACE FUNCTION weekdays(DATE,DATE)
RETURNS INTEGER AS

上記は関数名:weekdaysという名前でかつ、その関数に与えられる引数はDATE型のデータ2つであることが定義さしています。

見方なのですが、
  「CREATE OR REPLACE FUNCTION」は「関数を作るよ」の宣言部分
  「関数名(引数1,引数2)」
と私は解釈しています。

そして、RETURNSには関数の戻り値が格納されます。
RETURNSの後に記載するのは戻り値のデータ型です。

つまり、この関数はDATE型2つを引数にとり、戻り値はINTEGER型で返すということです。

実行部分
RETURNS INTEGER AS $$
  select $1 - $2
$$
LANGUAGE sql;

実際の処理部分は

実行部分
$$〜$$

で囲った箇所になります。

つまり、この関数で言うと「select $1 - $2」の部分が実行部分になります。
LANGUAGEは何の言語を使用するかを指定する部分です。

↑の関数の場合はSQLを使用するということを示しています。
ちなみに現在、使用可能な言語は以下、公式サイトに記載されています。

【PostgreSQL 9.6.5文書 CREATE FUNCTION】
https://www.postgresql.jp/document/9.6/html/sql-createfunction.html

公式からの抜粋
lang_name
関数を実装している言語の名前です。 
このパラメータには、sql、c、internal、もしくはユーザ定義手続き言語(例:plpgsql)の名前を指定可能です。
名前を単一引用符で囲むのは廃止予定で、大文字小文字の一致が必要になります。

ということでsql,c,internal(?),ユーザが定義した言語(★)を指定することが可能とのことです。
※執筆時点(2018年7月時点)の最新バージョン9.6ではそのように定義されています。
★PostgreSQLではユーザが定義した言語とはストアドプロシージャを示すそうです。
 以下のサイトに情報が上がっていました。

 【ユーザー定義関数を使う】
  < http://www50.tok2.com/home/oppama/pgfuncdef.html >

問題が解けたら随時更新していきます!

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?