IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Variable avec Postgre


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 24
    Par défaut Variable avec Postgre
    Bonjour,

    avec Mysql j'ai une requête contenant une variable afin de gagner du temps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    START TRANSACTION;
    SET @dossier_id := 206879; DELETE FROM pretemporaire WHERE id_dossier = @dossier_id; 
    DELETE FROM mactist WHERE dossier_id = @dossier_id; 
    update mactist set volu1 ='10' where do_id = @dossier_id; 
    COMMIT;
    J'ai juste à renseigner la valeur de la variable @dossier_id et la requete passe sans problème

    je n'arrive pas à faire la même chose avec Postgre. Quelqu'un a une idée.
    Merci

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 146
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 637
    Billets dans le blog
    10
    Par défaut
    Vous pouvez également déclarer une CTE contenant la liste des dossiers à supprimer et faire une équijointure avec cette CTE (avec la syntaxe particulière "using" propre à PostGre), plus pratique dans le cas où il peut y avoir plusieurs dossiers.

    Exemple :

    Code SQL : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    CREATE TABLE T1
       (  T1ID SERIAL
        , T1C4 CHAR(4) not null
        , T1DT DATE    not null
        , PRIMARY KEY(T1ID)
       )
    ;
    insert INTO T1(T1C4, T1DT)
    values ('AAAA', '2021-06-11')
         , ('BBBB', '2022-04-20')
         , ('BBBB', '2022-04-30')
         , ('CCCC', '2019-11-04')
         , ('TRUC', '2022-01-07')
         , ('TRUC', '2022-01-15')
         , ('TRUC', '2022-02-01')  
         , ('TRUC', '2022-02-08')    
         , ('ZZZZ', '2025-08-11')
    ;
    select * from T1
    ;
    with CTE1(CTID) as
        (select 7  union all
         select 8)
    delete from T1
    using  CTE1
    where  CTE1.CTID=T1.T1ID
    ;
    select * from T1
    ;


    Résultat :

    Nom : Sans titre.png
Affichages : 47
Taille : 5,4 Ko


    Mais le plus souvent, on cible les lignes à traiter selon des critères fonctionnels peu importe l'identifiant qui est une donnée technique inconnue de l'utilisateur (en particulier dans le cas où l'on a affaire à une colonne ayant la propriété "serial" ou "identity")
    Dans l'exemple ci-dessous, je cherche à traiter les lignes de "TRUC" si la date est supérieure au 31 janvier 2022, le résultat obtenu est le même :

    Code SQL : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    CREATE TABLE T2
       (  T2ID SERIAL
        , T2C4 CHAR(4) not null
        , T2DT DATE    not null
        , PRIMARY KEY(T2ID)
       )
    ;
    insert INTO T2(T2C4, T2DT)
    values ('AAAA', '2021-06-11')
         , ('BBBB', '2022-04-20')
         , ('BBBB', '2022-04-30')
         , ('CCCC', '2019-11-04')
         , ('TRUC', '2022-01-07')
         , ('TRUC', '2022-01-15')
         , ('TRUC', '2022-02-01')  
         , ('TRUC', '2022-02-08')    
         , ('ZZZZ', '2025-08-11')
    ;
    select * from T2
    ;
    with CTE1 (COL1, COL2, COL3) as
        (select T2ID, T2C4, T2DT 
         from T2
         where T2C4='TRUC'
           and T2DT>'2022-01-31'
        )
    delete from T2
    using  CTE1
    where  CTE1.COL1=T2.T2ID
    ;
    select * from T2
    ;


    cf. DB fiddle ICI

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Attention ! La solution proposée est propre au client psql.
    D'ailleurs, ça se joue souvent au niveau du client. Avec DBeaver, par exemple, on peut définir également des variables locales...

    Sinon, on peut aussi encapsuler en du Pl/PgSQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DO $$DECLARE dossier_id INTEGER := 206879;
    BEGIN
        DELETE FROM pretemporaire WHERE id_dossier = dossier_id; 
        DELETE FROM mactist WHERE dossier_id = dossier_id; 
        UPDATE mactist SET volu1 ='10' WHERE do_id = dossier_id; 
    END $$;
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 146
    Par défaut
    @ced

    Je suis totalement d'accord avec toi, effectivement c'est une solution pour un travail interactif dans un terminal.

    Et ta solution est de loin la meilleure
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. [VB.NET] Problem de récupération de variable avec une DLL
    Par ludovic85 dans le forum Windows Forms
    Réponses: 11
    Dernier message: 19/01/2005, 11h37
  2. Réponses: 4
    Dernier message: 28/10/2004, 10h57
  3. Variable avec saut de ligne à l'intérieur
    Par MaTHieU_ dans le forum Langage
    Réponses: 2
    Dernier message: 09/08/2004, 22h39
  4. Generer des noms de variables avec une boucle
    Par moutanakid dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/07/2004, 17h45
  5. Désigner une variable avec une variable?
    Par littleman dans le forum Paradox
    Réponses: 4
    Dernier message: 12/08/2002, 11h21

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