我有问题如何使用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();
答案 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;
server_version
,这也存在于第8.1页。properties
替换为the_column
,假设这是另一个错误。LANGUAGE plpgsql
,无引号。除了:
显而易见的解决方案是将Postgres服务器升级到以电力运行的版本,而不是蒸汽。 Postgres 8.1是在10年前编写的,并且在2010年11月达到了EOL。除此之外,至少更新到最后一个版本,即8.1.23。