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 :

Pb procedure stockée


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Par défaut Pb procedure stockée
    J'ai un problème avec une procédure stockée.
    Quand je l'execute, il me dit qu'un de mes champs n'existent pas alors que je l'ai déclaré dans mon curseur.
    Quelqu'un a t'il déjà rencontré ce problème.
    Voici le code de ma procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    BEGIN
    FOR c IN(select col1 from table)
    LOOP
        BEGIN
       select valeur1, valuer2 into variable1, variable2 from tabe2;
       le_sql:= 'select col1  from table3 where [b]col1 = c.col1[/b]; 
       execute immediate le_sql into comptage;
       insert into TABLE (colonnes) values (valeurs); 
       COMMIT;
       END;
    END LOOP
    j'ai mis en gras d'où veniat le problème. Pourtant j'ai bien déclaré le curseur
    quequ'un at'il deja rencontré ce pb?

  2. #2
    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
    le_sql:= 'select col1 from table3 where col1 = c.col1;
    execute immediate le_sql into comptage;
    L'ordre a exécuter est stocké dans une chaine, il est donc normal que cela ne fonctionne pas.

    essayez plutôt ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    le_sql:= 'select col1  from table3 where col1 = :1'; 
    execute immediate le_sql into comptage using c.col1;

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Par défaut
    Il me renvoit les erreurs ORA00904 ora 06512 et ora 06512

  4. #4
    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
    Pouvez-vous fournir le code complet ?

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Par défaut
    Voici mon code complet:


    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
     
    CREATE OR REPLACE PROCEDURE nom_procedure IS
     
      code varchar2(20);
      libelle varchar2(30);  
      le_sql VARCHAR2(5000);
      nom fdfext.exnom%type;
      comptage number;
     
    BEGIN
    FOR c IN(select colonne_curseur from table)
    LOOP
     
       BEGIN
       select Valeur1, Valeur2 into code, libelle from Table;
       select nom into nom from tablenom where num = 'numéro';
       le_sql:= 'select Id, count(id) from tablesql where id = :1 and id not in (select valeur from '||nom||')  group by id'; 
       execute immediate le_sql into comptage using colonne_curseur;
       insert into TABLE (valeur, val2) values (colonne_curseur, comptage); 
       COMMIT;
       END;
     
      END LOOP;
    END;

  6. #6
    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 connaissez le nom de la table et celui de la colonne. Pourquoi utilisez-vous le SQL dynamique ???

    en plus votre select ramène 2 colonne et votre into une seule variable....

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Par défaut
    j'aipeut être trouvé d'ou ca venait.
    Dans ma requête le_sql , dans ma clause where j'ai ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where colonne1 ='1236' and col2 = ' '
    mais comme ma requête est entre apostrophe j'ai rajouté des apostrophes. c'est peut être du à ça?

  8. #8
    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
    Affichez (dbms_output.put_line / insert into...) le contenu de votre variable le_sql avant de l'exécuter.

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Par défaut
    Je n'ai plus mis qu'une seule colonne de retour.
    J'utilise le sql dynamique car la valeur dans la variable nom(qui me donne le nom d'une table) peut changer.
    Donc je ne sais pas si je dois dédoubler mes apostrophes ou non?

  10. #10
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select nom into nom from tablenom where num = 'numéro';
    et ça, c'est quoi ?

  11. #11
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Par défaut
    j'ai essayer le dbms_output.put_line avant l'execution de la reuqête et c'est la bonne requête donc mon problème ne vient pas de mes apostrophes...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select nom into nom from tablenom where num = 'numéro';
    Je vais chercher le nom de la table dont j'ai besoin pour ma requête dans "not in". Mais chaque jour cette table est différente.
    C'est pour cela que je fais un sql dynamique.

  12. #12
    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-donc exécuter correctement cette requête sous Toad ?

  13. #13
    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
    ne serait-ce pas plutôt ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    execute immediate le_sql into comptage using c.colonne_curseur; 
       insert into TABLE (valeur, val2) values (c.colonne_curseur, comptage);

  14. #14
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Par défaut
    oui cette requête fonctionne sous toad...quand j'execute la procédure j'ai une erreur 01722...

  15. #15
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Par défaut
    Citation Envoyé par SheikYerbouti
    ne serait-ce pas plutôt ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    execute immediate le_sql into comptage using c.colonne_curseur; 
       insert into TABLE (valeur, val2) values (c.colonne_curseur, comptage);
    C'est de ceci que vient l'erreur?

  16. #16
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Par défaut
    ok autant pour moi. je me suis rendue compte que mes id (venant de schémas de données différents) n'avaient pas le même type.
    Merci pour votre aide.

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

Discussions similaires

  1. Ecriture d'une procedure stockée XP
    Par WOLO Laurent dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/07/2003, 13h09
  2. Réponses: 1
    Dernier message: 04/06/2003, 11h48
  3. procedure stockée champ date
    Par tripper.dim dans le forum SQL
    Réponses: 5
    Dernier message: 25/04/2003, 09h47
  4. Appel a une procedure stockée en vba
    Par The_Nail dans le forum VBA Access
    Réponses: 36
    Dernier message: 01/04/2003, 16h44
  5. procedure stockée dans un dbbatch
    Par pram dans le forum XMLRAD
    Réponses: 4
    Dernier message: 07/02/2003, 16h35

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