sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL8.2でブロックを実行できません

    PL /PgSQL を実行しようとしているようです。 <を使用して関数にラップせずに、スタンドアロンのコードブロックcode>関数の作成または置換 。それは機能しません。関数に含めるか、(PostgreSQL 9.0から) DO ブロック 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
    

    絶対に 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';
    

    ...しかし、現在の日付/時刻関数

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




    1. オラクルに日付と時刻を挿入する方法は?

    2. 結合で、すべての列名の前に元のテーブルを付ける方法

    3. PDO UTF-8エンコーディングの問題?

    4. Ignited-Datatablesで検索中の「like」操作の照合の不正な組み合わせ