postgresql – PL / pgSQL中的EXECUTE … USING语句不适用于记录
发布时间:2020-12-13 16:29:54 所属栏目:百科 来源:网络整理
导读:我正在尝试在PL / PgSQL中编写一个函数,它必须使用它作为参数接收的表. 我在函数定义中使用EXECUTE..INTO..USING语句来构建动态查询(这是我知道这样做的唯一方法)但是…我遇到了RECORD数据类型的问题. 让我们考虑以下(极简化)示例. -- A table with some val
我正在尝试在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'); 它输出以下错误:
虽然我使用的语法似乎对我有用.我不能使用静态选择(在示例中注释)因为我想在dinamically引用列名称. 那么……有人知道上面代码有什么问题吗?
这是真的.你不能在PL / pgSQL空间之外使用类型记录.
RECORD值仅在plpgsql中有效. 你可以做 EXECUTE 'SELECT $1.descr' INTO d USING r::text::xx; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |