
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;
No.3ベストアンサー
- 回答日時:
それも使ってます。
なんでそんなエラーになったか、理由わかりました。
> ";"(セミコロン)または"/"(スラッシュ)のみの行、または "GO" のみの行で区切ったSQLの連続実行
> キャレット位置のみ、キャレット位置以降、全体を指定してSQLの連続実行が出来ます。
> また、セミコロンを無視しての全体実行も出来ます。
https://a5m2.mmatsubara.com/help/SQLEditor/runSq …
この機能のせいで、セミコロンでSQLが分割されて実行されています。
全体実行にすれば実行できます
No.2
- 回答日時:
補足について。
それをコピーして、pgAdminのクエリツールから実行してみましたが、そのエラーは出ませんでした。
# 代入文に間違いはありましたが
# https://www.postgresql.jp/document/11/html/plpgs …
実行方法に何か問題があるのではないでしょうか
No.1
- 回答日時:
> 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. ドル記号で引用符付けされた文字列定数
ご教授して頂いた通り
「A5:SQL Mk-2」で、「スラッシュ("/")のみで行を区切る」に
変更し、「SQLの実行Control+Enter(F5)」でFunctionが作成されました。
何度も時間を取って頂き有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLのエラー(~付近に不適切な...
-
Oracle 8i コンマ(,)を含むデ...
-
PostgreSqlでFunctionの作成に...
-
GROUP BYでエラーが発生
-
バッチファイルからのBCP起動に...
-
@@ERRORと@@ROWCOUNT併用について
-
SQL ServerのSQL実行時のエラー...
-
¥を含む文字列を挿入するとエ...
-
ACCESS ADOでupdateが効かない
-
複数の表の外部結合について
-
Access2000環境に対応するMid関...
-
エラー:823 重大度:24 状態...
-
ACCESS2000ディスクまたはネッ...
-
oo4oのMovePreviousnメソッドに...
-
ACCESSで作成したアプリケーシ...
-
オラクルインストールユーザ以...
-
SQLServerでViewの参照・・・
-
AccessのDAO.ExecuteとDoCmd.Ru...
-
XPにSQLServer2000(StandardE...
-
DB接続ができなくなって困って...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLのエラー(~付近に不適切な...
-
Oracle 8i コンマ(,)を含むデ...
-
GROUP BYでエラーが発生
-
PostgreSqlでFunctionの作成に...
-
ACCESS ADOでupdateが効かない
-
バッチファイルからのBCP起動に...
-
クエリの存在チェック
-
エクセルマクロで指定範囲内の...
-
何も表示されない実行時エラー...
-
エクセルのグループボックス枠...
-
Access2000環境に対応するMid関...
-
sqlで文字列を最後に追加したい
-
ACCESS2000ディスクまたはネッ...
-
ACCESSで作成したアプリケーシ...
-
オブジェクト名 '<table>' が無...
-
oo4oのMovePreviousnメソッドに...
-
ストアドの戻り値(配列)について
-
エクセルからSQLサーバー ...
-
SQLserverのIF文について
-
エラー:823 重大度:24 状態...
おすすめ情報
回答ありがとうございます。 ご指摘された内容が原因と見られますが、下記修正でも
「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
わざわざ確認して頂き有難うございます。
環境が悪い可能性もあります。
「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;
でも同様のエラーが出ました。
別のエディターで試してみます。