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 :

comment éviter de préciser toutes les colonnes quand elles se nomment colX où X = int


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 182
    Points : 66
    Points
    66
    Par défaut comment éviter de préciser toutes les colonnes quand elles se nomment colX où X = int
    J'ai un cursor c1 dont les champs sont TOTO1, TOTO2, TOTO3,..... TOTOX
    J'aurai aimé savoir si il y a moyen facilement de faire une boucle qui me permettrait de stocker grace à DBMS_OUTPUT.PUTLINE(c1.TOTO_) du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while i<=X
    loop
     DBMS_OUTPUT.PUTLINE(c1.TOTOi);
    end loop;
    J'ai cru comprend en lisant diverses choses, qu'il fallait créer un tableau mais je n'arrive pas à le faire ?
    Si quelqu'un pouvait me montrer un exemple concret et simple, ce serait super sympa.
    Merci d'avance.

  2. #2
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Merci d'indiquer un titre plus explicite !
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  3. #3
    Membre habitué Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Points : 191
    Points
    191
    Par défaut
    Il faudra surement que tu fasses du PL/SQL dynamique.
    Tu as des exemples dans le guide PL/SQL de SheikYerbouti il me semble.
    Pourquoi faire aujourd'hui ce que l'on peut faire demain ...

  4. #4
    Membre habitué Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Points : 191
    Points
    191
    Par défaut
    Reeur de ma part, ce n'est pas le "guide PL/SQL" mais "Le SQL Dynamique natif"

    http://sheikyerbouti.developpez.com/execute_immediate/
    Pourquoi faire aujourd'hui ce que l'on peut faire demain ...

  5. #5
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Vous pouvez aussi vous appuyer sur l'article suivant:
    http://sheikyerbouti.developpez.com/dynamic/dynamic.htm

    Récupérez les sources et consultez le package PKG_DYNAMIC, notament la procédure Get_Struct().
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    while i<=X
    loop
    DBMS_OUTPUT.PUTLINE(c1.TOTOi);
    end loop;
    utilise plutot le code suivant:
    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
     
    CURSOR C_curseur IS
    SELECT ...
    FROM ...
    WHERE ...
     
    V_curseur  C_curseur%TYPE (ou %RAWTYPE, je ne suis plus sur);
     
    BEGIN
    OPEN C_curseur
     
    Fetch C_curseur
    INTO V_curseur;
     
    While C_curseur%FOUND
       DBMS_OUTPUT.PUTLINE(V_curseur.variable);
    END;
    END;
    Attention, si le nombre de données est important, on peut exploser le buffer de la fonction DBMS_OUTPUT.PUTLINE. Ce buffer ne peut dépasser 1000 000 (byte? caractères?). Il faut mieux utiliser la fonction fnd_file.put_line.

    edit: désolé

  7. #7
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Merci d'éditer votre message pour rajouter les balises [ code ] qui améliorent de beaucoup la lisibilité ! ;-)

  8. #8
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par vlah79
    while i<=X
    utilise plutot le code suivant:

    CURSOR C_curseur IS
    SELECT ...
    FROM ...
    WHERE ...

    V_curseur C_curseur%TYPE (ou %RAWTYPE, je ne suis plus sur);

    BEGIN
    OPEN C_curseur

    Fetch C_curseur
    INTO V_curseur;

    While C_curseur%FOUND
    DBMS_OUTPUT.PUTLINE(V_curseur.variable);
    END;
    END;
    Attention, si le nombre de données est important, on peut exploser le buffer de la fonction DBMS_OUTPUT.PUTLINE. Ce buffer ne peut dépasser 1000 000 (byte? caractères?). Il faut mieux utiliser la fonction fnd_file.put_line.
    Je crois que Madlight demandait comment éviter de préciser toutes les colonnes quand elles se nomment colX où X est un entier.

    Par ailleurs avant de poster merci de vérifier votre code, afin de ne pas égarer la personne que vous aidez (ou les personnes qui liront le post à l'avenir) :
    1. Vous faites une boucle infinie.
    2. Je ne connais pas le package fnd_file, n'est-ce pas plutôt utl_file ? Dans ce cas, les conditions d'utilisation n'ont rien à voir avec DBMS_OUTPUT.
    3.
    Citation Envoyé par vlah79
    V_curseur C_curseur%TYPE (ou %RAWTYPE, je ne suis plus sur);
    C'est rowtype
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    1. Vous faites une boucle infinie.
    je pensais que la commande suivante me permettais de sortir de la boucle. Me suis je trompé?

    2. Je ne connais pas le package fnd_file, n'est-ce pas plutôt utl_file ? Dans ce cas, les conditions d'utilisation n'ont rien à voir avec DBMS_OUTPUT.
    la fonction DBMS_OUTPUT est, comme je le dis limité en taille et cela peut poser des problèmes lors d'extractions de données importante.

    la fonction utl_file ne fonctionne que dans les répertoires paramétrés dans Oracle (paramètre utl_file_dir). Surtout, il faut gérer l'ouverture et ka fermeture du fichier.


    La package fnd_file permet d'utiliser les fonction utl_file sur le fichier de sortie du traitement (sans gérer l'ourverture et la fermeture du fichier). ainsi, son utilisation en est facilité. La gestion du fichier de sortie se fait sans problème:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fnd_file.put_line(FND_FILE.OUTPUT,'cette ligne apparaitra dans le fichier OUT du traitement');
    fnd_file.put_line(FND_FILE.LOG 
    ,'cette ligne apparaitra dans le fichier LOG du traitement');

  10. #10
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par vlah79
    je pensais que la commande suivante me permettais de sortir de la boucle. Me suis je trompé?
    Il manque un fetch dans votre boucle while

    Citation Envoyé par vlah79
    La package fnd_file permet d'utiliser les fonction utl_file sur le fichier de sortie du traitement (sans gérer l'ourverture et la fermeture du fichier). ainsi, son utilisation en est facilité. La gestion du fichier de sortie se fait sans problème:
    A partir de quelle version? J'ai testé sur une 9i, j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ERROR at line 1:
    ORA-06550: line 2, column 21:
    PLS-00201: identifier 'FND_FILE.OUTPUT' must be declared
    ORA-06550: line 2, column 3:
    PL/SQL: Statement ignored
    De plus je ne le trouve dans aucune doc...

    [EDIT] Après quelques recherches sur le net, il semble qu'il s'agisse d'un package d'Oracle Appli. [/EDIT]
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Tout a fait, c'est un package d'Oracle.

    je ne sais pas si je puis le faire mais voici une partie du code source:

    déclaration

    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
    CREATE OR REPLACE package FND_FILE AUTHID CURRENT_USER as
    /* $Header: AFCPPIOS.pls 115.5 2002/02/08 19:51:59 nbhambha ship $ */
     
     
    LOG		constant number := 1;
    OUTPUT		constant number := 2;
     
    UTL_FILE_ERROR  exception;
     
    PRAGMA exception_init(UTL_FILE_ERROR, -20100);
     
    procedure PUT(WHICH in number, BUFF in varchar2);
     
    procedure PUT_LINE(WHICH in number, BUFF in varchar2);
     
    procedure NEW_LINE(WHICH in number, LINES in natural := 1);
     
    procedure PUT_NAMES(P_LOG in varchar2, P_OUT in varchar2, P_DIR in varchar2);
     
    procedure RELEASE_NAMES(P_LOG in varchar2, P_OUT in varchar2);
     
    procedure GET_NAMES(P_LOG in out varchar2, P_OUT in out varchar2);
     
    procedure CLOSE;
     
    end FND_FILE;
    /
    focntion PUT_LINE
    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
    procedure PUT_LINE(WHICH in number, BUFF in varchar2) is
       temp_file     varchar2(255);  -- used for messages
       user_error    varchar2(255);         -- to store translated file_error
    begin
       if WHICH = FND_FILE.LOG then
          temp_file := LOG_FNAME;
          utl_file.put_line(F_LOG, BUFF);
          utl_file.fflush(F_LOG);
        elsif WHICH = FND_FILE.OUTPUT then
          temp_file := OUT_FNAME;
          utl_file.put_line(F_OUT, BUFF);
          utl_file.fflush(F_OUT);
       end if;
     
       exception
          when UTL_FILE.INVALID_FILEHANDLE then
             -- first time this could be file not open case
             -- try opening temp files and write
             WRITE_BUFF(WHICH, 'PUT_LINE', BUFF);
     
          when UTL_FILE.INVALID_OPERATION then
             fnd_message.set_name('FND', 'CONC-FILE_ERROR');
             fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
             user_error := substrb(fnd_message.get, 1, 255);
     
             fnd_message.set_name('FND','CONC-TEMPFILE_INVALID_OPERATN');
             fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
    	 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
    	 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.put_line.invalid_operatn', FALSE);
             raise_application_error(-20100, user_error);
     
          when UTL_FILE.WRITE_ERROR then
             fnd_message.set_name('FND', 'CONC-FILE_ERROR');
             fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
             user_error := substrb(fnd_message.get, 1, 255);
     
             fnd_message.set_name('FND', 'CONC-TEMPFILE_WRITE_ERROR');
             fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
    	 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
    	 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.put_line.write_error', FALSE);
             raise_application_error(-20100, user_error);
     
          when others then
             raise;
    end PUT_LINE;
    les experts comprendront

    PS: désolé pour l'oubli du fetch

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Par contre, comment à tu lancer ta commande? Avec shell, Je pense qu'il faut définir le fichier de sortie/log pour que cela marche (un traitement oracle Appli le fait automatiquement)

Discussions similaires

  1. redimensionner toutes les colonnes JTable
    Par jdewalqu dans le forum Composants
    Réponses: 2
    Dernier message: 02/03/2006, 14h52
  2. Imprimer toutes les colonnes sur une même feuille
    Par Soulghard dans le forum Access
    Réponses: 1
    Dernier message: 02/02/2006, 12h10
  3. parcourir toutes les colonnes de toutes les tables???
    Par cha_cha dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 12h31
  4. Toutes les colonnes d'une BDD
    Par mohamed dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/09/2004, 14h12
  5. Réponses: 2
    Dernier message: 09/07/2003, 14h10

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