を使用して関数にラップせずに、 PL/PgSQLコードブロックをスタンドアロンで実行しようとしているようですCREATE OR REPLACE FUNCTION
。DO
それは機能しません。関数または(PostgreSQL 9.0から)ブロックに含める必要があります。PL / PgSQLとプレーンSQLは異なる言語であるため、PL/PgSQLコードを直接実行することはできません。
貼り付けたコードを書き込もうとしている理由を説明しておくと役に立ちます。監査トリガーのようなトリガー関数でより適切に処理される問題を解決しようとしているのではないかと思います。
いくつかの重要な注意事項:
PostgreSQLを更新する必要があります:PostgreSQL 8.2は危険なほど古く、サポートされていません。セキュリティとバグ修正はもうリリースされていません。サポートされているバージョンに早急にアップグレードしてください。ただし、移行と互換性に関するアドバイスについては、「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
詳細
あなたの意図は次のようなもののようです(正しくない、使用しないでください)コード:
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
SQLchar
でデータ型を使用しないでください。使用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';
...しかし、あなたは現在の日付/時刻関数について知りませんでした。
それでも、本当に多すぎます。トリガーにより適した問題を解決しようとしていると思います。