0

我希望能够获取从表中查询名称的函数变量的值

编辑显示查询表而不是从静态值查询:

    create table __test__
(
_col text
);
insert into __test__
(_col)
values('_a');

   create or replace function __test() 
    returns void
    language 'plpgsql' as
    $$
    declare
      _r record;
      _a int;
      _b int;
      _sql text;
    begin

      _a = 1;
      _b = 0;

      for _r in select _col as _nam from __test__ a loop
      -- query returns one row valued "_a"
        _sql = 'select ' || _r._nam ;
        execute _sql into _b;
      end loop;

      raise info 'value of _b %', _b;

    end;
    $$;
select __test()

当函数执行时,_b = 1。有可能吗?

同样的错误...

ERROR:  column "_a" does not exist
LINE 1: select _a
               ^
QUERY:  select _a
CONTEXT:  PL/pgSQL function "__test" line 15 at EXECUTE statement
4

2 回答 2

2

让我们尝试重新构建问题:您所追求的将是Perl eval() 函数的等价物,它能够执行动态生成的代码段,“任何外部词法变量都对其可见”。在您的示例中,变量为_a,但正如您从错误消息中看到的那样,它不能由动态 SQL 语句进行插值。原因是 SQL 解释器对当前的 pl/pgsql 变量没有可见性,甚至不知道这些变量存在。它们仅限于 pl/pgsql。

这里需要的是上下文感知动态生成的 pl/pgsql 语句,但是这种语言没有这个特性。如果没有此功能,是否可以找到实现结果的技巧是值得怀疑的。尽管它能够很好地与 SQL 交互,但它是一种相当静态的语言。

另一方面,这对于 pl/perl 来说是没有问题的。

于 2012-09-07T21:14:50.340 回答
2

您可以创建一个临时表,在其中插入变量名称和值,然后对其执行选择。打扫完就行了。我以前使用过类似的方法。它工作正常。不过,它确实有额外的开销。

编辑:添加示例

CREATE FUNCTION switch (in_var text) RETURNS text
LANGUAGE PLPGSQL VOLATILE AS $$

declare t_test text;
    switch_vals text[];

BEGIN

   CREATE TEMPORARY TABLE switch_values (var text, value text);

   EXECUTE $e$ INSERT INTO switch_values VALUES 
       ('a', '1'), ('b', '2'), ('c', '3') $e$;

   EXECUTE $e$ SELECT value FROM switch_values WHERE var = $e$ || quote_literal(in_var)
       INTO t_test;

   DROP TABLE switch_values;

   RETURN t_test;

END; $$; 

postgres=# select switch('a');
  switch 
 --------
   1
 (1 row)
于 2012-09-08T12:19:48.397 回答