我有一个变量,它是一个表的名称。如何在查询中使用变量选择或更新此变量,例如:
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”不存在
答案 0 :(得分:5)
正确答复是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注入风险),没有参数清理。我使用了一个函数“ format ”。其他方式是使用“ quote_ident ”函数。
EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...