1

plpgsql ( bytea-> text) を使用して列を変換する方法に問題があります。一部のデータベースでは機能し、他のデータベースでは機能しない関数を作成しました。修正方法がわかりません。
8.0 ~ 9.3 のデータベースを使用。このエラーは 8.1.19 のものです。

受け取りました:

ERROR:  column "the_column" cannot be cast to type "text"
CONTEXT:  SQL statement "ALTER TABLE the_table ALTER COLUMN the_column TYPE text"
PL/pgSQL function "byteatotext" line 11 at execute statement

私の機能:

CREATE OR REPLACE FUNCTION byteaToText()
  RETURNS text AS
  $BODY$
    DECLARE
      ver int;
    BEGIN
      SELECT into ver (select setting from pg_settings where name='server_version_num') as test;
      IF ver < 80200 THEN
        EXECUTE 'ALTER TABLE the_table ALTER COLUMN the_column TYPE text USING ENCODE(properties, \'escape\'))';
        RETURN ver;
      ELSE
        EXECUTE 'ALTER TABLE the_table ALTER COLUMN the_column TYPE text';
        RETURN ver;
      END IF;
    RETURN 'error';
    END;
  $BODY$
  LANGUAGE 'plpgsql' VOLATILE;

select byteaToText();
4

1 に答える 1

1

設定パラメータserver_version_numは Postgres 8.2で導入されました。ドキュメントごと:

新しい設定パラメータ server_version_num を追加しました。 (Greg Sabino Mullane)

これは server_version に似ていますが、80200 などの整数です。これにより、アプリケーションはバージョン チェックをより簡単に行うことができます。

コードは pg 8.1 に存在しないパラメーターを見つけることができず、に割り当てられないverため、NULL のままになり、制御はELSEブランチで終了します。これはエラー メッセージにも示されています。

ERROR:  column "the_column" cannot be cast to type "text"
CONTEXT:  SQL statement "ALTER TABLE the_table ALTER COLUMN the_column TYPE text"
PL/pgSQL function "byteatotext" line 11 at execute statement

関数を次のように書き換えます。

CREATE OR REPLACE FUNCTION bytea_to_text()
  RETURNS text AS
$func$
BEGIN
   -- the config param was introduced with version 8.2
   PERFORM 1 FROM pg_settings WHERE name = 'server_version_num';

   IF FOUND THEN  -- version >= 8.2
      EXECUTE 'ALTER TABLE the_table ALTER COLUMN the_column TYPE text';
   ELSE
      EXECUTE 'ALTER TABLE the_table ALTER COLUMN the_column TYPE text USING encode(the_column, ''escape''))';
   END IF;

   RETURN (SELECT setting FROM pg_settings WHERE name = 'server_version');
END
$func$ LANGUAGE plpgsql;

ノート

  • Postgres 8.1 でテストされていないため、その古い Postgres を使用する人はもういません。
  • server_version代わりに、pg 8.1 にも存在する構成パラメーターを返します。
  • これは別のエラーであると想定して、propertiesに置き換えました。the_column
  • 大文字と小文字が混在する名前は使用しないでください。
  • 言語名を引用しないでください。を使用します。引用符は使用LANGUAGE plpgsqlしません。

余談:
明白な解決策は、Postgres サーバーを蒸気ではなく電力で動作するバージョンにアップグレードすることです。Postgres 8.1 は 10 年前に作成され、2010 年 11 月に EOL になりました。それを除けば、少なくとも最後のポイント リリースである 8.1.23 に更新してください。

于 2015-02-24T02:26:03.780 に答える