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

Oracle Discussion :

[ORACLE9I, PL/SQL] Select into


Sujet :

Oracle

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Points : 77
    Points
    77
    Par défaut [ORACLE9I, PL/SQL] Select into
    Bonjour,
    Peux-ont créer un select into en utilisant comme nom de colonne dans la clause where un paramètre (dans mon exemple PE_MAVAR)?. Voici mon exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    FUNCTION ISINEXP(PE_MAVAR IN VARCHAR2) RETURN BOOLEAN
       IS
         VL_COUNT NUMBER;
       BEGIN
         SELECT COUNT(*) INTO VL_COUNT
         FROM EXPGAB
         WHERE PE_MAVAR = 'u';
       IF (VL_COUNT<>0) THEN
           RETURN TRUE;
       END IF;
       RETURN FALSE;
    END;
    la fonction me retourne toujours false, ce qui ne devrait pas être le cas !

    Etant donné que ça ne fonctionne pas, j'ai essayé avec un curseur dynamique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    VL_REQ := 'SELECT COUNT(*) FROM EXPGAB WHERE '||PE_MAVAR||' = ''u''';
         EXECUTE IMMEDIATE VL_REQ INTO VL_COUNT;
    Ne marche pas non plus !

    Pourtant, dans les 2 cas, si je met une valeur "en dur" à la place de PE_MAVAR, ça fonctionne!!!

    Merci d'avance de votre aide!

  2. #2
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Execute immediate doit donner le résultat escompté

    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
    SQL> set serveroutput on
    SQL> 
    SQL> Declare
      2    LC$Col   Varchar2(30) := 'DEPTNO' ;
      3    LC$Req   Varchar2(100) ;
      4    LN$Cnt   Pls_Integer ;
      5  Begin
      6    LC$Req := 'Select count(*) from EMP where ' || LC$Col || ' = 10' ;
      7    execute immediate LC$Req Into LN$Cnt ;
      8    Dbms_Output.put_Line( 'Count(*) = ' || To_Char( LN$Cnt ) ) ;
      9  End ;
     10  
     11  
     12  /
    Count(*) = 3
     
    PL/SQL procedure successfully completed.

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Points : 77
    Points
    77
    Par défaut
    Merci pour la réponse.
    Je ne comprends pas pourquoi ma fonction foire, comme vous me le dites, ça DOIT marcher!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       FUNCTION ISINEXP(PE_MAVAR IN VARCHAR2) RETURN BOOLEAN
       IS
         VL_COUNT NUMBER;
         VL_REQ VARCHAR2(200);
        BEGIN
          VL_REQ := 'SELECT COUNT(*) FROM EXPGAB WHERE '||PE_MAVAR||' = ''u''';
         EXECUTE IMMEDIATE VL_REQ INTO VL_COUNT;
        IF (VL_COUNT<>0) THEN
           RETURN TRUE;
         END IF;
         RETURN FALSE;
       END;
    Si j'affiche, VL_REQ, je vois que ça contient bien la requête que j'aimerais executer (d'ailleur, elle fonctionne si je l'execute manuellement-> copier coller dans SQL+).
    C'est EXECUTE IMMEDIATE qui déclanche le problème. Si je le met en commentaire, ma fonction passe! Je ne comprend pas pourquoi, ça doit être un jour noir!!!

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Points : 77
    Points
    77
    Par défaut Appel de la fonction en question
    ça doit être mon appel qui foire. J'appel la fameuse fonction depuis une procédure de la manière suivante:

    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
     
    PROCEDURE ...
    IS
      CURSOR c_variables IS
          SELECT *
          FROM   V_VARIABLES
          WHERE  INSTITUT = PE_INSTITUT
          AND    VAGUE    = PE_VAGUE
          AND    TY_QUEST = PE_TYQUEST
          ORDER BY QRE_ORDRE;
    ...
    BEGIN
    ...
      FOR rec IN c_variables LOOP
              -- Si la variable se trouve déjà dans une table d'export en mode modification, on l'indique
              IF ISINEXP(rec.VARIABLE) THEN
              . . .
    Je passe en paramètre rec.VARABLE (VARIABLE étant le nom d'une colonne de ma vue V_VARIABLE et est de type VARCHAR2(8))!

    Si je passe une valeure "en dur", ça fonctionne. exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    IF ISINEXP('CANTON00') THEN
    ..
    Qqun voit-il le problème???

  5. #5
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    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
     
    SQL> set serveroutput on
    SQL> 
    SQL> Declare
      2    CURSOR c_variables IS 
      3        SELECT COLUMN_NAME 
      4        FROM   USER_TAB_COLUMNS 
      5        WHERE  TABLE_NAME = 'EMP' 
      6        AND    COLUMN_NAME = 'DEPTNO' ; 
      7  BEGIN 
      8    FOR rec IN c_variables LOOP 
      9       -- Si la variable se trouve déjà dans une table d'export en mode modification, on l'indiqu
    e 
     10       IF ISINEXP(rec.COLUMN_NAME) THEN
     11      Dbms_output.put_Line ('OK') ;
     12    ELSE
     13      Dbms_output.put_Line ('!KO!') ;
     14    END IF ;
     15    End loop ;
     16  End ;     
     17  
     18  /
    OK
     
    PL/SQL procedure successfully completed.
     
    SQL>
    Quelle version de la base ?

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Points : 77
    Points
    77
    Par défaut
    Pour être précis:

    Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production.

    Mais j'ai déjà utilisé EXECUTE IMMEDIATE plusieurs fois et ce dans la même base.

  7. #7
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Etes-vous sûre que votre curseur ramène bien le bon nom de colonne ?

  8. #8
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Points : 77
    Points
    77
    Par défaut
    RÂÂÂÂÂÂÂ!

    J'ai trouvé la bulle! En faite, mon curseur "c_variables" renvoie un certains nombre d'enregistrements. Ensuite, je boucle sur chaques enregistrement du curseur et avec la fonction ISINEXP, je vais vérifier que la valeur "VARIABLE" de mon enregistrement courant ai une valeur 'u' dans la table "EXPGAB".
    Le problème, c'est que toutes les valeurs de mon curseur ne se trouve pas forcément (en tant que colonne) dans la table "EXPGAB" !!!
    Du coup, si la colonne rec.VARIABLE n'existe pas dans la table "EXPGAB", l'erreur ORA-00904: "xxxxxx" : identificateur non valide est déclanché et mon programme foire!!!
    Je suis désolé, je cherchais l'erreur à la mauvaise place (erreur technique au lieu d'erreur logique) !!!
    Merci de votre aide![/b]

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

Discussions similaires

  1. probleme En sql Select Into pour effectuer l'archivage des Commandes
    Par r.mehdi dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 22/06/2008, 16h54
  2. [SQL]Creer une table a partir d'une requete SELECT * INTO
    Par aliboubou dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 03/04/2007, 11h30
  3. [PL/SQL] SELECT INTO avec type TABLE
    Par Kaejar dans le forum Oracle
    Réponses: 13
    Dernier message: 06/07/2006, 16h17
  4. [PL/SQL] problème SELECT INTO
    Par nako dans le forum Oracle
    Réponses: 3
    Dernier message: 27/12/2005, 13h41
  5. [Oracle9i/ Pl/Sql] Update et select en même temps
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 7
    Dernier message: 31/05/2005, 17h26

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