PL / pgSQL中的EXECUTE ... USING语句不适用于记录类型?

时间:2010-01-20 20:43:40

标签: postgresql plpgsql

我正在尝试在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”列

虽然我使用的语法似乎对我有用。我不能使用静态选择(在示例中注释),因为我想以dinamically方式引用列名。

那么......有人知道上面代码有什么问题吗?

2 个答案:

答案 0 :(得分:7)

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

RECORD值仅在plpgsql中有效。

你可以做到

EXECUTE 'SELECT $1.descr' INTO d USING r::text::xx;

答案 1 :(得分:2)

$1应该在||内,与|| $1 ||一样,并且正确地提供空格然后它就能正常工作。

BEGIN

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

END;