Duplicata possible:
Fonction de requête dynamique Postgres
Je souhaite utiliser la chaîne retournée de 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 voir, il renvoie une chaîne. Je souhaite l'utiliser comme entrée pour une autre requête, par ex.
CREATE TABLE (SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd'))
AS * SELECT FROM backup
Peut-on le faire? Un indice comment?
Vous devrez utiliser la commande PL/PgSQL EXECUTE
, via un bloc DO
ou une fonction PL/PgSQL (CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql
). Dynamic SQL n'est pas pris en charge dans le dialecte SQL ordinaire utilisé par PostgreSQL, uniquement 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;
Les spécificateurs de format format(...)
%I
Et %L
Font respectivement l'identificateur et la citation littérale.
Pour les littéraux, je recommande d'utiliser EXECUTE ... USING
Plutôt que format(...)
avec %L
, Mais pour les identificateurs comme les noms de table/colonne, le format %I
Est une alternative agréable et concise pour passer des appels quote_ident
verbeux.