在 plpgsql 函数中,我有一个记录类型的变量:
my_rec 记录;
该记录包含任意表中的一行,因此在执行之前我不知道列。但是,我确实有至少一个可用作 varchar 的列的名称。
问题是:如何从 my_rec 中检索给定列的值?
在 plpgsql 函数中,我有一个记录类型的变量:
my_rec 记录;
该记录包含任意表中的一行,因此在执行之前我不知道列。但是,我确实有至少一个可用作 varchar 的列的名称。
问题是:如何从 my_rec 中检索给定列的值?
用于在函数中使用hstore
带有record
动态列的 s PL/PgSQL
:
CREATE EXTENSION hstore;
CREATE OR REPLACE FUNCTION test_fn(col_name text) RETURNS text AS $$
DECLARE
input_row record;
col_value text;
BEGIN
SELECT INTO input_row
*
FROM ( VALUES ('a','b','c',1) ) AS dummyrow(col1,col2,col3,intcol);
SELECT INTO col_value
hstore(input_row) -> col_name;
RETURN col_value;
END;
$$ LANGUAGE 'plpgsql';
hstore
是一个扩展,但它是自 8.3 以来与 PostgreSQL 捆绑在一起的扩展,并且CREATE EXTENSION
自 9.1 起就可以使用它进行安装。从 8.4 或 9.0 之类的版本开始支持记录到 hstore 的转换。
我不知道在 plpgsql 中执行此操作的方法。我为您做了一些测试,并尝试使“EXECUTE SELECT”解决方案起作用,例如:
EXECUTE 'select $1.' || quote_ident(the_param) USING my_rec INTO my_var;
这对我不起作用,我得到:
could not identify column "{{param_value here}}" in record data type
这是几年前的一个非常相似的问题,说 plpgsql 不可能。根据它的建议,似乎应该可以使用其他一些语言。引用汤姆·莱恩的回答:
在 plpgsql 中没有办法做到这一点。您可以在其他 PL(例如 plperl、pltcl)中执行此操作,因为它们的类型不如 plpgsql 强。