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 :

Problème Requête dynamique multi valeurs


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 15
    Par défaut Problème Requête dynamique multi valeurs
    Bonjour à tous !

    Voici le contexte : je travaille sur une base Oracle 9i, et je dois récupérer des valeurs dans certaines tables avec une requête dynamique, dont les paramètres sont eux-même stockés dans une table de paramétrage.

    Mon problème est de récupérer ces valeurs dans un curseur pour pouvoir les insérer une à une dans une autre table, alors que je ne connais pas le nom des champs, puisque ceux-ci sont paramétrés dynamiquement.

    On m'a conseillé de mettre des alias dans ma requête pour chacune des 2 colonnes ramenées, afin de pouvoir les manipuler dans tous les cas. Malheureusement, ça ne passe pas à la compil (PLS-00302: Le composant 'ORDRE' doit être déclaré)

    Voici le bout de ma procédure qui pose problème :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    --déclarations
    ...
    TYPE CurTyp IS REF CURSOR;
    C_Result   CurTyp;
    rec_Result  RESULTAT_PROPA%ROWTYPE; --possibilité d'écrire un ROWTYPE manuellement (personnalisé) ?
    ...
     
    --génération de la requête
    L_Requete := 'select '||L_Nom_liste||' ordre, '||rec_Info.code||' val from '
    ||L_Nom_table|| ' where DOSID = '||P_DOSID||
    ' and DPRVERSION = '''||P_VERSION||''' order by'||L_Nom_liste;
     
    -- exécution de la requête 
    OPEN C_Result FOR L_Requete;
    	LOOP
          	FETCH C_Result INTO rec_Result;
          	EXIT WHEN C_Result%NOTFOUND;
    		  if rec_Info.type = 'DATE' then
    		INSERT INTO RESULTAT_PROPA (REQID, DOSID, DPRVERSION, 
    			CODE_CLIENT, BLOC, VALEUR, VALEUR_LISTE) 
    			VALUES (P_REQID, P_DOSID, P_VERSION,
    			rec_Info.codeclient, rec_Bloc.bloc, 
    			to_char(rec_Result.val, 'DD/MM/YYYY'), rec_Result.ordre); 
       	  	  else
    			INSERT INTO RESULTAT_PROPA (REQID, DOSID, 
    			DPRVERSION, CODE_CLIENT, BLOC, VALEUR, 
    			VALEUR_LISTE) 
    			 VALUES (P_REQID, P_DOSID, P_VERSION, 
    			 rec_Info.codeclient, rec_Bloc.bloc, to_char(rec_Result.val),
    			 rec_Result.ordre);
    		  end if;
    	END LOOP;
    CLOSE C_Result;
    Si vous avez la solution, merci mille fois

    (question subsidiaire, pour déclarer mon rec_Result (qui parcoure le curseur), puis-je personnaliser le type d'enregistrement que j'attends (au lieu de mettre un %rowtype, et si oui comment ?)

  2. #2
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 15
    Par défaut
    Problème résolu grâce à DBMS_SQL et ses fonctions de parsing (ça facilite la vie)
    => http://sjfb.club.fr/ficheor/fchor7.htm

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 119
    Par défaut
    Bonjour,
    tu peux inspirer une solution à partir de ce code:
    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
     
    DECLARE
       TYPE T_EMP_ID   is TABLE of EMP.empno%TYPE;
       TYPE T_EMP_NAME  is TABLE of EMP.ename%TYPE;
       T_Id        T_EMP_ID ;
       T_Nom       T_EMP_NAME ;
       LC$Requete  VARCHAR2(256);
    BEGIN
       LC$Requete:= ‘SELECT emp_no, ename from EMP’;
     
       EXECUTE IMMEDIATE LC$Requete BULK COLLECT INTO T_Id, T_Nom;
     
     
        FORALL i IN T_Id.first..T_Id.last
          EXECUTE IMMEDIATE 'UPDATE emp SET sal = sal * 1.1 WHERE empno = :1 RETURNING ename INTO :2'
                   USING T_Id(i) RETURNING BULK COLLECT INTO T_Nom;
     
    END;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Requête dynamique multi-critères dans un sous-formulaire
    Par fclus dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 27/10/2011, 15h35
  2. Problème requète dynamique et paramètres en prompt
    Par lionrouge dans le forum iReport
    Réponses: 1
    Dernier message: 17/11/2010, 22h24
  3. Réponses: 0
    Dernier message: 03/01/2010, 13h40
  4. Problème pour lier un valeur saisie avec une requête.
    Par jejeapollo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/08/2007, 12h56
  5. [SQL] Problème requête sql,rajouter une valeur,checbox
    Par snakejl dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/06/2006, 11h18

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