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 26/02/2007, 17h21   #1
Invité de passage
 
Inscription : décembre 2002
Messages : 6
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : décembre 2002
Messages : 6
Points : 1
Points : 1
Par défaut (Oracle 10g - PL/SQL) Accès dynamique à un %ROWTYPE

Bonjour,

Je veux écrire une procédure PL/SQL dans laquelle j'accède à des champs d'un rowtype passé en paramètre de manière dynamique (les noms des champs sont issus d'une table).

Le code ressemble à celui ci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PROCEDURE "COMPARE_CHAMPS"
(
 p_anciennes_valeurs IN MATABLE%ROWTYPE,
 p_nouvelles_valeurs IN MATABLE%ROWTYPE
) IS
  ancienneVal VARCHAR(250);
  nouvelleVal VARCHAR(250);
BEGIN
    FOR maligne in (SELECT * FROM MATABLE_COLONNES) LOOP
      -- Pour chaque colonne à surveiller, on regarde si la valeur a changée.
     EXECUTE IMMEDIATE 'SELECT p_ancien_trade.'||TMCRow.TMC_NOM||' FROM DUAL' INTO ancienneVal;
     EXECUTE IMMEDIATE 'SELECT p_nouveau_trade.'||TMCRow.TMC_NOM||' FROM DUAL' INTO nouvelleVal;

      IF ancienneVal<>nouvelleVal THEN
       -- La valeur a changé, on insère la modif.
      END IF;
    END LOOP;	 
END COMPARE_TRADES;
Le problème est qu'en SQL dynamique, les variables ROWTYPE ne sont pas connues, il faut donc que je trouve un moyen d'accéder aux différents champs du rowtype sans connaitre leur nom à priori...

Quelqu'un a t il une idée?

D'avance merci
patbol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 17h31   #2
Responsable Business Intelligence
 
Avatar de kalyparker
 
Femme
Consultant en Business Intelligence
Inscription : janvier 2007
Messages : 1 192
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : janvier 2007
Messages : 1 192
Points : 2 564
Points : 2 564
Bonjour,

Peut être qu'un curseur sur les colonnes de ta table pourrais être utilisé...
Il suffirait ensuite de boucler sur ces colonnes pour la comparaison.

C'est peut être une piste
kalyparker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 17h40   #3
Invité de passage
 
Inscription : décembre 2002
Messages : 6
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : décembre 2002
Messages : 6
Points : 1
Points : 1
Merci pour ta réponse, mais je ne comprends pas bien :
à chaque boucle, je connais le nom de la colonne à laquelle je veux accéder, le problème est que je ne sais pas comment y accéder... La structure des données est un rowtype, et en SQL dynamique, j'ai l'impression qu'on ne peut accéder qu'à des objets en base.
Je cherche donc à savoir s'il existe une syntaxe (en SQL dynamique ou non) qui permette d'accéder aux colonnes autrement qu'en les nommant explicitement...
patbol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 18h52   #4
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Je ne vois que le package DBMS_SQL qui permet d'accéder par position à une colonne résultat d'une requête; voir l'exemple n° 3 dans http://download-uk.oracle.com/docs/c...htm#sthref7418
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 19h19   #5
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
Vous pouvez également vous inspirer de la deuxième partie de l'article suivant:
http://sheikyerbouti.developpez.com/dynamic/dynamic.htm
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 09h32   #6
Invité de passage
 
Inscription : décembre 2002
Messages : 6
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : décembre 2002
Messages : 6
Points : 1
Points : 1
Merci, mais dans les 2 solutions, la source doit être une table et pas un ROWTYPE, non ?
Quelque chose m'echappe, j'ai beau regarder tous les exemples, je n'arrive pas à les ramener au cas qui me préoccupe..
patbol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 09h56   #7
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
Il se peut que le cas qui vous préoccupe doive être légèrement adapté.
Ce que vous souhaitez, en somme est passer un record à votre procédure pour en obtenir les champs. %ROWTYPE peut être considéré comme un record interne et peut donc également être traité comme une ligne d'une collection. D'où le rapport avec l'article cité.
Toujours est-il que toutes les solutions passent par l'utilisation du package DBMS_SQL.
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 09h57   #8
Responsable Business Intelligence
 
Avatar de kalyparker
 
Femme
Consultant en Business Intelligence
Inscription : janvier 2007
Messages : 1 192
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : janvier 2007
Messages : 1 192
Points : 2 564
Points : 2 564
Bonjour,

Je reviens vers vous pour préciser ma pensée ...

J'avais en tête de faire un curseur dans la procédure "COMPARE_CHAMPS" qui fasse quelque chose comme :
Code :
SELECT column_name FROM USER_TAB_COLUMNS WHERE table_name='MATABLE';
Ensuite faire une boucle for pour récuperer chaque nom de colonne et ainsi l'intégrer dans le sql dynamique.

REM : tu peux même récupérer le data_type si tu veux.

Voili, voilou
kalyparker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2007, 11h18   #9
Invité de passage
 
Inscription : décembre 2002
Messages : 6
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : décembre 2002
Messages : 6
Points : 1
Points : 1
Je vous remercie pour vos réponses, malheureusement, je n'ai pas réussi à faire ce que je voulais...
J'ai quand même trouvé une solution de contournement en passant par une table temporaire...
patbol 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 08h40.


 
 
 
 
Partenaires

Hébergement Web