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 :

(Oracle 10g - PL/SQL) Accès dynamique à un %ROWTYPE


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 6
    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 : 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
    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

  2. #2
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Par défaut
    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
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 6
    Par défaut
    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...

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    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

  5. #5
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Vous pouvez également vous inspirer de la deuxième partie de l'article suivant:
    http://sheikyerbouti.developpez.com/dynamic/dynamic.htm

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 6
    Par défaut
    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..

  7. #7
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    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.

  8. #8
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 6
    Par défaut
    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...

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/11/2008, 12h54
  2. [Oracle 10g & MS SQL Server 2K5] DTS Import/Export Wizard
    Par tamiii dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 11/04/2008, 10h08
  3. Installation oracle 10g: gestion des acces disques
    Par dobinator dans le forum Oracle
    Réponses: 7
    Dernier message: 10/05/2007, 21h08
  4. Réponses: 2
    Dernier message: 14/02/2007, 17h22
  5. Réponses: 1
    Dernier message: 17/03/2006, 08h21

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