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 :

Fonction qui ne fonctionne pas


Sujet :

PL/SQL Oracle

  1. #1
    Membre actif
    Homme Profil pro
    DBA - Développeur BI
    Inscrit en
    Avril 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : DBA - Développeur BI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2003
    Messages : 442
    Points : 283
    Points
    283
    Par défaut Fonction qui ne fonctionne pas
    Bonjour,
    Je veux créer une fonction toute bête qui ne demande pas de paramêtre en entrée et qui me retourne une série de chiffre en type varchar2 en sortie. Mais seulement voila elle ne fonctionne pas et je ne sais pas pourquoi.
    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
    return varchar2 is
      wSociete varchar2(2);
    begin
     
    wSociete:='';
    SELECT DISTINCT 
    bogroupe.u##corg
     INTO wSociete
    FROM bogroupe
    GROUP BY bogroupe.u##corg;
    return (wSociete);
     
    exception
      when no_data_found then return(wSociete);
     
      when others then return('Oups');
     
    end Logi_num_soc_bo;
    ou est l'erreur car elle me retourne tout le temps "Oups". Le même code éxécuté sur SQL Plus worksheet fonctionne alors qu'est qui y a que j'ai pas fait?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Évidemment, si tu interceptes l'erreur, tu n'auras jamais le message d'erreur qui est fort instructif...
    Retire le when other et lis le message d'erreur.
    Ça devrait t'aider à comprendre ton erreur.

  3. #3
    Membre actif
    Homme Profil pro
    DBA - Développeur BI
    Inscrit en
    Avril 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : DBA - Développeur BI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2003
    Messages : 442
    Points : 283
    Points
    283
    Par défaut
    voici le message mais j'ai bien peur qu'il ne parle pas plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select Logi_num_soc_bo from dual
           *
    ERREUR à la ligne 1 :
    ORA-01422: exact fetch returns more than requested number of rows
    ORA-06512: at "BO.LOGI_NUM_SOC_BO", line 6

  4. #4
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select Logi_num_soc_bo from dual
           *
    ERREUR à la ligne 1 :
    ORA-01422: exact fetch returns more than requested number of rows
    ORA-06512: at "BO.LOGI_NUM_SOC_BO", line 6
    Tu essaies de copier plusieurs enregistrements dans un varchar2 et ça, il ne peut pas !

    Regarde plutôt ce genre de type : http://sheikyerbouti.developpez.com/pl_sql/?page=Chap5

  5. #5
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    L'erreur est dans ton select. Execute ton select dans un environement SQL pour voir ce que tu as comme reponse. C'est probablement le nombre de lignes, comme l'a mentionné Jerome_Mtl, que te retourne le select qui pose un problème.

    a+++++
    "Celui qui reconnaît consciemment ses limites est le plus proche de la perfection." Johann Wolfgang

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par Herlece Voir le message
    voici le message mais j'ai bien peur qu'il ne parle pas plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select Logi_num_soc_bo from dual
           *
    ERREUR à la ligne 1 :
    ORA-01422: exact fetch returns more than requested number of rows
    ORA-06512: at "BO.LOGI_NUM_SOC_BO", line 6
    Pourtant ce message est très explicite.

    Un 'select into' ne fonctionne que si une et une seule ligne de résultat est retournée.

    Ors ton select ramène plusieurs lignes...

    Donc :

    * soit tu n'aurais du avoir qu'une seule valeur retournée et donc les données de ta table ne sont pas cohérentes
    * soit il faut que tu déclares un curseur et que tu fetches en agrégeant les valeurs dans ton varchar2 à chaque loop. Et dans ce cas, déclarer un varchar de 2 caractères, c'est pas top...
    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
    Homme Profil pro
    DBA - Développeur BI
    Inscrit en
    Avril 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : DBA - Développeur BI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2003
    Messages : 442
    Points : 283
    Points
    283
    Par défaut
    ok merci beaucoup,

    je fais sa demain mais en effet ma requête doit me retourner plusieurs lignes d'ou le distinct car se sont des numéros (id d'entreprise) 01,02,03 etc.

    Mais une question on ne peut pas faire comme sur SQL Server créer une requête et s'en servir ensuite si on a besoin. Car j'avoue Oracle je ne connai vraiment pas.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Herlece Voir le message
    je fais ça demain mais, en effet, ma requête doit me retourner plusieurs lignes d'où le distinct car ceux sont des numéros (id d'entreprise) 01,02,03 etc.
    ton DISTINCT retire les doublons mais si tu as plusieurs valeurs distinctes, tu resteras avec plusieurs enregistrements à la sortie.

    Et mettre un DISTINCT avec un GROUP By , c'est ceinture et bretelle !

    Citation Envoyé par Herlece Voir le message
    Mais une question on ne peut pas faire comme sur SQL Server créer une requête et s'en servir ensuite si on a besoin. Car j'avoue Oracle je ne connais vraiment pas.
    Eh non !

  9. #9
    Membre actif
    Homme Profil pro
    DBA - Développeur BI
    Inscrit en
    Avril 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : DBA - Développeur BI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2003
    Messages : 442
    Points : 283
    Points
    283
    Par défaut
    Eh MM..erci
    bon je suis bon pour rouvrir mon bouquin de PL/SQL

  10. #10
    Membre actif
    Homme Profil pro
    DBA - Développeur BI
    Inscrit en
    Avril 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : DBA - Développeur BI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2003
    Messages : 442
    Points : 283
    Points
    283
    Par défaut
    Bon alors sa y est j'ai créer une proc stock pour remplir mon curseur mais je voudrai avoir l'avis d'un expert pour savoir si sa fonctionne et comment je peux tester sa.
    PROC STOCK:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (
     tab_tbl_lstSoc out mycursorSocity.table_tbl_lstSoc
    )
    is
    NumSociete varchar2(2);
    NomSociete varchar2(20);
    begin
     
    select distinct bogroupe.u##corg,bogroupe.lorg
    into NumSociete, NomSociete
    from bogroupe;
    end boapp_proc_numsociete;
    et le CURSEUR:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    is
     
     /*Curseur qui retourne le numéro de société unique ainsi que le nom de la société
    pour exploitation dans le formulare frmGestionDoc de l'appli BOApp*/
     
     
        type tbl_lstSoc is record
      ( Num_Societe bogroupe.u##corg%type,
        Nom_Societe bogroupe.lorg%type
        );
      type table_tbl_lstSoc is ref cursor return tbl_lstSoc;
     
      end mycursorSocity;
    c'est avec Oracle 9i. Alors c'est sans doute tout bête mais je ne sais pas le tester.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    J'ai pas trop compris ce que tu cherches à faire, ceci dit je suis peut être le seul.

    Pour info, les curseurs s'utilisent comme ç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
    17
    18
    19
     
    -- Section DECLARE
    -- Déclaration et définition du curseur 
    CURSOR moncurseur IS
    SELECT champs1, champs2 FROM Matable;
    -- Déclaration d'une variable pour recevoir un enregistrement du curseur
    enr_moncurseur	moncurseur%ROWTYPE;
     
    -- Section code, utilisation du curseur déclaré, on parcourt les enregistrements du curseur et on en affiche le champs1
    FOR enr_moncurseur 
    IN moncurseur 
    LOOP
       	   EXIT WHEN moncurseur%NOTFOUND;
    	   		IF (enr_moncurseur.champs1 IS NOT NULL) THEN
     
    			   	  DBMS_OUTPUT.PUT_LINE(enr_moncurseur.champs1);
     
    			END IF;
    END LOOP;
    N'oublie pas de consulter les tuto sur l'utilisation des curseurs.

  12. #12
    Membre actif
    Homme Profil pro
    DBA - Développeur BI
    Inscrit en
    Avril 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : DBA - Développeur BI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2003
    Messages : 442
    Points : 283
    Points
    283
    Par défaut
    Merci pour ces infos
    J'ai pas trop compris ce que tu cherches à faire, ceci dit je suis peut être le seul.
    Alors ce que je veux faire c'est récupérer des Numéro de société ainsi que le nom correspondant dans une table "bogroupe". J'en ai besoin pour une appli que je suis en train de développer.

    CURSOR moncurseur IS
    SELECT champs1, champs2 FROM Matable;
    -- Déclaration d'une variable pour recevoir un enregistrement du curseur
    enr_moncurseur moncurseur%ROWTYPE;
    -- Section code, utilisation du curseur déclaré, on parcourt les enregistrements du curseur et on en affiche le champs1
    FOR enr_moncurseur
    IN moncurseur
    LOOP
    EXIT WHEN moncurseur%NOTFOUND;
    IF (enr_moncurseur.champs1 IS NOT NULL) THEN

    DBMS_OUTPUT.PUT_LINE(enr_moncurseur.champs1);

    END IF;
    END LOOP;
    cette instruction je le tape sur SQL Plus ou alors s'agit-il de la façon de créer un curseur. Je ne suis pas habitué à l'environnement de "Console Oracle Enterprise Manager". J'ai lu les tuto c'est d'ailleur grace à eux que j'ai pu écrire ces lignes mais je tatonne.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Admettons que ta table bogroupe contienne, entre autres, les champs numsociete et nomsociete.
    Le code suivant te listera les numéros et noms de tes sociétés :
    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
    SET SERVEROUTPUT ON SIZE 100000
     
    DECLARE
     
    	   -- Section DECLARE
    	   -- Déclaration et définition du curseur 
    	   CURSOR moncurseur IS
    	   SELECT DISTINCT numsociete, nomsociete FROM bogroupe
    	   ORDER BY numsociete;
     
    	   -- Déclaration d'une variable pour recevoir un enregistrement du curseur
    	   enr_moncurseur	moncurseur%ROWTYPE;
     
     
    BEGIN
     
    	-- Section code, utilisation du curseur déclaré, on parcourt les enregistrements du curseur et on en affiche le champs1
    	FOR enr_moncurseur 
    	IN moncurseur 
    	LOOP
       	   EXIT WHEN moncurseur%NOTFOUND;
    	   		IF (enr_moncurseur.numsociete IS NOT NULL) THEN
     
    			   	  DBMS_OUTPUT.PUT_LINE(enr_moncurseur.numsociete || ' : ' || enr_moncurseur.numsociete);
     
    			END IF;
    	END LOOP;	
     
    END;
    /
    Et oui, tu peux le copier/coller directement dans SQL Plus, sans oublier le / final.

    Mais si c'est juste pour récupérer une liste, pourquoi un simple SELECT ne suffit pas?

  14. #14
    Membre actif
    Homme Profil pro
    DBA - Développeur BI
    Inscrit en
    Avril 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : DBA - Développeur BI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2003
    Messages : 442
    Points : 283
    Points
    283
    Par défaut
    Mais si c'est juste pour récupérer une liste, pourquoi un simple SELECT ne suffit pas?
    Je ne sais pas. Est-ce que depuis mon appli je peux comme avec SQL Server envoyé un select et le récupérer dans mon datareader car si c'est possible je le fais de ce pas.

  15. #15
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    Ton application tu la developpes dans quel langage, .NET?

    Citation Envoyé par Herlece Voir le message
    Je ne sais pas. Est-ce que depuis mon appli je peux comme avec SQL Server envoyé un select et le récupérer dans mon datareader car si c'est possible je le fais de ce pas.
    Oui tu peux: soit tu fais un simple "select" depuis ton application et tu parcours avec le langage de developpement que tu utilises pour faire des tests, soit tu le fais dans une fonction pl/sql (avec un curseur) et tu retournes uniquement le resultat à ton application.

    C'est à toi de voir.
    "Celui qui reconnaît consciemment ses limites est le plus proche de la perfection." Johann Wolfgang

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Citation Envoyé par Herlece Voir le message
    Je ne sais pas. Est-ce que depuis mon appli je peux comme avec SQL Server envoyé un select et le récupérer dans mon datareader car si c'est possible je le fais de ce pas.
    En effet, savoir en quel langage tu développes pourrait aider.

  17. #17
    Membre actif
    Homme Profil pro
    DBA - Développeur BI
    Inscrit en
    Avril 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : DBA - Développeur BI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2003
    Messages : 442
    Points : 283
    Points
    283
    Par défaut
    Je développe en C# avec Visual Studio 2005

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Dans ce cas, ça se passe plutôt par ici : http://www.developpez.net/forums/f484/dotnet/csharp/

    Je ne connais pas c#, j'ai regardé brièvement ce tutoriel http://tahe.developpez.com/dotnet/csharp/ , et tu trouveras peut être ce qu'il te faut à partir de la page 223.

  19. #19
    Membre actif
    Homme Profil pro
    DBA - Développeur BI
    Inscrit en
    Avril 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : DBA - Développeur BI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2003
    Messages : 442
    Points : 283
    Points
    283
    Par défaut
    Merci bien a tous

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

Discussions similaires

  1. [AJAX] fonction qui ne fonctionne pas
    Par caro71ol dans le forum AJAX
    Réponses: 19
    Dernier message: 07/02/2011, 08h34
  2. fonction qui ne fonctionne pas sous firefox
    Par megavolte dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/10/2009, 23h48
  3. Réponses: 26
    Dernier message: 20/07/2007, 10h29
  4. [javascript]fonction qui ne fonctionne pas(concernant div)
    Par ranell dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 19/04/2007, 17h38
  5. [Javascript] Fonction qui ne fonctionne pas sous Opera et Safari
    Par frechy dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/02/2007, 10h04

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