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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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 éclairé
    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
    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 éclairé 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
    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+++++

  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
    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 éclairé
    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
    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 éclairé
    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
    Par défaut
    Eh MM..erci
    bon je suis bon pour rouvrir mon bouquin de PL/SQL

  10. #10
    Membre éclairé
    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
    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 émérite
    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
    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.

+ 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