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 :

PL/SQL Parcours Colonnes Curseur


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 20
    Points : 13
    Points
    13
    Par défaut PL/SQL Parcours Colonnes Curseur
    Bonjour à tous,

    Mon besoin parait simple : j'aimerais parcourir un select dont je ne connais pas la structure. La question a été posée plusieurs fois sur différents forums / sites mais je ne trouve pas mon "bonheur" dans les différentes réponses que j'ai lues.

    Une mise en pratique concrète (ca sera aussi mon besoin final) : j'ai une table dans laquelle je stocke des select dans des clob. Je souhaite récupérer le résultat de la requête et le stocker dans une autre colonne de la table.

    Très facile lorsque l'on connait le typage du résultat à l'avance (un bête count(*) par ex) : execute immediate into une variable et update sur la ligne en cours.

    Ca se complique lorsque le select prend pluseurs valeurs, il faudrait savoir interpréter le rowtype et construire une variable de sortie en fonction. C'est là ou je coince.

    Y-a-t'il un package Oracle permettant de répondre à mon besoin ?

    Merci d'avance,

    Pop

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Arf, j'aurais du chercher plus.
    Le package dbms_sql sait y répondre (exemple 8).

    http://download.oracle.com/docs/cd/B...ql.htm#i996870

    Désolé pour le dérangement

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Des fois que ca serve à quelqu'un, voici mon petit bout de code

    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
    function execute_request(aSql in clob) return clob is
      myCur  number := dbms_sql.open_cursor;
      myClob clob := null;
      myStr  varchar2(1000);
      myLong number;
      myDate date;
      myTab  dbms_sql.desc_tab;
      myCnt  number;
    begin
     
      --Init
      dbms_sql.parse(myCur, aSql, dbms_sql.native);
      dbms_sql.describe_columns(myCur, myCnt, myTab);
      myLong := dbms_sql.execute(myCur);
     
      --Cast Columns
      for j in 1 .. myCnt loop
        case myTab(j).col_type
          when 1 then
            dbms_sql.define_column(myCur, j, myStr, myTab(j).col_max_len); --String
          when 2 then
            dbms_sql.define_column(myCur, j, myLong); --Number
          when 3 then
            dbms_sql.define_column(myCur, j, myDate); --Date
        end case; end loop;
     
      --Title
      for j in 1 .. myCnt loop
        myClob := myClob || rpad(myTab(j).col_name, myTab(j).col_max_len, ' ') || '|';
      end loop;
      myClob := myClob || Chr(13);
      for j in 1 .. myCnt loop
        myClob := myClob || rpad('-', myTab(j).col_max_len, '-') || '|';
      end loop;
      myClob := myClob || Chr(13);
     
      --Data
      loop
        myLong := dbms_sql.fetch_rows(myCur);
        exit when myLong = 0;
        for j in 1 .. myCnt loop
          case myTab(j).col_type
            when 1 then
              dbms_sql.column_value(myCur, j, myStr);
            when 2 then
              dbms_sql.column_value(myCur, j, myLong);
              myStr := to_char(myLong);
            when 3 then
              dbms_sql.column_value(myCur, j, myDate);
              myStr := to_char(myDate, 'DD/MM/YYYY');
          end case;
          myStr  := nvl(myStr, '(null)');
          myClob := myClob || rpad(myStr, myTab(j).col_max_len) || '|';
        end loop;
        myClob := myClob || Chr(13);
      end loop;
      dbms_sql.close_cursor(myCur);
      return myClob;
     
    end execute_request;

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

Discussions similaires

  1. [VBA-E] parcours colonne à l'infini
    Par Yaone dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/05/2006, 21h37
  2. [PL/SQL] Parcours des enregistrements contenus dans 1 curso
    Par lapartdombre dans le forum Oracle
    Réponses: 6
    Dernier message: 01/12/2005, 13h50
  3. [PL/SQL] parcours de curseur
    Par NPortmann dans le forum Oracle
    Réponses: 20
    Dernier message: 20/05/2005, 21h51
  4. Réponses: 5
    Dernier message: 23/02/2005, 09h43
  5. [PL/SQL] SQL Dynamique et curseur
    Par Loko dans le forum Oracle
    Réponses: 10
    Dernier message: 23/11/2004, 16h18

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