【问题标题】:how to get current row value in plpgsql function如何在plpgsql函数中获取当前行值
【发布时间】:2015-08-16 18:00:44
【问题描述】:

我需要创建使用当前行值而不在更新命令中传入参数的 plpgsql 方法。

我试过了

create temp table test ( test text, result text ) on commit drop;
insert into test values ('1','');

CREATE OR REPLACE FUNCTION public.gettest() RETURNS text AS $$
DECLARE
  comp text := NULL;

BEGIN
EXECUTE 'SELECT ''Current row is '' ||test.test' INTO comp;
RETURN comp;
END; $$ LANGUAGE plpgsql STRICT STABLE;

update test set result = 'Result: ' || gettest();

但有异常

ERROR:  missing FROM-clause entry for table "test"
LINE 1: SELECT 'Current row is ' ||test.test
                                   ^
QUERY:  SELECT 'Current row is ' ||test.test
CONTEXT:  PL/pgSQL function gettest() line 6 at EXECUTE statement
********** Error **********

ERROR: missing FROM-clause entry for table "test"
SQL state: 42P01
Context: PL/pgSQL function gettest() line 6 at EXECUTE statement

如何解决? 如何在不将 vaue 传递给 plpgsql 方法参数的情况下进行修复?

【问题讨论】:

    标签: sql postgresql plpgsql postgresql-9.1


    【解决方案1】:

    没有“隐式当前行”之类的东西。您可以将函数所需的任何参数作为参数传递。但是,如果您愿意,您可以传递一个完整的行:

    create temp table test (val text, result text ) on commit drop;
    insert into test values ('1','');
    insert into test values ('2','');
    
    CREATE OR REPLACE FUNCTION gettest(p_test test) RETURNS text AS $$
    DECLARE
      comp text := NULL;
    BEGIN
       comp := 'Current row is '||p_test.val;
    RETURN comp;
    END; $$ LANGUAGE plpgsql STRICT STABLE;
    
    update test set result = 'Result: ' || gettest(test);
    

    我必须将列 test 重命名为其他名称,否则调用 gettest(test) 将引用 而不是整个表 (=row),因此它不起作用。

    【讨论】:

    • 从 Postgres 9.0 及更高版本开始可以使用吗?
    • @Andrus:我只用 9.4 测试过它,但这应该也适用于 9.0
    • 传递整行是否为每一行创建一个新数组?还是将指针传递到游标中已定义的行?
    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多