PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como selecionar da variável que é um nome de tabela n Postgre>=9.2


A resposta correta é um comentário de Anton Kovalenko

Você não pode usar variável como nome de tabela ou coluna no SQL incorporado nunca.
UPDATE dynamic_table_name SET ....

O PostgreSQL usa planos preparados e salvos para SQL embutido, e as referências a objetos de destino (tabelas) são profundas e codificadas nos planos - algumas características têm impacto significativo nos planos - para uma tabela pode ser usada o índice, para outra não. O planejamento de consultas é relativamente lento, então o PostgreSQL não o tenta de forma transparente (sem poucas exceções).

Você deve usar um SQL dinâmico - um único propósito está usando para situações semelhantes. Você gera uma nova string SQL sempre e os planos não são salvos
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 $$;

Atenção:SQL dinâmico é inseguro (há uma injeção de SQL riscos) sem higienização de parâmetros. Usei uma função "formato " para isso. Outra maneira é usar "quote_ident "função.
EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...