postgresql – 如何从作为表名的变量中选择n Postgre> = 9.2

postgresql – 如何从作为表名的变量中选择n Postgre> = 9.2,第1张

概述我有一个变量,它是一个表的名称.如何在查询中使用变量选择或更新此变量,例如: 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 WHE @H_419_0@ @H_419_0@ 我有一个变量,它是一个表的名称.如何在查询中使用变量选择或更新此变量,例如:

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;

表明
错误:关系“t_name”不存在

解决方法 正确答复是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 ...
@H_419_0@ 总结

以上是内存溢出为你收集整理的postgresql – 如何从作为表名的变量中选择n Postgre> = 9.2全部内容,希望文章能够帮你解决postgresql – 如何从作为表名的变量中选择n Postgre> = 9.2所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1160123.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存