Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

[SQL] Utilisation de variable dans une requête


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau membre du Club Avatar de I folima Elda
    Homme Profil pro
    Programmeur & Intégrateur
    Inscrit en
    décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Programmeur & Intégrateur

    Informations forums :
    Inscription : décembre 2007
    Messages : 34
    Points : 34
    Points
    34
    Par défaut [SQL] Utilisation de variable dans une requête
    Bonjour à tous,

    Je suis en train d'apprendre sur le tas le scripting en SQL.
    Mon but est de créer un ensemble de script SQL qui seront appelé par un script shell.
    Pour info: je suis en postgres 9.4 avec Linux

    En premier lieu, j'ai réussit à envoyer mes variables shell lors de mon appel via : psql "param_connexion" -f ./script.sql -v var1=${var1} -v var2=${var2}
    Tout marche bien. Dans mon script.sql j'utilise ensuite les variables précédées d'un ':'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE :var1 AS TABLE :var2 WITH NO DATA
    Tout va bien de ce coté

    Mon problème est en second [je vous mets en exemple mon script poubelle de test)
    En effet, pour éviter de passer en paramètres 40 variables, j'ai décidé de les mettre dans le script .sql. Il s'agit surtout d'utiliser les dates (année, mois sur 2 ou 4 caractères). J'ai fait mes petites recherches et j'en arrive au bloc suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE or replace FUNCTION maFonction() RETURNS void AS $$
    	DECLARE
    		quantité3 integer := to_char(current_timestamp, 'MM');
    		quantité4 integer := to_char(current_timestamp, 'YYYY');
    		quantité5 integer := to_char(current_timestamp, 'YY');
    	BEGIN
    		RAISE NOTICE 'quantité vaut ici %', quantité3;
    		RAISE NOTICE 'quantité vaut ici %', quantité4;
    		RAISE NOTICE 'quantité vaut ici %', quantité5;
    		
    		CREATE TABLE schema.toto_quantité4 AS TABLE schema.table WITH NO DATA;
    	END;
    $$ LANGUAGE plpgsql;
    SELECT maFonction();
    DROP FUNCTION maFonction();
    J'arrive à appeler mes variables déclarées dans les RAISE mais je n'arrive pas à l'utilise pour mon CREATE (en gras rouge).
    J'ai tenté avec un ':' avant ; ':' avant/après et même '@' avant. Rien n'y fait. J'avais lu ça pour intégrer des valeurs avec un INSERT INTO donc j'ai tenté.

    Comment faire pour utiliser mes variables déclarée comme je le souhaite?

    Merci de votre aide

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 342
    Points : 27 168
    Points
    27 168
    Par défaut
    Il faut passer par du SQL dynamique (EXECUTE IMMEDIATE) pour toutes les opérations de définition de structure (DDL) à l'intérieur d'un bloc de code.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Nouveau membre du Club Avatar de I folima Elda
    Homme Profil pro
    Programmeur & Intégrateur
    Inscrit en
    décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Programmeur & Intégrateur

    Informations forums :
    Inscription : décembre 2007
    Messages : 34
    Points : 34
    Points
    34
    Par défaut
    Ça donnerait quoi par exemple dans mon bloc ?

  4. #4
    Nouveau membre du Club Avatar de I folima Elda
    Homme Profil pro
    Programmeur & Intégrateur
    Inscrit en
    décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Programmeur & Intégrateur

    Informations forums :
    Inscription : décembre 2007
    Messages : 34
    Points : 34
    Points
    34
    Par défaut
    Bonjour,
    Avec la piste donnée par @al1_24, j'ai fait mes petites recherches et je suis tombé sur ce site. Il réponds bien à la question.
    Pour ceux qui la voudrait, je vous poste ma solution avec mon cas précédemment cité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    CREATE or replace FUNCTION maFonction() RETURNS void AS $$
    	DECLARE
    		quantité3 varchar := to_char(current_timestamp, 'MM');
    		quantité4 varchar := to_char(current_timestamp, 'YYYY');
    		quantité5 varchar := to_char(current_timestamp, 'YY');
     
    		cmd varchar := 'CREATE TABLE schema.table1_' || quantité3 || quantité5 || ' AS TABLE schema.table2 WITH NO DATA;';
    	BEGIN
    		RAISE NOTICE 'quantité vaut ici %', quantité3;
    		RAISE NOTICE 'quantité vaut ici %', quantité4;
    		RAISE NOTICE 'quantité vaut ici %', quantité5;		
    		RAISE NOTICE 'cmd: %', cmd;
    		execute cmd;
    	END;
    $$ LANGUAGE plpgsql;
    SELECT maFonction();
    DROP FUNCTION maFonction();

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser les variables dans une requête sql
    Par LaPanic dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/10/2012, 18h08
  2. [2008R2] Utilisation de variable dans une requête MDX
    Par picka69 dans le forum SSAS
    Réponses: 5
    Dernier message: 30/08/2012, 15h39
  3. Comment utiliser des variables dans une requête SQL ?
    Par Ragnarok85 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 12/02/2007, 17h23
  4. [SQL] Utilisation de variables dans une requête SQL
    Par heteroclite dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 07/09/2006, 23h38
  5. [SQL] Utilisation de variables dans une requête SQL
    Par heteroclite dans le forum Langage
    Réponses: 8
    Dernier message: 07/09/2006, 23h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo