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 :

les curseurs en plsql et requete dynamique


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 360
    Par défaut les curseurs en plsql et requete dynamique
    Bonjour, je suis un debutant pl sql
    je veux declarer un curseur avec une requete select et un where composé des input de ma fonction.
    le code suivant illustre l'exemple :
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    FUNCTION    FDG_CLIENT_CAFF (
       datedebut      IN   VARCHAR2,
       datefin             VARCHAR2,
       fonds          IN   VARCHAR2,
       entite         IN   VARCHAR2,
       portefeuille   IN   VARCHAR2,
       compteespece   IN   VARCHAR2
    )
       RETURN VARCHAR2
    IS
       fond                 VARCHAR2 (15);
       datevl               DATE;
       code_entite          VARCHAR2 (15);
       code_portefeuille    VARCHAR2 (30);
       code_compte_espece   VARCHAR2 (30);
       nombre_part          NUMBER;
       fdg_client           NUMBER;
       actif_net            NUMBER;
       gestionnaire         VARCHAR2 (20);
       taux                 NUMBER;
       commission           NUMBER;
       xml_file             VARCHAR2 (4000);
       resultat             VARCHAR2 (100);
       str_taux             VARCHAR2 (10);
       str_entite           VARCHAR2 (10);
       condition            VARCHAR2 (200);
       requete              VARCHAR2 (2000);
     
       CURSOR cdata
         IS SELECT   a.date_vl, a.fonds, a.entite, 
                                                a.portefeuille, a.compte_espece,
                                                a.nbr_part, a.fdg, a.actif_net
                                                FROM tp.histo_fdg_client a where 1=1 || condition;
     
    BEGIN           
          if (datedebut is not null and length(datedebut) <> 0) then 
              condition := condition || ' AND a.date_vl >= TO_DATE( ' || datedebut || ' ,''dd/mm/yyyy'')';
          end if;
        /*  if (datefin is not null and length(datefin) <> 0) then 
              condition := condition || ' AND a.date_vl <= TO_DATE( ' || datefin || ' ,''dd/mm/yyyy'')';
          end if;   
          if (fonds is not null and length(fonds) <> 0) then 
              condition := condition || ' AND a.fonds =' || fonds;
          end if; 
          if (entite is not null and length(entite) <> 0) then 
              condition := condition || ' AND a.entite =' || entite;
          end if; 
          if (portefeuille is not null and length(portefeuille) <> 0) then 
              condition := condition || ' AND a.portefeuille =' || portefeuille;
          end if; 
          if (compteespece is not null and length(compteespece) <> 0) then 
              condition := condition || ' AND a.compte_espece =' || compteespece;
          end if; */
     
      -- requete := requete || condition;
     
       str_entite := REPLACE (entite, '''', '');
       xml_file := EXECUTE_QUERY (str_entite);
     
       IF (xml_file IS NULL OR LENGTH (xml_file) = 0)
       THEN
          RETURN 'Echec d''enregistrement, fichier XML inexistant !!';
       END IF;
     
       resultat := parser_fichier_xml (xml_file);
     
       IF (resultat IS NULL OR LENGTH (resultat) = 0)
       THEN
          RETURN 'Echec d''enregistrement, fichier XML erroné !!';
       END IF;
     
       -- extraction de taux et commission
       gestionnaire := SUBSTR (resultat, 0, INSTR (resultat, '#') - 1);
       str_taux := RTRIM (SUBSTR (resultat, INSTR (resultat, '#') + 1, LENGTH (resultat)));
       taux := TO_NUMBER (RTRIM (LTRIM (REPLACE (REPLACE (str_taux, '.', ','), CHR (10), ''))));
     
       OPEN cdata;
     
       LOOP
          FETCH cdata
           INTO datevl, fond, code_entite, code_portefeuille, code_compte_espece,
                nombre_part, fdg_client, actif_net;
     
          commission := fdg_client * taux;
     
          INSERT INTO tp.histo_fdg_client_ca
                      (date_vl, fonds, entite, portefeuille,
                       compte_espece, nbr_part, fdg, actif_net,
                       gestionnaire, taux, commission
                      )
               VALUES (datevl, fond, code_entite, code_portefeuille,
                       code_compte_espece, nombre_part, fdg_client, actif_net,
                       gestionnaire, REPLACE (taux, '.', ','), commission
                      );
     
          EXIT WHEN cdata%NOTFOUND;
       END LOOP;
     
       CLOSE cdata;
     
       COMMIT;
       RETURN 'Enregistrement effectué avec succé !!';
    EXCEPTION
       WHEN OTHERS
       THEN
          RETURN 'Echec d''enregistrement !!';
    END;
    le but est de remplir le curseur avec le résultat de la requête avec des where, mais il génère une exception lors de OPEN cdata;.

    OBJECTIFS : concaténer à la requête sélect de curseur un where construit apres begin !!!

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 360
    Par défaut
    Bonsoir;
    j'ai utilisé le curseur parametrique mais tjrs genere une exception.

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    FUNCTION    FDG_CLIENT_CAFF (
       datedebut      IN   VARCHAR2,
       datefin             VARCHAR2,
       fonds          IN   VARCHAR2,
       entite         IN   VARCHAR2,
       portefeuille   IN   VARCHAR2,
       compteespece   IN   VARCHAR2
    )
       RETURN VARCHAR2
    IS
       fond                 VARCHAR2 (15);
       datevl               DATE;
       code_entite          VARCHAR2 (15);
       code_portefeuille    VARCHAR2 (30);
       code_compte_espece   VARCHAR2 (30);
       nombre_part          NUMBER;
       fdg_client           NUMBER;
       actif_net            NUMBER;
       gestionnaire         VARCHAR2 (20);
       taux                 NUMBER;
       commission           NUMBER;
       xml_file             VARCHAR2 (4000);
       resultat             VARCHAR2 (100);
       str_taux             VARCHAR2 (10);
       str_entite           VARCHAR2 (10);
       condition            VARCHAR2 (200);
       formdate             VARCHAR2 (200) := 'dd/mm/yyyy';
     
       CURSOR cdata(www  varchar2)
         IS SELECT   a.date_vl, a.fonds, a.entite, 
                                                a.portefeuille, a.compte_espece,
                                                a.nbr_part, a.fdg, a.actif_net
                                                FROM tp.histo_fdg_client a where 1=1  
                                                || www;
     
    BEGIN           
          if (datedebut is not null) then 
              condition := condition || ' AND a.date_vl >= TO_DATE( ' || datedebut || ' ,''dd/mm/yyy'')';
          end if;
          if (datefin is not null) then 
              condition := condition || ' AND a.date_vl <= TO_DATE( ' || datefin || ' ,''dd/mm/yyyy'')';
          end if;   
          if (fonds is not null) then 
              condition := condition || ' AND a.fonds =' || fonds ;
          end if; 
          if (entite is not null) then 
              condition := condition || ' AND a.entite =' || entite;
          end if; 
          if (portefeuille is not null) then 
              condition := condition || ' AND a.portefeuille =' || portefeuille;
          end if; 
          if (compteespece is not null) then 
              condition := condition || ' AND a.compte_espece =' || compteespece;
          end if; 
     
       dbms_output.put_line(condition);
       str_entite := REPLACE (entite, '''', '');
       xml_file := EXECUTE_QUERY (str_entite);
     
       IF (xml_file IS NULL OR LENGTH (xml_file) = 0)
       THEN
          RETURN 'Echec d''enregistrement, fichier XML inexistant !!';
       END IF;
     
       resultat := parser_fichier_xml (xml_file);
     
       IF (resultat IS NULL OR LENGTH (resultat) = 0)
       THEN
          RETURN 'Echec d''enregistrement, fichier XML erroné !!';
       END IF;
     
       -- extraction de taux et commission
       gestionnaire := SUBSTR (resultat, 0, INSTR (resultat, '#') - 1);
       str_taux := RTRIM (SUBSTR (resultat, INSTR (resultat, '#') + 1, LENGTH (resultat)));
       taux := TO_NUMBER (RTRIM (LTRIM (REPLACE (REPLACE (str_taux, '.', ','), CHR (10), ''))));
     
      -- condition := REPLACE(condition,'''',' ');
       OPEN cdata(condition);
     
       LOOP
          FETCH cdata
           INTO datevl, fond, code_entite, code_portefeuille, code_compte_espece,
                nombre_part, fdg_client, actif_net;
     
          commission := fdg_client * taux;
     
          INSERT INTO tp.histo_fdg_client_ca
                      (date_vl, fonds, entite, portefeuille,
                       compte_espece, nbr_part, fdg, actif_net,
                       gestionnaire, taux, commission
                      )
               VALUES (datevl, fond, code_entite, code_portefeuille,
                       code_compte_espece, nombre_part, fdg_client, actif_net,
                       gestionnaire, REPLACE (taux, '.', ','), commission
                      );
     
          EXIT WHEN cdata%NOTFOUND;
       END LOOP;
     
       CLOSE cdata;
     
       COMMIT;
       RETURN 'Enregistrement effectué avec succé !!';
    EXCEPTION
       WHEN OTHERS
       THEN
          RETURN 'Echec d''enregistrement !!';
    END;
    y a t'il une solution assez vite !!!

    je pense que personne ne visite pas le forum de pl sql !!!!!!!!!!!!!!!!

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Lisez le tutoriel sur les SQL dynamiques. Il est toujours disponible.

  4. #4
    Invité
    Invité(e)
    Par défaut
    et si vous nous donniez l'erreur ?

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 360
    Par défaut
    Bonjour;
    Merci pour l'aide fourni, le problème est resolu

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

Discussions similaires

  1. probléme avec les curseurs explicites dynamiques
    Par madina dans le forum PL/SQL
    Réponses: 3
    Dernier message: 06/08/2010, 13h45
  2. plsql refacotiser les curseurs?
    Par elekis dans le forum PL/SQL
    Réponses: 14
    Dernier message: 28/05/2009, 09h49
  3. Réponses: 2
    Dernier message: 01/10/2007, 08h38
  4. [C#] Pb avec les curseurs
    Par White_Angel dans le forum Windows Forms
    Réponses: 5
    Dernier message: 16/01/2005, 10h56
  5. requete dynamique
    Par Tigresse dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/08/2003, 15h52

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