Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/12/2010, 23h44   #1
Membre à l'essai
 
Avatar de Fiona08
 
Inscription : juillet 2008
Messages : 108
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 108
Points : 21
Points : 21
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
Fiona08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2010, 01h40   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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...
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2010, 11h08   #3
Membre à l'essai
 
Avatar de Fiona08
 
Inscription : juillet 2008
Messages : 108
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 108
Points : 21
Points : 21
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 :
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
Fiona08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2010, 12h11   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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 :
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;
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2010, 13h10   #5
Membre à l'essai
 
Avatar de Fiona08
 
Inscription : juillet 2008
Messages : 108
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 108
Points : 21
Points : 21
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
Fiona08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2010, 14h25   #6
Membre à l'essai
 
Avatar de Fiona08
 
Inscription : juillet 2008
Messages : 108
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 108
Points : 21
Points : 21
Salut,

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

Bye
Fiona
Fiona08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h39.


 
 
 
 
Partenaires

Hébergement Web