postgresql – 如何从作为表名的变量中选择n Postgre> = 9.2
发布时间:2020-12-13 15:56:54 所属栏目:百科 来源:网络整理
导读:我有一个变量,它是一个表的名称.如何在查询中使用变量选择或更新此变量,例如: create or replace function pg_temp.testtst ()returns varchar(255) as $$declare r record; t_name name;begin for r in SELECT tablename FROM pg_tables WHERE schemaname
我有一个变量,它是一个表的名称.如何在查询中使用变量选择或更新此变量,例如:
create or replace function pg_temp.testtst () returns varchar(255) as $$ declare r record; t_name name; begin for r in SELECT tablename FROM pg_tables WHERE schemaname = 'public' limit 100 loop t_name = r.tablename; update t_name set id = 10 where id = 15; end loop; return seq_name; end; $$ language plpgsql; 表明 解决方法
正确答复是Anton Kovalenko的评论
您不能在嵌入式SQL中将变量用作表名或列名. UPDATE dynamic_table_name SET .... PostgreSQL使用为嵌入式SQL准备和保存的计划,并且对目标对象(表)的引用在计划中进行深度和硬编码 – 一些特性对计划有重大影响 – 一个表可以使用索引,而其他表不能.查询计划相对较慢,因此PostgreSQL不会透明地尝试它(没有少数例外). 您应该使用动态SQL – 一个目的是用于类似的情况.您始终生成新的SQL字符串,并且不保存计划 DO $$ DECLARE r record; BEGIN FOR r IN SELECT table_name FROM information_schema.tables WHERE table_catalog = 'public' LOOP EXECUTE format('UPDATE %I SET id = 10 WHERE id = 15',r.table_name); END LOOP; END $$; 注意:动态SQL不安全(存在SQL注入风险),没有参数清理.我使用了“格式”功能.其他方式是使用“quote_ident”函数. EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |