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

SQL Oracle Discussion :

Utiliser WITH dans un INSERT / UPDATE


Sujet :

SQL Oracle

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut Utiliser WITH dans un INSERT / UPDATE
    Bonjour.

    J'ai une table créée de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE toto
    AS
    WITH vt AS (SELECT....FROM toto2 WHERE ....)
    SELECT ... FROM vt
    WHERE....
    Je dois régulièrement mettre à jour cette table sans avoir le droit de la supprimer/recréer. Je voudrais donc faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TRUNCATE TABLE toto;
     
    INSERT INTO TOTO
    WITH vt AS (SELECT....FROM toto2 WHERE ....)
    SELECT ... FROM vt
    WHERE....
    En reprenant exactement la même requête qu'à la création.

    Sauf que INSERT...WITH ne fonctionne pas. Y a-t-il un moyen de contourner cela? Je ne peux/veux réécrire la requête, déjà complexe avec des PARTITION BY etc...

    Merci.

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Chez mois ça fonctionne
    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
    18
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> insert into hr.departments (department_id, department_name)
      2  with data As(select 101 as dept_id, 'test' as dept_name from dual)
      3  select dept_id, dept_name
      4    from data
      5  /
     
    1 row inserted
     
    SQL> rollback;
     
    Rollback complete
     
    SQL>

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Euh... oui, ça marche. J'ai dû faire une erreur quelque part...

    Merci!

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Même question avec un UPDATE. Ca fonctionne avec une donnée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    update matable
      set col1=(
         with toto as(
             select 1 as c1, 2 as c2 from dual union all
             select 3 as c1, 4 as c2 from dual)
         select c2 from toto
          where c1 = 3)
    ;
    Mais pour updater 2 colonnes, ça môrche pô
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    update matable
      set (col1, col2) =(
         with toto as(
             select 1 as c1, 2 as c2 from dual union all
             select 3 as c1, 4 as c2 from dual)
         select c1, c2 from toto
          where c1 = 3)
    ;
    J'ai pas trouvé le truc. Merci d'avance!

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Essayez avec un MERGE !

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par GoLDoZ Voir le message
    Même question avec un UPDATE. Ca fonctionne avec une donnée:
    ...
    Mais pour updater 2 colonnes, ça môrche pô
    ...
    J'ai pas trouvé le truc. Merci d'avance!
    Ca à l'air d'un bug. Des contournements existent mais ...

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

Discussions similaires

  1. Insertion,update dans une BD à table avec beaucoup de champs
    Par randriano dans le forum C++Builder
    Réponses: 29
    Dernier message: 13/03/2007, 19h11
  2. Réponses: 10
    Dernier message: 12/03/2007, 12h06
  3. insert/update très massifs dans table de 50 M de record.
    Par nuggets dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 25/07/2006, 16h41
  4. Utilisation d'une requete dans une requete update
    Par hellbilly dans le forum Access
    Réponses: 4
    Dernier message: 09/01/2005, 15h09
  5. impossible d'utiliser ma fonction dans un insert
    Par caramel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/04/2003, 15h04

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