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

SQL Oracle Discussion :

Résultat d'une requête dans une variable [Fait]


Sujet :

SQL Oracle

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 62
    Par défaut Résultat d'une requête dans une variable
    Bonjour à tous,

    J'ai tenté de créer une fonction dans laquelle je souhaiterais mettre le résultat d'une requête dans une variable mais j'ai des erreurs à la compilation, voici le programme pl/sql ainsi que l'erreur qu'il me retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    create or replace function chemin1 (var1 in integer)
    return integer
    is w_resultat integer;
    begin
    while var1 != 100 loop
    select chemin(var1) into w_resultat from dual;
    DBMS_OUTPUT.PUT_LINE(w_resultat);
    select donne_sur into var1 from issue
    where num_issue = chemin(var1);
    end loop;
    return w_resultat;
    end;
    /
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PLS-00403: l'expression 'VAR1' ne peut être utilisée comme cible
    INTO d'une instruction SELECT/FETCH
    J'ai également essayé d'une autre manière que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    create or replace function chemin1 (var1 in integer) 
    return integer
    is w_resultat integer;
    begin
    while var1 != 100 loop
    select chemin(var1) into w_resultat from dual;
    DBMS_OUTPUT.PUT_LINE(w_resultat);
    var1 := select donne_sur from issue
    where num_issue = chemin(var1);
    end loop;
    return w_resultat;
    end;
    /
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    PLS-00103: Symbole "SELECT" rencontré à la place d'un des
    symboles suivants :
    ( - + case mod new not null <identificateur>
    <identificateur entre guillemets> <variable bind> avg count
    current exists max min prior sql stddev sum variance execute
    forall merge time timestamp interval date
    <un littéral de chaîne avec spécification de jeu de caractères>
    <un nombre> <une chaîne SQL entre apostrophes> pipe
    <constante de chaîne éventuellement entre guillemets avec
    indication du jeu de caractèr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PLS-00103: Symbole "END" rencontré
    C'est dans le cadre d'un projet que je dois rendre pour ce soir au plus tard.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par cyph3r Voir le message
    C'est dans le cadre d'un projet que je dois rendre pour ce soir au plus tard.
    Tu n'avais qu'à t'y prendre plus tôt.

    Révise ta syntaxe !!!

    Essaie ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create or replace function chemin1 (var1 IN OUT integer)
    ou ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create or replace function chemin1 (var1 integer)

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 62
    Par défaut
    L'erreur ne vient pas de là. Ma syntaxe est bonne car j'utilise la même syntaxe pour d'autres fonctions qui elles marchent parfaitement.

    De plus il me semble assez clair d'après les erreurs retournées que le problème provient du corps du programme et pour être précis du fait que je n'arrive pas à mettre dans une variable le retour d'une requête sql !!!

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par cyph3r Voir le message
    L'erreur ne vient pas de là. Ma syntaxe est bonne car j'utilise la même syntaxe pour d'autres fonctions qui elles marchent parfaitement.
    Si tu sais mieux que moi, pas de problème...
    il reste que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var1 := SELECT donne_sur FROM issue WHERE num_issue = chemin(var1);
    n'existe pas en PL/SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT donne_sur INTO var1 FROM issue WHERE num_issue = chemin(var1);
    est correct mais ta valeur var1 étant en IN, donc juste en entré donc non modifiable, tu as l'erreur TRES CLAIR :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PLS-00403: l'expression 'VAR1' ne peut être utilisée comme cible
    INTO d'une instruction SELECT/FETCH
    Après si tu ne testes pas ce que je te dis, tu fais comme tu veux, j'ai autre chose à faire de mon dimanche, moi...

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 62
    Par défaut
    Vraiment désolé, j'avais mal interprété ta réponse.

    La fonction passe à la compilation mais lorsque je l'exécute, il me dit :
    .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-06572: Fonction CHEMIN1 sans arguments
    je mets tout de même le code de ma première fonction, des fois que ça pourrait aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace function chemin (var1 in integer) 
    return integer
    is w_resultat integer;
    begin
    select min(num_issue) into w_resultat from issue
    where nom_piece = var1;
    return w_resultat;
    end;
    /
    Cette fonction elle marche parfaitement. Je me demande si il y a quelque chose que j'ai mal codé ou quoi ...

  6. #6
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Oracle/PLSQL: ORA-06572 Error

    Error:
    ORA-06572: function name has out arguments

    Cause:
    You tried to execute an SQL statement that referenced a package or function that contained an OUT parameter. This is not allowed.

    Action:
    The options to resolve this Oracle error are:

    1. Remove the OUT parameter from the package or function, and re-execute the SQL statement.
    Donc, modifies ta fonction chemin1() :
    • Enlève le OUT de la déclaration de var1
    • Ajoute une variable locale
    • Affecte la valeur de var1 à ta variable locale
    • Utilise ta variable locale en lieu et place de var1
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 62
    Par défaut
    Désolé de vous embeter mais je ne sais pas trop comment faire, j'ai essayé ça :

    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
    create or replace function chemin1 (var1 in integer)
    return integer
    is w_resultat integer;
    declare
    var2: integer;
    begin
    var2:=var1;
    while var2 != 100 loop
    select chemin(var1) into w_resultat from dual;
    DBMS_OUTPUT.PUT_LINE(w_resultat);
    SELECT donne_sur INTO var2 FROM issue
    where num_issue = chemin(var2);
    end loop;
    return w_resultat;
    end;
    /
    Mais cela ne fonctionne pas, il refuse la partie déclarative visiblement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PLS-00103: Symbole "DECLARE" rencontré à la place d'un des
    symboles suivants :
    begin function package pragma procedure subtype type use
    <identificateur> <identificateur entre guillemets> form
    current cursor

  8. #8
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IS w_resultat integer;
    declare
    var2: integer;
    begin
    ????????????????

    c'est du pl/sql, ca ?

    Bon..... Voici ton code corrigé
    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
     
    CREATE OR REPLACE FUNCTION chemin1 (var1 IN integer)
    RETURN integer
    IS 
      w_resultat integer;
      var2 integer;
    begin
      var2 := var1;
     
      WHILE (var2 != 100) LOOP
     
        SELECT chemin(var1) INTO w_resultat FROM dual;
     
        DBMS_OUTPUT.PUT_LINE(w_resultat);
     
        SELECT 
          donne_sur INTO var2 
        FROM 
          issue
        WHERE 
          num_issue = chemin(var2);
     
      END LOOP;
     
      RETURN w_resultat;
     
    end;
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 62
    Par défaut
    Désolé, je connais seulement l'ada comme langage de programmation ...

    En tout cas un grand merci à vous deux, ça fonctionne.

  10. #10
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Au vu de ton code posté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var1 := SELECT donne_sur FROM issue WHERE num_issue = chemin(var1);
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IS w_resultat integer;
    declare
    var2: integer;
    begin
    Je te conseilles fortement de prendre 2 minutes pour prendre le temps de lire quelques tutos de base sur le PL/SQL (=> Guide PL/SQL Oracle)
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 62
    Par défaut
    A vrai dire je l'ai déjà lu mais enfaite il n'y avait pas d'exemple de fonction comme je voulais faire, du coup j'étais un peu perdu ...

    Ps: Par contre si vous avez des livres ou des liens supplémentaires à me conseiller, surtout ceux qui illustrent par l'exemple, je suis preneur ...

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 62
    Par défaut
    Désolé, je vais encore vous ennuyer mais j'ai encore un petit soucis. J'utilise DBMS_OUTPUT.PUT_LINE ce qui est censé me permettre d'afficher certaines choses à l'écran si j'ai bien compris ?

    Car là rien ne s'affiche, enfaite je voudrais que sur l'écran s'affiche le "cheminement du programme" car enfaite mon programme doit me permettre d'afficher le chemin le plus court avec donc les différentes pièces à "traverser" et là je n'ai que le résultat final sans les étapes intermédiaires ...

  13. #13
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 27
    Par défaut Résultat d'une requête dans une variable
    Bonjour Cyph3r.

    As-tu utilisé la commande SET SERVEROUTPUT ON qui permet de rendre actives les fonctions du paquetage DBMS_OUTPUT ?

    Tu as un exemple dans le tuto -> Oracle PL/SQL - Le paquetage DBMS_OUTPUT

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 62
    Par défaut
    Non effectivement, c'était ça qui ne fonctionnait pas. Ca marche enfin !!! Par contre je suis obligé de lancer la requête SET SERVEROUTPUT ON à chaque ouverture de session mais bon après avoir chercher j'ai découvert que l'on ne pouvait pas intégrer cette requête dans un programme pl/sql. Dommage, mais bon en tout cas ça a le mérite de fonctionner ...

    Un grand grand merci à tlm pour votre aide

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

Discussions similaires

  1. Réutiliser des données d'une requête dans une requête
    Par mims1664 dans le forum Requêtes
    Réponses: 12
    Dernier message: 06/02/2009, 14h12
  2. Résultat d'un champ d'une requête dans une variable
    Par PsychedeChed dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 11/01/2009, 12h50
  3. Réponses: 4
    Dernier message: 02/07/2008, 11h32
  4. Réponses: 2
    Dernier message: 02/06/2006, 11h26
  5. Réponses: 4
    Dernier message: 01/12/2005, 14h36

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