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 :

table variable dans une boucle for


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut table variable dans une boucle for
    Bonjour,

    Dans la requete select ci-dessous il faut que j'utilise une table qui doit etre une variable, ma question est comment je dois faire ?

    A la place de T_TA_ALIAS je voudrais avoir :

    TAB := 'tab1';
    et pouvoir remplacer T_TA_ALIAS par tab1.T_TA_ALIAS ??

    FOR T IN ALL_TEST_AREAS.FIRST .. ALL_TEST_AREAS.LAST LOOP
    begin
    SELECT ALIAS
    INTO MAP_ALIAS
    FROM T_TA_ALIAS
    WHERE TEST_AREA = ALL_TEST_AREAS(T);
    EXCEPTION
    WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20070,
    'TEST AREA IN ENG : ' || ALL_TEST_AREAS(T) ||
    ' => NOT FOUND IN T_TA_ALIAS ! ');
    end;
    TEST_AREA_SAS(ALL_TEST_AREAS(T)) := MAP_ALIAS;

    END LOOP;


    Merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    D'abord construisez votre curseur en tant que chaîne de caractères, concaténez-y le nom de votre table au bon endroit, puis appellez votre curseur !

    Je pense que j'ai vu ça dans les tutoriels

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    Merci,

    J'ai defini le curseur TA_ENG_CURSOR

    Mais comment dois je l'executer dans la boucle for pour ne recuperer
    qu'une ligne du select, comment faire le fetch ...

    Pouvez vous m'aider sur le code ?

    FOR T IN ALL_TEST_AREAS.FIRST .. ALL_TEST_AREAS.LAST LOOP
    begin

    OPEN TA_ENG_CURSOR FOR 'SELECT ALIAS INTO ' || MAP_ALIAS || 'FROM ' || ENG_SCHEMA || '.T_TA_ALIAS WHERE TEST_AREA=' || ALL_TEST_AREAS(T) || ';';

    FETCH TA_ENG_CURSOR BULK COLLECT
    INTO ALL_TEST_AREAS2;


    end;
    TEST_AREA_SAS(ALL_TEST_AREAS(T)) := MAP_ALIAS;

    END LOOP;

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Peux tu éditer ton post et encadrer ton code avec la balise code ? (le # dans les icônes), ce sera plus lisible pour tout le monde.

    J'ai pas compris exactement ce que tu voulais faire (les noms de table dynamiques, etc..), tu peux donner 1 exemple avec 2 noms de table ?

    Sinon un curseur dynamique, comme un curseur n'a pas de INTO
    Il n'a pas de ; non plus à la fin
    Essaye au max d'utiliser les bind variables pour les SQL dynamique, ça évite d'avoir des problèmes avec les ' qui manquent si c'est une chaine de caractère.

    Dernier point : En mode débug, mieux vaut faire un dbms de l'ordre pour vérifier le select généré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FOR T IN ALL_TEST_AREAS.FIRST .. ALL_TEST_AREAS.LAST
    LOOP
      v_chaine :=  'SELECT ALIAS FROM ' || ENG_SCHEMA || '.T_TA_ALIAS WHERE TEST_AREA= :valeur';
     DBMS_OUTPUT.PUT_lINE(v_chaine);
      OPEN TA_ENG_CURSOR FOR v_chaine USING ALL_TEST_AREAS(T);
     
      FETCH TA_ENG_CURSOR BULK COLLECT INTO ALL_TEST_AREAS2;
     
    	TEST_AREA_SAS(ALL_TEST_AREAS(T)) := MAP_ALIAS;
     
    END LOOP;

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    Voila un exemple de code que j'ai actuellement qui fonctionne mais
    qui a un bugg, Ce bugg est le nom de la table dans le select qui est fixe
    T_TA_ALIAS . Je voudrais pouvoir mettre une table de facon dynamique de type ENG_SCHEMA.T_TA_ALIAS ( ENG_SCHEMA etant un varchar2 )
    Donc d'apres ce que tu m'as explique je dois utiliser un curseur
    ou je stocke la requete SQL, mais comment je peux l'inclure dans la boucle for ci-dessous ?

    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
     
     TYPE TA_LIST IS TABLE OF T_GENEALOGY.TEST_AREA%TYPE;
     ALL_TEST_AREAS       TA_LIST;
     MAP_ALIAS               VARCHAR2(30);
     CURRENT_SCHEMA := ENG_SCHEMA;
     
        FOR T IN ALL_TEST_AREAS.FIRST .. ALL_TEST_AREAS.LAST LOOP
          begin
            SELECT ALIAS
            INTO MAP_ALIAS
            FROM T_TA_ALIAS
            WHERE TEST_AREA = ALL_TEST_AREAS(T);
          EXCEPTION
            WHEN OTHERS THEN
              RAISE_APPLICATION_ERROR(-20070,
                                      'TEST AREA IN ENG : ' || ALL_TEST_AREAS(T) ||
                                      ' => NOT FOUND IN T_TA_ALIAS ! ' );
          end;
          TEST_AREA_SAS(ALL_TEST_AREAS(T)) := MAP_ALIAS;
        END LOOP;
    J'espere que c'est plus claire..

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    En fait grace a ton example j'ai trouve la solution MERCI
    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
     
      ALIAS_REQ :=  'SELECT ALIAS FROM ' || ENG_SCHEMA || '.T_TA_ALIAS WHERE TEST_AREA= :value';
     
        FOR T IN ALL_TEST_AREAS.FIRST .. ALL_TEST_AREAS.LAST LOOP
          begin
          OPEN TA_ENG_CURSOR FOR ALIAS_REQ USING ALL_TEST_AREAS(T); 
          FETCH TA_ENG_CURSOR INTO MAP_ALIAS;      
          EXCEPTION
            WHEN OTHERS THEN
              RAISE_APPLICATION_ERROR(-20070,
                                      'TEST AREA IN ENG : ' || ALL_TEST_AREAS(T) || 
                                      ' => NOT FOUND IN T_TA_ALIAS ! ');
          end;
    	    TEST_AREA_SAS(ALL_TEST_AREAS(T)) := MAP_ALIAS;    
        END LOOP;
     CLOSE TA_ENG_CURSOR;

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 10/01/2013, 11h07
  2. Définir variables dans une boucle for
    Par gmachi10 dans le forum MATLAB
    Réponses: 2
    Dernier message: 16/07/2008, 11h33
  3. Appeler une série de variable dans une boucle for
    Par jujuf1 dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/02/2008, 16h06
  4. Portée d'une variable dans une boucle FOR ?
    Par Neo41 dans le forum C++
    Réponses: 20
    Dernier message: 17/11/2006, 11h14
  5. [VB.net] Declaration variable dans une boucle for
    Par nico10gbb dans le forum Windows Forms
    Réponses: 4
    Dernier message: 10/05/2006, 11h45

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