使用plpgsql将列bytea更改为各种版本的Postgres中的文本

时间:2015-02-23 07:43:34

标签: postgresql plpgsql alter version-numbering

我有问题如何使用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();

1 个答案:

答案 0 :(得分:1)

配置参数server_version_num是在Postgres 8.2 中引入的。 Per documentation:

  

添加新配置参数server_version_num(Greg Sabino Mullane)

     

这就像server_version,但是是一个整数,例如80200.这个   允许应用程序更轻松地进行版本检查。

您的代码无法在第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,这也存在于第8.1页。
  • 我将properties替换为the_column,假设这是另一个错误。
  • 不要使用混合案例名称。
  • 不要引用语言名称。使用LANGUAGE plpgsql,无引号。

除了:
显而易见的解决方案是将Postgres服务器升级到以电力运行的版本,而不是蒸汽。 Postgres 8.1是在10年前编写的,并且在2010年11月达到了EOL。除此之外,至少更新到最后一个版本,即8.1.23。