gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:24:04 24 4
gpt4 key购买 nike

我正在尝试在 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');

它输出以下错误:

ERROR: could not identify column "descr" in record data type

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

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

最佳答案

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

RECORD 值仅在 plpgsql 中有效。

你可以做到

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

关于postgresql - EXECUTE...USING PL/pgSQL 中的语句不适用于记录类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2104811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com