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 07/07/2011, 09h57   #1
Invité de passage
 
Homme Migr
Inscription : août 2010
Messages : 33
Détails du profil
Informations personnelles :
Nom : Homme Migr
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 33
Points : 2
Points : 2
Par défaut Stocker une requête update dans une table

Bonjour,
J'ai un petit souci si vous pouvez me donner des idées.
Je dois mettre à jour une table via une autre table qui contient des règles de transcodification.

Exemple :
table A (aa, cd_aa)

table_transco ( bb, table_name, col_name, ancienValue, NewValue)
jeux de données ;

table A
90, 0
88, 2
table_transco
88, A, cd_aa, 2, 2
90, A, cd_aa, 0, 3

Je dois mettre à jour la valeur 0 du champ cd_aa avec la nouvelle valeur qui est 3.

Je l'ai fait avec une proc stockée et ça marche.
Le problème c'est qu'on me demande de stocker la requête qui fait l'update dans une table (est-ce que c'est une nouvelle table ou un champ de la table "table_transco" ?) et gérer cet "update" dynamiquement.

Si vous avez des idées n'hésitez pas à m'en faire part.

Merci beaucoup
bigtruck2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 10h26   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Code :
1
2
3
4
5
6
7
8
9
10
11
WITH table_transco AS (SELECT 88 bb, 'A' table_name, 'cd_aa' col_name, 2 ancienValue, 2 NewValue FROM dual
UNION ALL SELECT 90, 'A', 'cd_aa', 0, 3 FROM dual
)
SELECT bb, table_name, col_name, ancienvalue, newvalue, 
			DECODE(ancienvalue, newvalue, '', 'UPDATE '|| table_name ||' set '|| col_name ||'='|| newvalue ||' WHERE '|| col_name ||'='|| ancienvalue) AS req_Update
FROM table_transco
 
 
BB	TABLE_NAME	COL_NAME	ANCIENVALUE	NEWVALUE	REQ_UPDATE
88	A	cd_aa	2	2	
90	A	cd_aa	0	3	UPDATE A SET cd_aa=3 WHERE cd_aa=0
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 10h53   #3
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Citation:
Je l'ai fait avec une proc stockée et ça marche.
Le pb c'est qu'on me demande de stocker la requet qui fait l'update dans une table (est ce que c'est une nouvelle table ou un champ de la table "table_transco" ?) et gerer ce "update" dynamiquement.

Si vous avez des idées n'hésiter pas à m'en faire part.

Merci bcp
Bonjour,

En utilisant une procédure stockée (static PL/SL) pour faire votre update vous être protégé parce que:

(1) Vous allez utiliser les bind variables automatiquement (PL/SQL statique)
(2) Vous n’êtes pas sujet à la menace du ‘’SQL injection’’
(3) Vous êtes sûr de la compilation de votre package dès sa création

En stockant l’update dans une table, vous allez devoir utiliser du sql dynamique pour exécuter votre update ; ainsi vous devez :

(1) faire un effort supplémentaire pour l’utilisation des bind variables
(2) vous êtes à la merci du ‘SQL injection’
(3) votre code n’est parsé qu’au moment de son exécution, et il se pourrait qu’il ne compile pas lors de cette exécution

Bien à vous

Mohamed Houri
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 11h14   #4
Invité de passage
 
Homme Migr
Inscription : août 2010
Messages : 33
Détails du profil
Informations personnelles :
Nom : Homme Migr
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 33
Points : 2
Points : 2
Merci pour vos réponses.
La requete de McM a bien marché, sauf qu'elle me remplit la table "table_transco" qu'avec les lignes où il y a bien eu un changement sur la liste des valeurs.
Dans mon cas
j'ai bien eu:

BB TABLE_NAME COL_NAME ANCIENVALUE NEWVALUE REQ_UPDATE
88 A cd_aa 2 2
90 A cd_aa 0 3 UPDATE A SET cd_aa=3 WHERE cd_aa=0

Je pense que je ne dois avoir dans cette table que les lignes où j'aurai la requête ?? je ne suis pas encore sûr.

Ensuite j'utilise dans talend un composant input où je mets une requête sur cette table "table_transco" qui me renvoie TABLE_NAME, REQ_UPDATE
puis un autre composant qui exécute cette requête sur la base.
bigtruck2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 12h57   #5
Invité de passage
 
Homme Migr
Inscription : août 2010
Messages : 33
Détails du profil
Informations personnelles :
Nom : Homme Migr
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 33
Points : 2
Points : 2
J'ai une autre problématique :
j'ai une trable transformation qui a la structure suivante :
(cle1, ordre, NomTable, requete)
cette requete contient une règle sur un champ de "NomTable".

exemple :
Code :
1
2
 
UPDATE NomTable SET NomTable.colonne = '122' WHERE NomTable.cle2 ='20'
Comment je pourrai insérer cette ligne "requete update" dans le champ "requete" de ma table "transformation" ??

Ce cas est différent du cas ci-dessus, je n'arrive pas à utiliser decode pour le faire.

Merci pour votre aide.
bigtruck2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h44.


 
 
 
 
Partenaires

Hébergement Web