|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : novembre 2004 Messages : 44 ![]() |
Bonjour à tous.
Je me permets de vous quémander votre aide pour un problème que me pose une partie de mon projet. Le sujet est pourtant "simple", je dois réaliser une "méthode" dont voici les composantes : - En entrée de ma "méthode" j'ai un nom de table et deux identifiants de cette table (IdOld, IdNew). - En sortie de ma "méthode" j'ai une liste de triplé "Nom champ - Ancienne valeur - Nouvelle valeur". Comme vous l'aurez peut être deviné, cette "méthode" doit trouver les champs qui ont une valeur différente entre les deux records pour me les renvoyer en sortie. (donc sortie null si tout est identique). Je ne connais pas d'avance les tables parcourues de cette manière et donc les champs à visiter (le nom de la table à traiter est passé en paramètre). La seule chose que je sais, c'est que chaque table possède une colonne ID qui me permet de récupérer mes deux records selon les identifiants en paramètres. Alors voilà, en Java, je sais faire tout ça par le biais de la réflexion, mais c'est couteux en ressource et pas très joli pour ce cas là ... Je voulais donc tout simplement savoir s'il n'y aurait pas une solution pour réaliser le même traitement mais en PL/SQL ? Je ne connais malheureusement que très peu PL/SQL, j'ai trouvé des possibilités de récupérer les noms de colonne, j'ai pu trouver des notions de Dynamic SQL, etc, mais je n'arrive pas à coller tout ces bouts pour savoir si ma "méthode" est réellement faisable en PL/SQL et cela de manière simple et efficace ?? Je vous remercie beaucoup d'avance de votre aide ! |
|
|
00
|
|
|
#2 | ||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Si j'ai bien compris votre besoin alors voici un exemple
Code :
|
||
|
|
01
|
|
|
#3 | ||||
|
Invité régulier
![]() Inscription : novembre 2004 Messages : 44 ![]() |
Bonjour Mohamed.
Malheureusement ce n'est pas exactement mon besoin. Mes contraintes sont très fortes : le nom de la table m'est passé en paramètre. De ce fait je ne connais pas les colonnes à comparer. Je sais juste qu'il y a une colonne ID. Ma sortie doit être une liste de "Nom du champ - ancienne valeur - nouvelle valeur" pour tous les champs dont leur valeur est différente. Durant cette journée j'ai essayé de creuser et je suis finalement arrivé à quelque chose. Voici ma solution : Code :
Code :
Alors avec cela je suis arrivé à mon but, ça fonctionne correctement, c'est beaucoup plus rapide que par introspection Java. Par contre je ne trouve pas cela super élégant non plus, notamment le fait de devoir faire 2 requête pour chaque champ ... Je ne suis pas expert PL SQL, il doit donc y avoir moyen d'optimiser tout cela. Si quelqu'un voit comment réaliser ça, je le remercie d'avance ! Sinon pour ceux qui avaient le même problème que moi, voici une solution |
||||
|
|
11
|
|
|
#4 | ||||||
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 306 ![]() |
Le PLSQL a un avantage surpuissant par rapport a plein de choses, c'est qu'il peut utiliser le %rowtype. Et en plus, on peut faire des execute immediate.
Ca devient assez simple en melangeant ces deux choses de creer des variables qui vont bien, qu'importe la table fournie en entree. Et l'autre truc assez pratique, c'est que %rowtype va utiliser directement les colonnes de la table, et on a acces a ces colonnes, via USER_TAB_COLUMNS Tout le reste, c'est du blabla. Code :
Code :
Code :
De temps en temps sqlplus fait des blagues, genre le retour a la ligne lignes 13/14 que je ne comprends pas. Vous devez simplement enlever la colonne idee dans le curseur implicite. Autrement: Je pense que un truc qui pourrait etre malin si vous vous preparez a utiliser souvent ceci ca pourrait etre de creer des procedures avec des noms en fonction du nom de la table. Il y a tout le squelette, au lieu d'un bloc anonyme, c'est... enfin bref. L'avantage, c'est que si vous vous balladez sur la meme table tout le temps, ben vous avez la procedure, et ensuite tout est deja passer au parser la premiere fois. Je dis ca par rapport a vos lignes 58 et 59. Vous pourriez eviter un peu de parse en mettant une bind variable pour l'id, mais vous ne pouvez pas pour le nom de colonne. D'ou l'utilisation du %rowtype. |
||||||
|
|
01
|
|
|
#5 |
|
Invité régulier
![]() Inscription : novembre 2004 Messages : 44 ![]() |
... ouah !
Merci beaucoup pour votre intervention. J'avoue, je n'ai pas tout compris, mais je vais de ce pas étudier tout cela. Merci beaucoup ! |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com