35 votes

PostgreSQL - valeur dynamique comme nom de table

Duplicata possible :
Fonction d'interrogation dynamique de Postgres

Je souhaite utiliser la chaîne renvoyée par la requête ci-dessous comme nom de table pour une autre requête.

SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd')

comme vous pouvez le constater, renvoie une chaîne de caractères. Je souhaite l'utiliser comme entrée pour une autre requête, par exemple

CREATE TABLE (SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd')) 
AS * SELECT FROM backup

Est-ce possible ? Une idée sur la façon de procéder ?

62voto

Craig Ringer Points 72371

Vous devrez utiliser le PL/PgSQL EXECUTE déclaration , par l'intermédiaire d'un DO ou une fonction PL/PgSQL ( CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql ). Dynamic SQL n'est pas supporté dans le dialecte SQL ordinaire utilisé par PostgreSQL, seulement dans la variante procédurale PL/PgSQL.

DO
$$
BEGIN
EXECUTE format('CREATE TABLE %I AS SELECT * FROM backup', 'backup_' || to_char(CURRENT_DATE,'yyyy-mm-dd'));
END;
$$ LANGUAGE plpgsql;

En format(...) fonction 's %I y %L permettent respectivement de citer correctement les identificateurs et les éléments littéraux.

Pour les caractères littéraux, je recommande d'utiliser EXECUTE ... USING plutôt que format(...) con %L mais pour les identifiants tels que les noms de tables/colonnes, le format %I est une alternative agréable et concise à l'utilisation de la méthode verbale quote_ident appels.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X