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

PL/SQL Oracle Discussion :

Insert et update (équivalent MERGE INTO) avec curseur


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Par défaut Insert et update (équivalent MERGE INTO) avec curseur
    Salut à tous,

    Quelqu’un a t-il un exemple d’insert et update avec curseur ? (un peu comme un MERGE INTO). Mon encadreur ne veut pas que j’utilise le « MERGE INTO ». Je dois faire un insert des données de la table_1 dans la table_2, mais si les valeurs existe déjà un update en utilisant deux curseurs : un curseur d’insertion et un autre pour le update. Si quelqu’un a un exemple, je suis preneuse. Je n’ai rien trouvé sur le net.

    Merci d’avance pour vos exemples.
    Fiona

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Dans un curseur tu peux gérer l'exception DUP_VAL_ON_INDEX pour updater (évidemment ça nécessite d'avoir un index unique ou une PK violé) par contre le concept des 2 curseurs je ne vois vraiment pas trop l'intérêt.
    Si tu dois vraiment... peut être un curseur d'insertion avec WHERE NOT EXISTS et un d'update avec WHERE EXISTS.

    Par contre Fiona, il va vraiment falloir changer d'encadreur parce qu'il me semble que ce n'est pas la 1ère fois qu'il refuse les bonnes solutions... en attendant souviens toi bien de MERGE plus que des bidouilles à base de curseurs...

  3. #3
    Membre confirmé Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Par défaut
    Salut skuatamad,

    j'ai un problem avec mon code. Peux tu stp me dire ou ca coince?

    PL/SQL: ORA-00907: missing right parenthesis



    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    create or replace
    PROCEDURE           P_insertion IS
     
        str_ereur           varchar2(200);
        sql_str          varchar2(32000);
     
        CURSOR C1 IS    
                          SELECT *
                          from table_1 t1, 
    						   table_2 t2
                          where not exists (
                                            select * from table_3 t3
                                            where   t1.id_medecin    =   t3.id_medecin  
                                            and     t1.id_s    =   t3.id_s
                                            and     t1.id_seq    =   t3.id_seq  
                                            and     t1.id_an    =   t3.id_an
                                            and     t1.id_ste    =   t3.id_ste)
                                            and     t1.id_statut  = 'new'
                                            and     t1.id_employe   = t2.id_employe
                                           ;
    	CURSOR C2_upd IS SELECT 
                              t1.id_medecin,
                              t1.id_section,
                              t1.id_produit,
                              t1.id_reseau
        from    table_1 t1
        where exists ( select * from table_3 t3
        where   t1.id_medecin    	=   t3.id_medecin  
        and     t1.id_s    			=   t3.id_s
        and     t1.id_seq    		=   t3.id_seq  
        and     t1.id_an    		=   t3.id_an
        and     t1.id_ste    		=   t3.id_ste
        and     t1.row_id    		!=   t3.row_id)
        and     status = 0;
     
    BEGIN  
       FOR C1_rec IN C1 LOOP 
          begin
                    insert into table_3  t3
                       ( t3.id_medecin, 
                          t3.id_section, 
                          t3.id_produit,
                          t3.id_reseau
                        )
                          VALUES 
                          (
                           C1_rec.id_medecin, 
                           C1_rec.id_section, 
                           C1_rec.id_produit,
                           C1_rec.t2.id_reseau_change
                          ) ;  
    				 execute immediate sql_text ;
     
    		--> Update
     
    		update table_3 t3
            set (  t3.id_medecin	    = C2_upd.id_medecin,
                    t3.id_section		= C2_upd.id_section,
                    t3.id_produit		= C2_upd.id_produit,
                    t3.id_reseau	    = C2_upd.id_reseau
                ) ;
     
                    commit; 
     
            exception            
              when others then			
                rollback;
                  str_ereur := substr(sqlerrm,1,200);
              insert into test (test ) values (str_ereur);        
            end; 
    	END LOOP;
    COMMIT;
    END P_insertion;
    Merci d'avance
    Fiona

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Salut Fiona,

    Pas facile de t'aider sans vraiment comprendre ce que tu veut faire.
    Pourquoi as tu un curseur d'insertion différent de ton curseur d'update, cf la jointure sur table_2 ?
    N'utilises pas select *, la procédure deviendrait invalide après ajout d'une colonne.
    Sinon dans la procédure tu ne faisais pas appel au curseur d'update.
    Et concernant l'update tu dois pointer la ligne à mettre à jour en utilisant where ....

    Ci dessous ton code un peu remanié :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    CREATE OR REPLACE PROCEDURE  P_insertion IS
     
        str_ereur           varchar2(200);
        sql_str          varchar2(32000);
     
        CURSOR C1 IS 
                          SELECT *
                          FROM table_1 t1,  table_2 t2
                          WHERE NOT EXISTS (
                                            SELECT 1 FROM table_3 t3
                                            WHERE   t1.id_medecin    =   t3.id_medecin  
                                            AND     t1.id_s    =   t3.id_s
                                            AND     t1.id_seq    =   t3.id_seq  
                                            AND     t1.id_an    =   t3.id_an
                                            AND     t1.id_ste    =   t3.id_ste
    					)
                           AND     t1.id_statut  = 'new'
                           AND     t1.id_employe   = t2.id_employe;
     
    	CURSOR C2_upd IS SELECT 
                              t1.id_medecin,
                              t1.id_section,
                              t1.id_produit,
                              t1.id_reseau
        FROM    table_1 t1
        WHERE EXISTS ( SELECT 1 FROM table_3 t3
        		WHERE   t1.id_medecin =   t3.id_medecin  
        		AND     t1.id_s    =   t3.id_s
        		AND     t1.id_seq  =   t3.id_seq  
        		AND     t1.id_an   =   t3.id_an
        		AND     t1.id_ste  =   t3.id_ste
        		AND     t1.row_id  !=   t3.row_id
    		)
        AND     STATUS = 0;
     
    BEGIN  
       FOR C1_rec IN C1 LOOP 
                    INSERT INTO table_3  t3
                       ( t3.id_medecin, 
                          t3.id_section, 
                          t3.id_produit,
                          t3.id_reseau
                        )
                          VALUES 
                          (
                           C1_rec.id_medecin, 
                           C1_rec.id_section, 
                           C1_rec.id_produit,
                           C1_rec.t2.id_reseau_change
                          ) ;  
    	end loop;
     
    /* execute immediate sql_text ;  ça vient d'où ? */
     
    	FOR C2_u IN C2_upd LOOP
    		--> Update
     
    		UPDATE table_3 t3
            	SET (  t3.id_medecin = C2_u.id_medecin,
                    	t3.id_section = C2_u.id_section,
                    	t3.id_produit = C2_u.id_produit,
                    	t3.id_reseau = C2_u.id_reseau
                	) 
    		WHERE t3.id_medecin = C2_u.id_medecin
    		AND ....;
    	END LOOP;
     
    commit; 
     
    exception            
        when others then			
                rollback;
                  str_ereur := substr(sqlerrm,1,200);
              INSERT INTO test (test ) VALUES (str_ereur);
    END P_insertion;

  5. #5
    Membre confirmé Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Par défaut
    Salut skuatamad,

    puis-je t'envoyer mon code en MP? Car vu c'est plein de truc de la Sté, j'ai peur de plublier sur le net.

    J'ai essayer d'apporter un changement dans le code avec tes conseils. Mais j'ai toujours les faute suivante:

    PL/SQL: ORA-00907: missing right parenthesis


    Merci
    Fiona

  6. #6
    Membre confirmé Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Par défaut
    Salut,

    j'ai enlevé la paranthèse autour du SET. Et je n'ai plu de faute.

    Bye
    Fiona

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

Discussions similaires

  1. Insert ou update avec Merge
    Par oumlike dans le forum Firebird
    Réponses: 5
    Dernier message: 07/09/2011, 14h34
  2. Insert et update d'une date avec heure
    Par antalata dans le forum Oracle
    Réponses: 3
    Dernier message: 05/05/2010, 09h50
  3. utililisation de Merge into avec sql server2005
    Par kssillati dans le forum Développement
    Réponses: 3
    Dernier message: 15/04/2010, 13h14
  4. [MySQL] Php et INSERT INTO, avec variables
    Par Djwaves dans le forum PHP & Base de données
    Réponses: 24
    Dernier message: 20/02/2006, 13h53
  5. INSERT INTO avec une valeur numéroauto
    Par priest69 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 08/11/2005, 15h39

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