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 :

PL/SQL ORACLE (Record Dans un Varchar2)


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut PL/SQL ORACLE (Record Dans un Varchar2)
    Savez vous s'il existe un moyen simple pour déposer le contenu d'un record dans une variable PL/SQL / ORACLE :
    JE vous explique :
    J'ai un record (Test) et une variable (V_1)
    Le But etant de metre tous "Test" Dans "V1"

    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
    Declare
    Type T_REC is record
         (
         C1 char(2),
         C2 char(3),
         C3 char(3),
         C4 char(1)
         );
     
    Test T_REC;
     
    V_1 Varchar2(100);
     
    Begin
          Test.C1 :=  '1';
          Test.C2 := 'A';
     
          --- J'aimerais bien un truc comme ça ==>  (V_1 := Test;)
          ----  Mais c'est pas Good (Normal les types sont différents)
    End;



    existe t'il un moyen simple pour mettre le contenu de mon record dans ma variable V_1 (Autre Que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    V1 := rpad(Test.C1,2,' ')||rpad(Test.C2,3,' ')||
                        ....etc...etc...
    Au final je veux avoir dans V_1 = [1][Blanc][A][blanc][blanc]000[Blanc]
    (La concaténation des champs de Test (C1 , C2 , C3 , C4)

    Merci de vos réponses

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    3 338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 338
    Par défaut
    Merci de poster dans le fon forum ;-)

  3. #3
    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
    Nom M'ssieur. Il faut le coder à la main.

  4. #4
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut OK But !!!!!

    J'ai parlé d'un Record !!!
    Mais n'existe t'il pas d'autre type qui pourait répondre à ma demmande
    (Copié une structure de données (type varchar2)) dans une variable (type varchar2) ??????

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Par défaut
    Bah en fait SheikYerbouti à raison si tu veux juste avoir le contenu de ton record dans ta variable va falloir le faire à la main.

    Par contre si tu veux avoir une object toto qui contiennent tout plein de record du meme type alors utilise une table PL/SQL

    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
     Declare 
    Type T_REC is record 
         ( 
         C1 char(2), 
         C2 char(3), 
         C3 char(3), 
         C4 char(1) 
         ); 
     
    Test T_REC; 
     
    type table_rec is table of t_rec index by binary_integer;
    V_1 table_rec;
     
    Begin 
          Test.C1 :=  '1'; 
          Test.C2 := 'A'; 
     
        V_1(1):=test;
     
    End;

  6. #6
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut Merci Helyos
    J'ai eu un déclic (Merci à toi HELYOS car sans le vouloir tu m'as éclairé )

    En déclarant l'ensemble des champs en char avec "1 blanc" par défaut
    puis en terminant avec la concaténation : c'est OK

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    V_1 := Test.C1||Test.C2||Test.C3||Test.C4||Test.C5;
    mon soucis était d'éviter les "lpad" et autre "rpad" ...... le simple fait de la déclaration sufit

    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
     
    set serveroutput on
     
    Declare
    Type T_REC is record
         (
         C1 char(2) default ' ',
         C2 char(3) default ' ',
         C3 char(3) default ' ',
         C4 char(1) default ' ',
         C5 char(1) default ' '
         );
     
    Test T_REC;
     
    V_1 varchar2(30);
     
    Begin
          Test.C1 := '[1';
          Test.C3 := 'A';
          Test.C5 := ']';
     
          V_1 := Test.C1||Test.C2||Test.C3||Test.C4||Test.C5;
          dbms_output.put_line('('||V_1||')');
    End;
    Bon maintenant si vous etes capable de faire un truc comme
    V_1 := Test ; (Je prend !!!!!)


    Merci à vous tous pour vos réponses
    Cordialement
    @Thierry

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 64
    Par défaut
    Bonjour,

    Tout comme argoet je pense que c'est un truc qui manque, c'est trés pénalisant pour fabriquer des fichiers à destination de gros système par exemple.

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Par défaut
    Moi ce que je comprends pas trop c'est votre question.

    Si vous pouviez etre plus précis sur ce que vous souhaitez faire et obtenir ça m'aiderait grandement à vous donner une solution adaptée.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 64
    Par défaut
    J'explique :

    je dois créer un fichier repris sur gros système en cobol dont voici la structure :
    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
     
    TYPE CRE_PRIME IS RECORD
    (
    CDREGL             char(5) 		:= 'YOP01',
    DTEMI             char(7)			:= '       ',
    CDANN             char(1) 			:= '0',
    CTRBAL             char(1) 		:= '1',
    CAPL             char(4) 			:= 'DEDE',
    CSECADM             char(4)		:= 'DED ',
    NUPIECRE             char(10)		:= '          ',
    NUORDCRE             char(10)		:= '0000000000',
    DTTRA             char(7)			:= '       ',
    FILLER_073             char(73)	:= '                                                                         ',
    ENTITE_1             char(4)		:= 'FE77',
    ENTITE_2             char(4)		:= '    ',
    CEVT             char(3)			:= '   ',
    CDEVTSN             char(3)		:= 'EUR',
    CRES             char(2)			:= '30',
    FAMANA             char(3)			:= '   ',
    CATANA             char(4)			:= '3800',
    CONTYP             char(1)			:= '1',
    NUEXCPC             char(4)		:= '    ',
    CSENTSN             char(1)		:= ' ',
    NATOP             char(2)			:= '  ',
    ANNULOP             char(1)		:= ' ',
    RESDIS             char(2)			:= '00',
    TYPAPPORT             char(1)		:= ' ',
    TYPE_TIERS_1             char(1)		:= ' ',
    NUM_TIERS_1             char(6)	:= '      ',
    TYPE_TIERS_2             char(1)		:= ' ',
    NUM_TIERS_2             char(6)	:= '      ',
    TAXE_LPS_PAYS             char(2)			:= '00',
    PT_REGLEMENTAIRE             char(1)		:= '0',
    PT_ANALYTIQUE             char(1)		:= '0',
    filler1             char(40)		:= '                                        ',
    MT_COTIS             char(9)	:= '000000000',
    MT_COMMIS             char(9)	:= '000000000',
    MT_COUTPOL             char(9)	:= '000000000',
    MT_CHARG_INITIAL             char(9)	:= '000000000',
    MT_TAXES             char(9)	:= '000000000',
    MT_FRAISAP             char(9)	:= '000000000',
    MT_PDT_ACCES             char(9)	:= '000000000',
    MT_TVA             char(8)	:= '00000000',
    MT_RESERVE_3             char(8)	:= '00000000',
    PT_RESERVE_3             char(1)		:= ' ',
    CODEL             char(1)		:= ' ',
    CHAIN             char(1)		:= ' ',
    CODAF             char(1)		:= '0',
    LITIG             char(1)		:= '0',
    MOTAN             char(2)		:= '00',
    DATEMI             char(8)	:= '        ',
    NBPIEC             char(1)		:= '0',
    CRECQ             char(1)		:= '0',
    NUM_BEN             char(8)	:= '00000000',
    SUPFIC             char(2)		:= '00',
    NCONT             char(18)	:= '                  ',
    NDOC             char(15)	:= '               ',
    DATEF             char(8)	:= '        ',
    CFP             char(1)		:= '0',
    CENTRE             char(4)		:= '0000',
    CLASSIF             char(6)	:= '000000',
    NATCOT             char(1)		:= '0',
    CTON1             char(4)		:= '0000',
    CTON2             char(2)		:= '00',
    TXTAX             char(5)		:= '00000',
    CCOMPTA             char(1)		:= '0',
    COASS             char(1)		:= '0',
    TXCOM             char(3)			:= '000',
    AFFNV             char(1)		:= '0',
    DATECHE             char(2)	:= '00',
    REPJ             char(2)		:= '  ',
    MTBON             char(6)		:= '      ',
    DURGAR             char(5)		:= '     ',
    CBONUS             char(1)		:= '0',
    DATANU             char(8)	:= '        ',
    COMREP             char(5)		:= '     ',
    NUM_GES             char(8)	:= '00000000',
    CGENRTAX             char(2)		:= '00',
    MOTQUIT             char(2)		:= '  ',
    ADHESION             char(4)		:= '    ',
    DIREGION             char(2)		:= '00',
    PRODUIT             char(6)	:= '000000',
    CRES_INI             char(2)		:= '00',
    FAMANA_INI             char(3)			:= '000',
    CATANA_INI             char(4)		:= '0000',
    CONTYP_INI             char(1)		:= '0',
    MOTIF_CORR_ANA             char(1)		:= ' ',
    CLASPRODUIT             char(1)		:= ' ',
    CLASCONT             char(1)		:= ' ',
    CODAPP             char(2)		:= '  ',
    TYP             char(1)		:= ' ',
    CIECOAS             char(5)		:= '00000',
    CODECES             char(1)		:= ' ',
    CODTYPCES             char(2)		:= '  ',
    CENTRESAUV             char(2)	:= '00',
    filler2             char(32)		:= '                                '
    );
     
    cre_p						CRE_PRIME;
    le choix de type char s'explique par le fait que chaque zone doit se trouver dans une position fixe dans le fichier de sortie et doit avoir tout le temps la même longueur, les cobolistes me comprendront.

    Pour écrire un enregistrement de ce fichier j'aimerais pouvoir faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    utl_file.put_line(fichier, cre_p );
    au lieu de

    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
     
    Ligne := CREP.CDREGL || CREP.DTEMI || CREP.CDANN || CREP.CTRBAL || CREP.CAPL;
    	Ligne := Ligne || CREP.CSECADM || CREP.NUPIECRE || CREP.NUORDCRE || CREP.DTTRA || CREP.FILLER_073;
    	Ligne := Ligne || CREP.ENTITE_1 || CREP.ENTITE_2 || CREP.CEVT || CREP.CDEVTSN || CREP.CRES;
    	Ligne := Ligne || CREP.FAMANA || CREP.CATANA || CREP.CONTYP || CREP.NUEXCPC || CREP.CSENTSN;
    	Ligne := Ligne || CREP.NATOP || CREP.ANNULOP || CREP.RESDIS || CREP.TYPAPPORT || CREP.TYPE_TIERS_1;
    	Ligne := Ligne || CREP.NUM_TIERS_1 || CREP.TYPE_TIERS_2 || CREP.NUM_TIERS_2 || CREP.TAXE_LPS_PAYS;
       Ligne := Ligne || CREP.PT_REGLEMENTAIRE || CREP.PT_ANALYTIQUE || CREP.filler1 || CREP.MT_COTIS;
     	Ligne := Ligne || CREP.MT_COMMIS || CREP.MT_COUTPOL || CREP.MT_CHARG_INITIAL || CREP.MT_TAXES;
       Ligne := Ligne || CREP.MT_FRAISAP || CREP.MT_PDT_ACCES || CREP.MT_TVA || CREP.MT_RESERVE_3;
       Ligne := Ligne || CREP.PT_RESERVE_3 || CREP.CODEL || CREP.CHAIN || CREP.CODAF || CREP.LITIG;
       Ligne := Ligne || CREP.MOTAN || CREP.DATEMI || CREP.NBPIEC || CREP.CRECQ || CREP.NUM_BEN;
       Ligne := Ligne || CREP.SUPFIC || CREP.NCONT || CREP.NDOC|| CREP.DATEF || CREP.CFP || CREP.CENTRE;
       Ligne := Ligne || CREP.CLASSIF || CREP.NATCOT || CREP.CTON1 || CREP.CTON2 || CREP.TXTAX;
       Ligne := Ligne || CREP.CCOMPTA || CREP.COASS || CREP.TXCOM || CREP.AFFNV || CREP.DATECHE;
       Ligne := Ligne || CREP.REPJ || CREP.MTBON || CREP.DURGAR || CREP.CBONUS || CREP.DATANU;
       Ligne := Ligne || CREP.COMREP || CREP.NUM_GES || CREP.CGENRTAX || CREP.MOTQUIT || CREP.ADHESION;
       Ligne := Ligne || CREP.DIREGION || CREP.PRODUIT || CREP.CRES_INI || CREP.FAMANA_INI;
       Ligne := Ligne || CREP.CATANA_INI || CREP.CONTYP_INI || CREP.MOTIF_CORR_ANA || CREP.CLASPRODUIT;
       Ligne := Ligne || CREP.CLASCONT || CREP.CODAPP || CREP.TYP || CREP.CIECOAS || CREP.CODECES || CREP.CODTYPCES;
       Ligne := Ligne || CREP.CENTRESAUV || CREP.filler2;
    	utl_file.put_line(fichier, ligne );
    Voilà !

  10. #10
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    La question est :
    Y a t'il un moyen simple de mettre le contenu d'un ensemble de variables caractères (structurées en elle (un record par exemple) dans une variable :

    Le but etant de générer une chaine de caractère correspondant à la concaténation de l'ensemble des variables apartenant à la structure de donnée (Like en "C") 8) 8)


    Un truc comme : Variable := Structure (En "C" c'est finger in the noise et en "C"obol (Lire "C"au bol) itoo) )

  11. #11
    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
    La question est donc : Comment récupérer la structure d'un enregistrement.

    puisque vous êtes obligé de générer un fichier en ASCII taille fixe, il faut bien que votre "client" vous délivre la structure interne, et vous devez bien conserver cette information quelle que part, non ? (une table Oracle en l'occurence).
    Si vous avez la description des champs et la correspondance avec les colonnes de la ou les tables correspondantes, il est facile d'écrire une procédure générique qui génère votre fichier plat.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 64
    Par défaut
    Pour ma part j'ai récupéré une structure cobol que j'ai remanié via un tableur pour obtenir un type équivalent que j'ai copié/collé dans une proc stockée.

    Dans cette proc je récupère des infos à droite et à gauche pour remplir mon type et écrire un enregistrement en sortie.

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Par défaut
    Si j'ai bien compris tu voulais faire un utl_file.put_line(ton record)

    Non c'est pas possible

    Tu es obligé de construire ta chaine à sortir.

  14. #14
    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
    Maintenant si le type est stocké (créé) dans la base CREATE_TYPE..., il y a moyen d'en retrouver les constituants.

    de plus, si vous en faites une table objet, vos composants de record deviennent simplement des colonnes de table.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 64
    Par défaut
    C'est vrai ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Maintenant si le type est stocké (créé) dans la base CREATE_TYPE..., il y a moyen d'en retrouver les constituants.
    ??

    Cela m'interresse grandement !
    Par contre je vois pas du tout comment faire ...

    SheikYerbouti, par pitié, pouvez-vous ... ?

  16. #16
    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
    M'enfin puisque vous vous "ennuyer" à créer un record de plusieurs dizaines de champs, pourquoi ne pas créer tout simplement une table ???

    Il serait ensuite extrêmement facile de rédiger la procédure d'export du fichier plat.

  17. #17
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Par défaut
    Oui mais lui, si j'ai bien compris, , voulais faire un utl_file.put_line (de son record)

    Ce qui n'est pas possible

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 64
    Par défaut
    Du côté d'où je travaille je n'ai pas la possibilité de créer des tables, il faut passer par les dbas.
    Ce qui fait que la solution d'une table devient assez lourde surtout si l'interface de sortie évolue souvent ...

  19. #19
    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
    Citation Envoyé par helyos
    Oui mais lui, si j'ai bien compris, , voulais faire un utl_file.put_line (de son record)

    Ce qui n'est pas possible
    Oeuf corse, mais c'est pour envisager une procédure générique.
    j'imagine que s'il a ce besoin aujourd'hui pour 1 fichier plat, il l'aura ensuite pour d'autres fichiers...

  20. #20
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Par défaut
    Ah oki si il veux un truc générique le plus efficace est une table c'est evident comme cela tu peux recuperer les différentes colonnes et construire automatiquement la chaine à extraire.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/08/2014, 18h07
  2. Réponses: 1
    Dernier message: 01/09/2006, 15h05
  3. [PL/SQL Oracle] Syntaxe dans clause where
    Par Misdrhaal dans le forum Oracle
    Réponses: 2
    Dernier message: 01/03/2006, 13h33
  4. [sql] [oracle] éliminer les doublons dans sum ?
    Par trungsi dans le forum Langage SQL
    Réponses: 14
    Dernier message: 04/03/2005, 12h29
  5. Réponses: 4
    Dernier message: 18/10/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