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

Postgresql 使用plpgsql在各种版本的Postgres中将列bytea更改为文本,postgresql,plpgsql,alter,version-numbering,Postgresql,Plpgsql,Alter,Version Numbering,我在如何使用plpgsql bytea->text转换列时遇到问题。我编写了一个函数,它可以在一些数据库上运行,而不适用于其他数据库。我不知道怎么修理它。 使用8.0-9.3版本的数据库;此错误适用于8.1.19 我收到: 我的职能: CREATE OR REPLACE FUNCTION byteaToText() RETURNS text AS $BODY$ DECLARE ver int; BEGIN SELECT into ver (sele

我在如何使用plpgsql bytea->text转换列时遇到问题。我编写了一个函数,它可以在一些数据库上运行,而不适用于其他数据库。我不知道怎么修理它。 使用8.0-9.3版本的数据库;此错误适用于8.1.19

我收到:

我的职能:

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();

Postgres 8.2引入了配置参数server_version_num

添加新的配置参数server\u version\u num Greg Sabino Mullane

这类似于server_版本,但是一个整数,例如80200。这 允许应用程序更轻松地进行版本检查

您的代码在第8.1页中找不到不存在的参数,并且没有分配给ver,因此它保持为NULL,并且控制权最终位于ELSE分支中-错误消息中也指出了这一点:

将函数重写为:

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了。 返回config param server_版本,该版本也存在于第8.1页中。 我将属性替换为_列,假设这是另一个错误。 不要使用大小写混合的名称。 不要引用语言名称。使用语言plpgsql,无引号。 旁白: 显而易见的解决方案是将你的Postgres服务器升级到一个用电而不是蒸汽运行的版本。Postgres 8.1编写于10年前,并于2010年11月达到EOL。除此之外,至少更新到最后一个版本,即8.1.23

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;