微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个变量,它是一个表的名称.如何在查询中使用变量选择或更新此变量,例如:

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 @R_640_4045@ion_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 ...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐