dポイントプレゼントキャンペーン実施中!

PostgreSql(Ver.11)で24時以降の時間を25時などに変換するFunctionを作成したいのですが
入力時間、出力時間共、文字列で入力して文字列に変換して出力したいのですが、下記functionを
作成しようとすると「SQL : "00"またはその近辺で構文エラー」となります。
Function内で文字列をシングルコーテーションで囲むとエラーになるのですか?


CREATE OR REPLACE FUNCTION FromTime(INTIME character varying(5)) RETURNS character varying(5) AS '
DECLARE
OUT_TIME character varying(5);
BEGIN

IF INTIME = '00:00' --ここでエラーになります(原因は、シングルコーテーションで囲んだから?)
THEN OUT_TIME := '24:00'
END IF;

RETURN OUT_TIME;
END;

質問者からの補足コメント

  • 回答ありがとうございます。 ご指摘された内容が原因と見られますが、下記修正でも
    「DECLARE OUT_TIME text"またはその近辺で文字列のドル引用符が閉じていません」のエラーが出ます。
    CREATE OR REPLACE FUNCTION FromTime(INTIME character varying(5)) RETURNS text AS $$
    DECLARE
    OUT_TIME text;
    BEGIN

    IF INTIME = '00:00'
    THEN OUT_TIME := '24:00'
    END IF;

    RETURN OUT_TIME;
    END;
    $$ LANGUAGE plpgsql

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/03/24 11:31
  • わざわざ確認して頂き有難うございます。
    環境が悪い可能性もあります。
    「A5:SQL Mk-2」エディタでFunction を作成しようとしたので
    相性が悪いかもしれません。

    https://www.postgresql.jp/document/9.4/html/sql- …
    PostgreSQL 9.4.5文書
    PL/pgSQLで、引数名を使用して、整数を1増やします。
    CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$
    BEGIN
    RETURN i + 1;
    END;
    $$ LANGUAGE plpgsql;
    でも同様のエラーが出ました。
    別のエディターで試してみます。

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/03/24 19:23

A 回答 (3件)

それも使ってます。



なんでそんなエラーになったか、理由わかりました。

> ";"(セミコロン)または"/"(スラッシュ)のみの行、または "GO" のみの行で区切ったSQLの連続実行
>  キャレット位置のみ、キャレット位置以降、全体を指定してSQLの連続実行が出来ます。
>  また、セミコロンを無視しての全体実行も出来ます。
https://a5m2.mmatsubara.com/help/SQLEditor/runSq …

この機能のせいで、セミコロンでSQLが分割されて実行されています。
全体実行にすれば実行できます
    • good
    • 0

補足について。



それをコピーして、pgAdminのクエリツールから実行してみましたが、そのエラーは出ませんでした。
# 代入文に間違いはありましたが
# https://www.postgresql.jp/document/11/html/plpgs …

実行方法に何か問題があるのではないでしょうか
この回答への補足あり
    • good
    • 0

https://www.postgresql.jp/document/11/html/sql-c …

> AS 'definition'

とあるように、 as の後には、定義したい内容を書いた文字列が決ます


CREATE OR REPLACE FUNCTION FromTime(INTIME character varying(5)) RETURNS character varying(5) AS '

の最後についている ' は飾りではありません。文字列の始まりです。
ここから対になる ' までが文字列です。ということは
IF INTIME = '
までがas に指定する文字列で
00:00
から先は、文字列の外になるので、最初に書いたマニュアルの文法に従って解釈されます。
そして、こんな書き方は無いので「構文エラー」になります。


https://www.postgresql.jp/document/11/html/sql-s …
全体を文字列にしたいのなら、上記を参考に ' を「文字列の終り」ではなく「シングルクオーテーション」として扱うように記述します。
CREATE FUNCTIONのサンプルにもあるように、$ を使うのが常套手段です。
> 4.1.2.4. ドル記号で引用符付けされた文字列定数
この回答への補足あり
    • good
    • 0
この回答へのお礼

ご教授して頂いた通り
「A5:SQL Mk-2」で、「スラッシュ("/")のみで行を区切る」に
変更し、「SQLの実行Control+Enter(F5)」でFunctionが作成されました。
何度も時間を取って頂き有難うございました。

お礼日時:2020/03/26 13:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す