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 :

[débutant]Order by dans un statement dans une fonction


Sujet :

Oracle

  1. #1
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut [débutant]Order by dans un statement dans une fonction
    Bonsoir,

    Un problème surement simplissime, mais comme je l'ai indiqué dans mon sujet, je suis loin prétendre être un connaisseur en SQL/oracle ... donc:
    -> j'ai besoin de faire un traitement particulier dans une petite fonction (du moins, il me semble), la fonction comprends une requête sur une vue et j'ai besoin de lui spécifier un 'order by' sur un champs particulier et c'est la que cela 'plante': il (oracle et la méchante grenouille de Toad) ne veut plus de mon SQL dès que je lui parle cet 'order by', ceci est impossible ? Pas de 'order by' a cet endroit ?
    Ci joint une copie de ce que serait la fonction, et a propos je suis ouvert a toute critique si des choses bizarres (en terme de logique, syntaxe) vous sautaient au yeux:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    CREATE OR REPLACE FUNCTION UneFonction (
       indicator1     IN   NUMBER
     , indicator2   IN   VARCHAR2
     , indicator3      IN   NUMBER
     , indicator4   IN   NUMBER
    )
       RETURN VARCHAR2
    IS
       l_result    VARCHAR (255);
       temp   VARCHAR (255);
       nada   NUMBER;
       n_col       NUMBER;
    BEGIN
       l_result := '';
       n_col := ind_column;
     
       DECLARE
          CURSOR cur
          IS
             (SELECT DISTINCT (CASE
                                  WHEN n_col = 1
                                     THEN a.result_field_x1
                                  WHEN n_col = 2
                                     THEN a.result_field_x2
                                  WHEN n_col = 3
                                     THEN a.result_field_x3
                                  WHEN n_col = 4
                                     THEN a.result_field_x4
                                  WHEN n_col = 5
                                     THEN a.result_field_x5
                                  WHEN n_col = 6
                                     THEN a.result_field_x6
                                  WHEN n_col = 7
                                     THEN a.result_field_x7
                                  WHEN n_col = 8
                                     THEN a.result_field_x8
                                  WHEN n_col = 9
                                     THEN a.result_field_x9
                                  WHEN n_col = 10
                                     THEN a.result_field_x10
                               END
                              ) result_strings
                         , a.numeric_field
              	    FROM A_View a
                        WHERE a.Field1 = indicator1 AND a.Field2 = indicator2 AND a.Field3 = indicator3
                        order by a.numeric_field);
       BEGIN
          OPEN cur;
     
          LOOP
             FETCH cur
              INTO temp_name, nada;
     
             l_result := l_result || CHR (13) || temp;
             EXIT WHEN cur%NOTFOUND;
          END LOOP;
     
          CLOSE cur;
       END;
     
       IF l_result = ''
       THEN
          l_result := ' - ';
       END IF;
     
       RETURN l_result;
    END;
    /
    Voili, voilou ... merci par avance pour vos conseils.
    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  2. #2
    Rédactrice

    Avatar de Fleur-Anne.Blain
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 637
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 637
    Points : 6 805
    Points
    6 805
    Par défaut
    Quel est ton erreur s'il te plait???
    la culture c'est comme la confiture moins on en a plus on l'étale.

    Mes tutos

  3. #3
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    Hé bien, Toad me sort ceci:
    ERROR line 46, col 21, ending_line 46, ending_col 25, Found 'order', Expecting: @ string or ( or % . [ or (+) AT DAY YEAR or ** MULTISET or * / MOD REM or + - || or AND or OR or CONNECT GROUP HAVING MODEL START or INTERSECT MINUS UNION or )
    --précédé de:
    [error]Syntax check
    J'avoue que je ne comprends pas ce qu'il attends avant ou a la place de mon 'order by' ...

    Merci d'avance
    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    essaye sous SQL*Plus, tu devrais pouvoir débugger comme un grand après

    Edit : c'est quoi ce BEGIN... DECLARE... BEGIN... tu peux pas mettre ton curseur dans la partie déclarative de la fonction ? Et puis il sort d'où le ind_column ?

  5. #5
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    Oui, sorry, ind_column = indicator4, je n'avais pas changé et mis le bon nom avant de poster, désolé...
    Je vais essayer de changer le reste, ok, (begin, etc...), j'ai bien fait de mettre [débutant], nan ?
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Ca aurait été encore mieux de poster dans le forum Débuter

  7. #7
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,
    Même pas eu le temps de marquer comme 'Résolu', dsl.
    Donc, deux - trois choses avaient changé, je passe par un 'Type' afin de sortir 10 valeurs de la fonction, le SQL a donc changé et je n'ai plus le soucis initial.
    Cela donne qqchose de ce genre:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    CREATE OR REPLACE FUNCTION UneFonction (UnParam IN NUMBER)
       RETURN UnType
    IS
       l_result          UnType;
       v_result_1    VARCHAR2 (255);
       v_result_2    VARCHAR2 (255);
       v_result_3    VARCHAR2 (255);
       v_result_4    VARCHAR2 (255);
       v_result_5    VARCHAR2 (255);
       v_result_6    VARCHAR2 (255);
       v_result_7    VARCHAR2 (255);
       v_result_8    VARCHAR2 (255);
       v_result_9    VARCHAR2 (255);
       v_result_10   VARCHAR2 (255);
    BEGIN
       FOR my_cur IN (SELECT   a.field1, a.field2
                             , MIN (a.field3) cur_result_1/*le traitement sur les champs est en réalité plus complexe, mais pas utile de détailler */
                             , MIN (a.field4) cur_result_2
                             , MIN (a.field5) cur_result_3
                             , MIN (a.field6) cur_result_4
                             , MIN (a.field7) cur_result_5
                             , MIN (a.field8) cur_result_6
                             , MIN (a.field9) cur_result_7
                             , MIN (a.field10) cur_result_8
                             , MIN (a.field11) cur_result_9
                             , MIN (a.field12) cur_result_10
                          FROM (SELECT aa.field1, aa.field2 --, etc, autres champs
                                  FROM UneVue aa
                                 WHERE aa.field1 = UnParam
                                   /*autres conditions et traitements...
                                   
                                   */) a
                      GROUP BY a.field1, a.field2
                      ORDER BY a.field2)
       LOOP
          IF my_cur.field2 = 0
          THEN
             v_result_1 := my_cur.cur_result_1;
             v_result_2 := my_cur.cur_result_2;
             v_result_3 := my_cur.cur_result_3;
             v_result_4 := my_cur.cur_result_4;
             v_result_5 := my_cur.cur_result_5;
             v_result_6 := my_cur.cur_result_6;
             v_result_7 := my_cur.cur_result_7;
             v_result_8 := my_cur.cur_result_8;
             v_result_9 := my_cur.cur_result_9;
             v_result_10 := my_cur.cur_result_10;
          ELSE
             v_result_1 := v_result_1 || CHR (13) || CHR (10) || my_cur.cur_result_1;
             v_result_2 := v_result_2 || CHR (13) || CHR (10) || my_cur.cur_result_2;
             v_result_3 := v_result_3 || CHR (13) || CHR (10) || my_cur.cur_result_3;
             v_result_4 := v_result_4 || CHR (13) || CHR (10) || my_cur.cur_result_4;
             v_result_5 := v_result_5 || CHR (13) || CHR (10) || my_cur.cur_result_5;
             v_result_6 := v_result_6 || CHR (13) || CHR (10) || my_cur.cur_result_6;
             v_result_7 := v_result_7 || CHR (13) || CHR (10) || my_cur.cur_result_7;
             v_result_8 := v_result_8 || CHR (13) || CHR (10) || my_cur.cur_result_8;
             v_result_9 := v_result_9 || CHR (13) || CHR (10) || my_cur.cur_result_9;
             v_result_10 := v_result_10 || CHR (13) || CHR (10) || my_cur.cur_result_10;
          END IF;
       END LOOP;
     
       l_result :=
          UnType (v_result_1
                             , v_result_2
                             , v_result_3
                             , v_result_4
                             , v_result_5
                             , v_result_6
                             , v_result_7
                             , v_result_8
                             , v_result_9
                             , v_result_10
                              );
       RETURN l_result;
    END;
    /
    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/05/2007, 14h05
  2. Réponses: 4
    Dernier message: 19/05/2006, 10h26
  3. Réponses: 3
    Dernier message: 09/03/2006, 15h12
  4. Réponses: 8
    Dernier message: 14/11/2005, 11h27
  5. Pause dans l'exécution d'une fonction
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/06/2005, 07h48

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