2

このブロックを PostgreSQL 8.2 で実行できません。

DECLARE
        curtime char;
BEGIN
        curtime := 'now';
        INSERT INTO logtable VALUES (logtxt, curtime);
        RETURN curtime;
END;

試してみると、エラーが表示されます:

ERROR: syntax error at or near "char"
SQL state: 42601
4

1 に答える 1

6

を使用して関数にラップせずに、 PL/PgSQLコードブロックをスタンドアロンで実行しようとしているようですCREATE OR REPLACE FUNCTIONDOそれは機能しません。関数または(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';

...しかし、あなたは現在の日付/時刻関数について知りませんでした。

それでも、本当に多すぎます。トリガーにより適した問題を解決しようとしていると思います。

于 2012-08-14T06:18:30.507 に答える