sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo seleccionar de la variable que es un nombre de tabla n Postgre> =9.2

La respuesta correcta es un comentario de Anton Kovalenko

No puede usar la variable como nombre de tabla o columna en SQL incorporado nunca.

UPDATE dynamic_table_name SET ....

PostgreSQL usa planes preparados y guardados para SQL incorporado, y las referencias a objetos de destino (tablas) están profundamente codificadas en los planes; algunas características tienen un impacto significativo en los planes, ya que una tabla se puede usar como índice, para otra no. La planificación de consultas es relativamente lenta, por lo que PostgreSQL no lo intenta de forma transparente (sin algunas excepciones).

Debería usar un SQL dinámico - un propósito es usar para situaciones similares. Generas una nueva cadena SQL siempre y los planes no se guardan

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 $$;

Atención:SQL dinámico es inseguro (hay una inyección SQL riesgos) sin desinfección de parámetros. Usé una función "formato " para ello. Otra forma es usar "quote_ident " función.

EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...