PL /PgSQL
を実行しようとしているようです。 <を使用して関数にラップせずに、スタンドアロンのコードブロックcode>関数の作成または置換
。それは機能しません。関数に含めるか、(PostgreSQL 9.0から) DO ブロック
。 PL/PgSQLとプレーンSQLは異なる言語です したがって、PL/PgSQLコードを直接実行することはできません。
理由を説明していただければ助かります 貼り付けたコードを書き込もうとしています。 トリガー関数でより適切に処理される問題を解決しようとしていると思われます 監査トリガー のように 。
いくつかの重要な注意事項:
PostgreSQLを更新する必要があります :PostgreSQL 8.2は危険なほど古く、サポートされていません 。セキュリティとバグ修正はリリースされていません。サポートされているバージョンに早急にアップグレードしてください。ただし、リリースノートを必ずお読みください。 a> 移行と互換性に関するアドバイスについては、「8.3.0」、「8.4.0」などのメジャーな「.0」バージョンごとに。
'now'は避けてください :また、'now'を使用する代わりに 通常、現在の日付/時刻を使用する必要があります機能
、特に current_timestamp 。
current_timestamp 安定しています : current_timestamp の値が原因で、実行しているフープジャンプはおそらく不要です。 (および'now' ::timestamp )トランザクションの期間中は変更されません。例:
regress=# BEGIN;
regress=# SELECT current_timestamp;
2012-08-14 14:52:43.382596+08
regress=# SELECT pg_sleep(5);
regress=# SELECT current_timestamp;
2012-08-14 14:52:43.382596+08
詳細h3>
あなたの意図は次のように思われます(不正解、使用しないでください )コード:
CREATE OR REPLACE FUNCTION some_function(logtxt text) RETURNS timestamptz AS $$
DECLARE
curtime char;
BEGIN
curtime := 'now';
INSERT INTO logtable VALUES (logtxt, curtime);
RETURN curtime;
END;
$$ LANGUAGE 'plpgsql';
しかし、 charを誤用しました 長さパラメーターを必要とするデータ型。指定されていない場合、デフォルトで1になるため、次のようになります。
regress=# SELECT some_function();
ERROR: value too long for type character(1)
CONTEXT: PL/pgSQL function "some_function" line 5 at assignment
絶対に charを使用します SQLのデータ型。 varcharを使用する またはtext 。データベース間の移植性のためにvarchar(n) ここで、 n 最大長が必要です。移植性が必要ない場合は、 textを使用してください 。
charを変更した場合 textへ 上記では、コードが実行される可能性がありますが、それでも意味がありません。私はあなたが本当に書きたいと強く思っています:
CREATE OR REPLACE FUNCTION some_function(logtxt text) RETURNS timestamptz AS $$
BEGIN
INSERT INTO logtable VALUES (logtxt, current_timestamp);
RETURN current_timestamp;
END;
$$ LANGUAGE 'plpgsql';
...しかし、現在の日付/時刻関数 。
それでも、本当に多すぎます。トリガーにより適した問題を解決しようとしていると思います。