2

在 plpgsql 函数中,我有一个记录类型的变量:

my_rec 记录;

该记录包含任意表中的一行,因此在执行之前我不知道列。但是,我确实有至少一个可用作 varchar 的列的名称。

问题是:如何从 my_rec 中检索给定列的值?

4

2 回答 2

2

用于在函数中使用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 的转换。

于 2012-10-17T22:40:46.800 回答
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

是几年前的一个非常相似的问题,说 plpgsql 不可能。根据它的建议,似乎应该可以使用其他一些语言。引用汤姆·莱恩的回答:

在 plpgsql 中没有办法做到这一点。您可以在其他 PL(例如 plperl、pltcl)中执行此操作,因为它们的类型不如 plpgsql 强。

于 2012-10-17T14:24:16.197 回答