Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/05/2004, 13h41   #1
Membre éprouvé
 
Avatar de argoet
 
Inscription : mai 2002
Messages : 535
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 535
Points : 461
Points : 461
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 :
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 :
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
__________________
Signé : Capitaine Jean-Luc Picard
argoet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2004, 13h56   #2
Expert Confirmé
 
Inscription : avril 2002
Messages : 3 339
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2002
Messages : 3 339
Points : 3 352
Points : 3 352
Merci de poster dans le fon forum ;-)
Admin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2004, 14h05   #3
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
Nom M'ssieur. Il faut le coder à la main.
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 08h50   #4
Membre éprouvé
 
Avatar de argoet
 
Inscription : mai 2002
Messages : 535
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 535
Points : 461
Points : 461
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) ??????
__________________
Signé : Capitaine Jean-Luc Picard
argoet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 08h58   #5
Membre éprouvé
 
Inscription : mai 2003
Messages : 412
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2003
Messages : 412
Points : 419
Points : 419
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 :
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;
__________________
Mes articles: http://helyos.developpez.com/
Mon site : http://www.sylohe.com
helyos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 09h30   #6
Membre éprouvé
 
Avatar de argoet
 
Inscription : mai 2002
Messages : 535
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 535
Points : 461
Points : 461
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 :
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 :
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
__________________
Signé : Capitaine Jean-Luc Picard
argoet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 10h15   #7
Membre du Club
 
Inscription : novembre 2002
Messages : 64
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 64
Points : 64
Points : 64
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.
echoes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 10h20   #8
Membre éprouvé
 
Inscription : mai 2003
Messages : 412
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2003
Messages : 412
Points : 419
Points : 419
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.
__________________
Mes articles: http://helyos.developpez.com/
Mon site : http://www.sylohe.com
helyos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 11h38   #9
Membre du Club
 
Inscription : novembre 2002
Messages : 64
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 64
Points : 64
Points : 64
J'explique :

je dois créer un fichier repris sur gros système en cobol dont voici la structure :
Code :
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 :
1
2
 
utl_file.put_line(fichier, cre_p );
au lieu de

Code :
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à !
echoes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 11h44   #10
Membre éprouvé
 
Avatar de argoet
 
Inscription : mai 2002
Messages : 535
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 535
Points : 461
Points : 461
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) )
__________________
Signé : Capitaine Jean-Luc Picard
argoet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 11h50   #11
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
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.
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 12h04   #12
Membre du Club
 
Inscription : novembre 2002
Messages : 64
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 64
Points : 64
Points : 64
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.
echoes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 12h10   #13
Membre éprouvé
 
Inscription : mai 2003
Messages : 412
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2003
Messages : 412
Points : 419
Points : 419
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.
__________________
Mes articles: http://helyos.developpez.com/
Mon site : http://www.sylohe.com
helyos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 12h13   #14
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
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.
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 13h49   #15
Membre du Club
 
Inscription : novembre 2002
Messages : 64
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 64
Points : 64
Points : 64
C'est vrai ??

Code :
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 ... ?
echoes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 13h59   #16
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
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.
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 14h05   #17
Membre éprouvé
 
Inscription : mai 2003
Messages : 412
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2003
Messages : 412
Points : 419
Points : 419
Oui mais lui, si j'ai bien compris, , voulais faire un utl_file.put_line (de son record)

Ce qui n'est pas possible
__________________
Mes articles: http://helyos.developpez.com/
Mon site : http://www.sylohe.com
helyos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 14h06   #18
Membre du Club
 
Inscription : novembre 2002
Messages : 64
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 64
Points : 64
Points : 64
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 ...
echoes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 14h07   #19
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
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...
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2004, 14h08   #20
Membre éprouvé
 
Inscription : mai 2003
Messages : 412
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2003
Messages : 412
Points : 419
Points : 419
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.
__________________
Mes articles: http://helyos.developpez.com/
Mon site : http://www.sylohe.com
helyos est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h44.


 
 
 
 
Partenaires

Hébergement Web