在plpgsql函数中,我有一个类型为record的变量:
my_rec RECORD;
此记录包含来自任意表的行,因此在执行之前我不知道列。 但是,我确实有至少一个可用作varchar的列的名称。
问题是:如何从my_rec中检索给定列的值?
答案 0 :(得分:2)
使用hstore
与record
函数中的动态列一起使用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捆绑在一起的扩展,并且自9.1以来可以使用CREATE EXTENSION
进行安装。自8.4或9.0以来,支持记录到hstore的转换。
答案 1 :(得分:1)
我不知道如何在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
几年前,Here是一个非常类似的问题,说用plpgsql是不可能的。根据它的建议,似乎应该可以使用其他一些语言。引用Tom Lane的回答:
在plpgsql中无法做到这一点。你可以在其他PL中做到这一点 (例如plperl,pltcl),因为它们不像plpgsql那样强类型。