Salut,
Avec un exemple de données stocké dans la table cela sera peut être plus simple
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| TBL_0 |TO_CHAR(A.DAT_0,'DD-MM-YYYY')|HOU_0 |EVT_0 |ID1_0 |ID2_0 |COL_0 |NVAL_0 |
-------+-----------------------------+------+------+--------------+---------+------------+------------------------+
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |SOHNUM |NORHIL21070001 |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |ZSTATUT |1 |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |BPAADD |C02 |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |BPDNAM(0) |PM C02 |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |BPDNAM(1) | |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |BPDADDLIG(0)|Prénom Nom |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |BPDADDLIG(1)|25 rue de paris|
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |BPDADDLIG(2)| |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |BPDPOSCOD |69101 |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |BPDCTY |Une VILLE |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |CUSORDREF | |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |PJT | |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |ORDDAT |01072021 |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |SHIDAT |01072021 |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |DEMDLVDAT |06072021 |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |LASDLVDAT |31121599 |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |REP(0) |999 |
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |REP(1) | | |
Cette table est alimenté par l'ERP lorsqu'une action est réalisée sur certains champs (audit). C'est pour cette raison qu'il y a un enregistrement par action (EVT_0) et COL_0. Ensuite toutes les X minutes j'exporte ces enregistrements pour reproduire ces actions dans une base Mysql utilisé par une BI.
Dans mon fichier csv cela correspond à :
1 2 3 4 5 6 7
| SORDER;01-07-2021;163840;INSERT;NORHIL21070001; ;SOHNUM;NORHIL21070001
SORDER;01-07-2021;163840;INSERT;NORHIL21070001; ;ZSTATUT;1
SORDER;01-07-2021;163840;INSERT;NORHIL21070001; ;BPAADD;C02
SORDER;01-07-2021;163840;INSERT;NORHIL21070001; ;BPDADDLIG(0);Prénom Nom
SORDER;01-07-2021;163840;INSERT;NORHIL21070001; ;BPDNAM(1);
SORDER;01-07-2021;163840;INSERT;NORHIL21070001; ;BPDNAM(0);PM C02
[...] |
Dans cette exemple (une commande client)
1 2 3
| TBL_0 |TO_CHAR(A.DAT_0,'DD-MM-YYYY')|HOU_0 |EVT_0 |ID1_0 |ID2_0 |COL_0 |NVAL_0 |
-------+-----------------------------+------+------+--------------+---------+------------+------------------------+
SORDER |01-07-2021 |163840|INSERT|NORHIL21070001| |SOHNUM |NORHIL21070001 | |
Correspond à "Le numéro de commande (NORHIL2107001 colonne NVAL_0) est inséré dans le champ SOHNUM de la table SORDER"
Mon objectif est de transposer toutes les actions pour une même table en une seule ligne sql. En reprenant le jeu de données en sql cela deviendrait :
INSERT INTO sorder(sohnum, zstatut, bpaadd, bpdnam, [...] VALUES("NORHIL21070001", 1, "C02", "PM C02", [...])
Normalement la lecture de la base de donnée retourne un tuple avec les bons types. Si on l'écrit dans un fichier CSV tout devient chaîne de caractères et savoir si "21234" est un entier ou une chaîne de 5 caractères est possible en écrivant les chaines des caractères avec des quotes (pour les différentier des entiers) - ce qui est une option à l'écriture des fichiers CSV...
Probablement lorsque c'est python qui requête directement Oracle, moi je passe par un fichier csv intermédiaire qui est généré par sqlplus.
C'est donc à l'écriture du csv que le souci se pose. Tu aurais dû y mettre des guillemets.
Malheureusement au moment de la requête je ne connais pas à l'avance le type de données dans le champs et je n'ai pas la main sur la base (ERP), ni la structure de la table. Je pourrais monter une table de correspondance basé sur le nom du champ mais cela va vite devenir l'enfer à maintenir.
Et tu devrais te mettre rapidement à Python3 car plus tu tarderas plus ça se fera dans la douleur.
Je fais les deux en parallèle, pour le moment je suis obligé de le faire en 2 car le serveur qui exploite la base est pas très à jour... Merci la dette technique
Partager