7

我正在尝试在 PL/PgSQL 中编写一个函数,该函数必须与它作为参数接收的表一起使用。

我在函数定义中使用 EXECUTE..INTO..USING 语句来构建动态查询(这是我知道的唯一方法)但是......我遇到了 RECORD 数据类型的问题。

让我们考虑下面的(极其简化的)示例。

 -- A table with some values.
 DROP TABLE IF EXISTS table1;
 CREATE TABLE table1 (
     code INT,
     descr TEXT
 );

INSERT INTO table1 VALUES ('1','a');
INSERT INTO table1 VALUES ('2','b');


-- The function code. 
DROP FUNCTION IF EXISTS foo (TEXT);
CREATE FUNCTION foo (tbl_name TEXT) RETURNS VOID AS $$
DECLARE 
    r RECORD;
    d TEXT;
BEGIN
    FOR r IN
    EXECUTE 'SELECT * FROM ' || tbl_name
    LOOP
    --SELECT r.descr INTO d; --IT WORK
    EXECUTE 'SELECT ($1)' || '.descr' INTO d USING r; --IT DOES NOT WORK
    RAISE NOTICE '%', d;
END LOOP;

END;
$$ LANGUAGE plpgsql STRICT;

-- Call foo function on table1
SELECT foo('table1');

它输出以下错误:

错误:无法识别记录数据类型中的列“descr”

尽管我使用的语法对我来说似乎是有效的。我不能使用静态选择(在示例中注释),因为我想动态地引用列名。

所以..有人知道上面的代码有什么问题吗?

4

2 回答 2

8

这是真的。您不能在 PL/pgSQL 空间之外使用类型记录。

RECORD 值仅在 plpgsql 中有效。

你可以做

EXECUTE 'SELECT $1.descr' INTO d USING r::text::xx;
于 2010-01-21T07:21:09.730 回答
2

$1应该在||,like里面|| $1 ||并适当地给空间然后它会起作用。

BEGIN

EXECUTE ' delete from  ' ||  quote_ident($1)  || ' where condition ';

END;
于 2013-04-25T12:14:26.817 回答