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 :

INSERT INTO avec un SELECT et SUBQUERY


Sujet :

SQL Oracle

  1. #1
    Membre confirmé Avatar de ruscov
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2007
    Messages : 347
    Points : 500
    Points
    500
    Par défaut INSERT INTO avec un SELECT et SUBQUERY
    Bonjour à tous,

    Pour mon projet je dois faire des triggers dans ma DB. Je tombe sur des "mutatings table". Dès lors je tente d'appliquer la méthode des deux déclencheurs avec table temporaire. ( la théorie )

    Pour remplir ma table temporaire, plutôt que faire un INSERT INTO avec un VALUES et citer chacune de mes colonnes, j'aimerais insérer directement tout mon record "new" de la ligne. Car j'ai des tables qui ont pas mal de colonnes... Cela me permettrait de gagner pas mal de temps!

    En pratique, au lieu de :
    Code ORACLE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE OR REPLACE TRIGGER TRIG_INSCRIPTION BEFORE INSERT ON INSCRIPTION FOR EACH ROW
    BEGIN
        INSERT INTO TEMP_INSCRIPTION(IDC, IDV, DATERESERV) VALUES (:NEW.IDC, :NEW.IDV, :NEW.DATERESERV);
    END ;

    j'aimerais un truc du style :
    Code ORACLE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE OR REPLACE TRIGGER TRIG_INSCRIPTION BEFORE INSERT ON INSCRIPTION FOR EACH ROW
    BEGIN
        INSERT INTO TEMP_INSCRIPTION(IDC, IDV, DATERESERV) VALUES( :NEW )
    END ;
    Est-ce possible?? Merci beaucoup!
    Mes logiciels n’ont jamais de bug. Ils développent juste certaines fonctions aléatoires.

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    non.
    :new est un préfixe qui fait référence à une colonne, pas à une concaténation de données, ou un groupe d'enreg, etc...
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre confirmé Avatar de ruscov
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2007
    Messages : 347
    Points : 500
    Points
    500
    Par défaut
    Donc je n'ai pas accès à un record que j'insère directement sans passer par le nommage des colonnes puisque j'insère quand même tout le record?

    C'est quand même dommage ça... J'aurais cru qu'Oracle fournirait un truc du genre. Bon ben tant pis... Je vais devoir m'amuser...

    Merci quand même.
    Mes logiciels n’ont jamais de bug. Ils développent juste certaines fonctions aléatoires.

  4. #4
    Membre confirmé Avatar de ruscov
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2007
    Messages : 347
    Points : 500
    Points
    500
    Par défaut
    Bon alors j'ai trouvé une solution : un petit script pour créer ma requête en PL/SQL, comme ça pas besoin d'écrire à la main tous les champs.... Pour ceux que ca interesse je le met ici.

    Je crée une table temporaire qui va accueillir ma requête.

    Code ORACLE : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    -- On crée la table temporaire qui va contenir les requêtes
    create table temp_table_sql (sqlval varchar2(4000));
     
    -- La procédure
    DECLARE
     
    cursor c_column is
        select column_name,rownum from user_TAB_COLUMNS uc where table_name='INSCRIPTION';
     
    str varchar2(4000);
    i number(2);
     
    BEGIN
     
    str := 'INSERT INTO TEMP_INSCRIPTION (';
    i := 0;
    FOR rec IN c_column
    LOOP
        IF i = 0 THEN
           str:=str ||REC.column_name;
        ELSE
            str:=str||', '||REC.column_name;
        END IF;    
        i := i+1;
    END LOOP;
    str:=str||') VALUES ( ';
    i := 0;
    FOR rec IN c_column
    LOOP
        IF i = 0 THEN
           str:=str||' :new.'||REC.column_name;
        ELSE
            str:=str||', :new.'||REC.column_name;
        END IF;    
        i := i+1;
    END LOOP;
     
    str:=str||');';
    insert into temp_table_sql values (str);
    END;
    /
     
    commit;

    Et le tour est joué! J'ai ma requête INSERT INTO qui copie mon record NEW dans ma table temporaire!
    Mes logiciels n’ont jamais de bug. Ils développent juste certaines fonctions aléatoires.

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Houla la !! C'est pas du tout optimisé !

    Bon, tu fais 2 fois la même boucle.
    Prends 2 variables (1 pour le INSERT, 1 pour le VALUES) et en 1 passe du curseur tu te crées les 2 ordres que tu concatènes ensuite.

    En fait je suppose que tu ne le fais qu'une fois, donc ça va, je croyais que c'était dans le trigger.
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    DECLARE
     
    CURSOR c_column IS
        SELECT column_name,ROWNUM FROM user_TAB_COLUMNS uc WHERE table_name='INSCRIPTION';
     
    str1 VARCHAR2(4000);
    str2 VARCHAR2(2000);
    i NUMBER;
     
    BEGIN
     
    i := 0;
    FOR rec IN c_column
    LOOP
        IF i = 0 THEN
           str1 := str1 || REC.column_name;
           str2 := str2 ||':new.'|| REC.column_name;
        ELSE
           str1:= str1||', '||REC.column_name;
           str2 := str2 ||', :new.'|| REC.column_name;
        END IF;    
        i := 1;
    END LOOP;
     
    str1 := 'INSERT INTO TEMP_INSCRIPTION ('|| str1 ||') VALUES ('|| str2 ||');';
     
    INSERT INTO temp_table_sql VALUES (str);
    END;
    /
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Membre confirmé Avatar de ruscov
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2007
    Messages : 347
    Points : 500
    Points
    500
    Par défaut
    Merci beaucoup pour l'optimisation. Je ne suis pas encore très à l'aise avec PL/SQL.

    Sinon, en effet je ne l'utilise qu'une seule fois pour créer ma requête. Après je mets ma requête tel quelle est générée dans mon trigger.

    merci.
    Mes logiciels n’ont jamais de bug. Ils développent juste certaines fonctions aléatoires.

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

Discussions similaires

  1. INSERT INTO avec un SELECT
    Par Sparktacus dans le forum Requêtes
    Réponses: 2
    Dernier message: 18/08/2009, 16h25
  2. insert into avec le select
    Par vaness303 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 18/05/2009, 17h53
  3. insert into avec un select
    Par vaness303 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 15/05/2009, 14h54
  4. Insert Into avec un Select
    Par Tintou dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 01/10/2007, 17h07
  5. [Débutant] INSERT INTO avec VALUES + SELECT
    Par Feezdev dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/06/2006, 10h10

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