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 :

Problème exécution dbms_sql.execute_and_fetch()


Sujet :

PL/SQL Oracle

  1. #1
    fda
    fda est déconnecté
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 32
    Par défaut Problème exécution dbms_sql.execute_and_fetch()
    Bonjour

    Lorsque je passe par le package dbms_sql.execute_and_fetch il me retourne 0 enregistrement alors que si j'éxécute la requête SQL dans un client SQL*Plus
    il me retourne 10 enregistrements

    Que se passe t'il ?

    Avez-vous une idée ?

    Merci d'avance
    Frédéric

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Aucune idée. Surtout si vous fournissez aussi peu d'info que cela. Nous ne sommes pas devin.

  3. #3
    fda
    fda est déconnecté
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 32
    Par défaut suite
    WREQUETE := requete_SQL;

    cur_donnee := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(cur_donnee, WREQUETE, DBMS_SQL.NATIVE);
    DBMS_SQL.DEFINE_COLUMN(cur_donnee, 1, vl_nomtable, 81);
    DBMS_SQL.DEFINE_COLUMN(cur_donnee, 2, vl_nomtablespace, 81);

    NbLigne := DBMS_SQL.EXECUTE_AND_FETCH(cur_donnee);
    LOOP
    EXIT WHEN NbLigne = 0;

    Il sort direct car il me retourne 0

    Si j'éxecute la même REQUETE (= requete_SQL) dans SQL*Plus il me retourne 10 enregistrements

    !!!!

  4. #4
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Oui, mais on ne voit toujours pas le contenu de votre requête. Pouvez-vous faire le test sur une table bidon qui vous autoriserait à montrer votre code ?

  5. #5
    fda
    fda est déconnecté
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 32
    Par défaut REQUETE
    SELECT SEGMENT_NAME TABLE_NAME, TABLESPACE_NAME FROM USER_SEGMENTS WHERE SEGMENT_TYPE = ''TABLE'' AND TABLESPACE_NAME IN ' || vl_LISTE_TABLESPACE || vl_CONDITION_SQL || ' ORDER BY TABLESPACE_NAME, SEGMENT_NAME';

    J'attaque la table USER_SEGMENTS pour lister des tables

  6. #6
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND TABLESPACE_NAME IN ' || vl_LISTE_TABLESPACE || vl_CONDITION_SQL || '
    et ceci, en vrai, ça donne quoi ?

  7. #7
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Pour éviter la longue liste des allers-retours, je vous conseille de mettre votre ordre SQL dans une variable, et de la sortir dans une table,afin de pouvoir la jouer "telle quelle" sous Sql*Plus
    Vous comprendrez alors très vite d'ou vient l'erreur.

  8. #8
    fda
    fda est déconnecté
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 32
    Par défaut Requête exacte
    voici la requête qui tourne

    SELECT SEGMENT_NAME TABLE_NAME, TABLESPACE_NAME
    FROM USER_SEGMENTS WHERE SEGMENT_TYPE = 'TABLE'
    AND TABLESPACE_NAME IN ('RM_PS_DAT')
    AND SEGMENT_NAME < 'PSLP%'
    ORDER BY TABLESPACE_NAME, SEGMENT_NAME

    avec un EXECUTE IMMEDIATE cela fonctionne !!!!!!!!!!

  9. #9
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Inspirez-vous de ceci:

    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
    CREATE OR REPLACE PACKAGE PKG_DYNAMIC IS
     
      -------------------------------------------------------------
      --  Sample package to test the 100%dynamic Forms features  --
      --                                                         --
      --  Author : Francois Degrelle                             --
      --                                                         --    
      -------------------------------------------------------------
     
      TYPE T1 IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER ;
      TYPE T2 IS TABLE OF T1 INDEX BY BINARY_INTEGER ;
      --TYPE TYP_COLS  IS TABLE OF DYN_COLS%ROWTYPE INDEX BY PLS_INTEGER ;
     
      -- Get datas and data structure for any select order --
      PROCEDURE dynamic_cursor
      (
         PC$Query IN  VARCHAR2,
         PT$Cols  OUT NOCOPY T2,
         PT$rows  OUT NOCOPY T2,
         PC$Where IN  VARCHAR2 DEFAULT NULL
      ) ;
     
      -- Get data structure for any select order --
      PROCEDURE Get_Struct
      (
         PC$Query IN  VARCHAR2,
         PT$Cols  OUT NOCOPY T2
      ) ;  
     
     
     
    END PKG_DYNAMIC ;
    /
    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
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
     
    CREATE OR REPLACE PACKAGE BODY PKG_DYNAMIC IS
     
      -------------------------------------------------------------
      --  Sample package to test the 100%dynamic Forms features  --
      --                                                         --
      --  Author : Francois Degrelle                             --
      --                                                         --    
      -------------------------------------------------------------
     
      ----------------------------------------------------------
      --  Get Datas and data structure from any select Order  --
      ----------------------------------------------------------
      PROCEDURE dynamic_cursor
      (
         PC$Query IN  VARCHAR2,
         PT$Cols  OUT NOCOPY T2,
         PT$rows  OUT NOCOPY T2,
         PC$Where IN  VARCHAR2 DEFAULT NULL     
      )
      IS
      c           NUMBER;
      d           NUMBER;
      col_cnt     PLS_INTEGER;
      rec_tab     DBMS_SQL.DESC_TAB;
      col_num     NUMBER;
     
      LN$Lig      PLS_INTEGER := 0 ;
      LN$MaxCol   PLS_INTEGER := 0 ;
     
      LC$Query    VARCHAR2(4000) := PC$Query ;
     
      v           VARCHAR2(4000) ;
      t           T1 ;
     
      source_cursor      INTEGER;
      result             INTEGER;
     
      BEGIN
     
        -- retrieve the columns of the query --
        c := DBMS_SQL.OPEN_CURSOR;
     
        DBMS_SQL.PARSE(c, LC$Query , dbms_sql.NATIVE);
     
        d := DBMS_SQL.EXECUTE(c);
     
        DBMS_SQL.DESCRIBE_COLUMNS(c, col_cnt, rec_tab);
     
     
        LN$MaxCol := rec_tab.LAST ;
     
        FOR i IN rec_tab.FIRST .. rec_tab.LAST LOOP
     
          PT$Cols(i)(1) := rec_tab(i).col_name ;      -- name
          PT$Cols(i)(2) := rec_tab(i).col_type ;      -- type
          PT$Cols(i)(3) := rec_tab(i).col_precision ; -- precision
          PT$Cols(i)(4) := rec_tab(i).col_scale ;     -- scale
          PT$Cols(i)(5) := rec_tab(i).col_max_len ;   -- length
     
        END LOOP ;
     
        DBMS_SQL.CLOSE_CURSOR(c);
     
     
        -- Prepare a cursor to select from the source table: --
        source_cursor := DBMS_SQL.OPEN_CURSOR;
     
        -- Where clause ? --
        IF PC$Where IS NOT NULL THEN
           LC$Query := PC$Query || PC$Where ;
        END IF ;
     
        DBMS_SQL.PARSE(source_cursor,  LC$Query, dbms_sql.NATIVE);
     
     
        -- Define the columns --
        FOR i IN 1 .. LN$MaxCol LOOP
          DBMS_SQL.DEFINE_COLUMN(source_cursor, i, v,4000);
        END LOOP ;
     
     
        result := DBMS_SQL.EXECUTE(source_cursor);
     
     
        -- Fetch the rows from the source query  --
        LOOP
          IF DBMS_SQL.FETCH_ROWS(source_cursor)>0 THEN
            -- get column values of the row --
            LN$Lig := LN$Lig + 1 ;
            FOR i IN 1.. LN$MaxCol LOOP
              DBMS_SQL.COLUMN_VALUE(source_cursor, i, t(i));
              DBMS_OUTPUT.PUT_LINE(t(i));
              PT$rows(LN$Lig)(i) := t(i) ;
            END LOOP ;
     
          ELSE
            -- No more rows --
            EXIT;
          END IF;
        END LOOP;
     
     
        DBMS_SQL.CLOSE_CURSOR(source_cursor);
     
     
      EXCEPTION
        WHEN OTHERS THEN
     
          IF DBMS_SQL.IS_OPEN(source_cursor) THEN
             DBMS_SQL.CLOSE_CURSOR(source_cursor);
          END IF;
     
          RAISE;
     
      END;
     
     
      -----------------------------------------------
      --  Get data structure for any select order  --
      -----------------------------------------------
      PROCEDURE Get_Struct
      (
         PC$Query IN  VARCHAR2,
         PT$Cols  OUT NOCOPY T2
      )
      IS
      c           NUMBER;
      d           NUMBER;
      col_cnt     PLS_INTEGER;
      rec_tab     DBMS_SQL.DESC_TAB;
      col_num     NUMBER;
     
      LN$Lig      PLS_INTEGER := 0 ;
      LN$MaxCol   PLS_INTEGER := 0 ;
     
      v           VARCHAR2(4000) ;
      t           T1 ;
     
      result             INTEGER;
     
      BEGIN
     
        -- retrieve the columns of the query --
        c := DBMS_SQL.OPEN_CURSOR;
     
        DBMS_SQL.PARSE(c, PC$Query , dbms_sql.NATIVE);
     
        d := DBMS_SQL.EXECUTE(c);
     
        DBMS_SQL.DESCRIBE_COLUMNS(c, col_cnt, rec_tab);
     
     
        LN$MaxCol := rec_tab.LAST ;
     
        FOR i IN rec_tab.FIRST .. rec_tab.LAST LOOP
     
          PT$Cols(i)(1) := rec_tab(i).col_name ;      -- name
          PT$Cols(i)(2) := rec_tab(i).col_type ;      -- type
          PT$Cols(i)(3) := rec_tab(i).col_precision ; -- precision
          PT$Cols(i)(4) := rec_tab(i).col_scale ;     -- scale
          PT$Cols(i)(5) := rec_tab(i).col_max_len ;   -- length
     
        END LOOP ;
     
        DBMS_SQL.CLOSE_CURSOR(c);
     
     
      EXCEPTION
        WHEN OTHERS THEN
     
          IF DBMS_SQL.IS_OPEN(c) THEN
             DBMS_SQL.CLOSE_CURSOR(c);
          END IF;
     
          RAISE;
     
      END Get_Struct;
     
     
     
    END PKG_DYNAMIC ;
    /
    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
     
    Connecté à :
    Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.5.0 - Production
     
    SQL> set serveroutput on
    SQL> 
    SQL> DECLARE 
      2    LC$Query VARCHAR2(4000) := 'SELECT SEGMENT_NAME TABLE_NAME, TABLESPACE_NAME '
      3                   || 'FROM USER_SEGMENTS WHERE SEGMENT_TYPE = ''TABLE'' '
      4                   || 'AND ROWNUM < 5 '     
      5       || 'ORDER BY TABLESPACE_NAME, SEGMENT_NAME ';
      6    t1 PKG_DYNAMIC.T2 ;
      7    t2 PKG_DYNAMIC.T2 ;        
      8  BEGIN
      9    PKG_DYNAMIC.dynamic_cursor
     10    (
     11       LC$Query,
     12       t1,
     13       t2  
     14    );
     15  END;  
     16  
     17  
     18  /
    DIFFUSIONS
    ATENA_DATA
    FICHES_EMISSION_PRODUITS
    ATENA_DATA
    GENERIQUES
    ATENA_DATA
    PRODUCTEURS
    ATENA_DATA
     
    Procédure PL/SQL terminée avec succès.
     
    SQL>

Discussions similaires

  1. [SQL] Problème exécution sql pour insertion fichier csv
    Par Kyvin dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/08/2006, 17h47
  2. [C#] Problème exécution Framework 2.0
    Par Tips dans le forum Windows Forms
    Réponses: 6
    Dernier message: 19/07/2006, 10h17
  3. [PHP-JS] Problème exécution fonction php avec js
    Par cokilulu dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/03/2006, 21h34
  4. Réponses: 4
    Dernier message: 09/12/2005, 22h17
  5. [VB.NET] Problème exécution en mode release.
    Par leSeb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/01/2005, 17h39

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