execute immediate avec utl_file
Bonjour,
Dans ma procédure stockée, j'initialise :
- un fichier trace myfic := UTL_FILE.FOPEN
- une variable stmt pour un sql dynamique.
Code:
1 2 3 4 5 6 7 8
| stmt := '
BEGIN
for cursor as ... LOOP
traitement de type insert/update
/* ici je voudrais faire un appel à UTL_FILE.PUT(myfic, 'mon message'); */
END LOOP
END;
' |
Ensuite, j'écris dans le fichier de trace je lance 'execute immediate stmt' cf. stmt ci-dessus
Par contre je n'arrive pas à enrichir ce traitement dynamique par un appel à UTL_FILE pour chaque itération du curseur.
Comment passer le pointeur myfic (UTL_FILE.FILE_TYPE) à sql dynamique ?
Ce handler UTL_FILE.FILE_TYPE étant une structure :
Code:
1 2 3 4
| TYPE file_type IS RECORD (
id BINARY_INTEGER,
datatype BINARY_INTEGER,
byte_mode BOOLEAN); |
je n'arrive pas à l'inclure l'appel à UTL_FILE.PUT dans 'execute immediate'.
Auriez-vous des solutions ?
Cdlt
Explication sur le contexte du traitement
Bonjour,
c'est un peu compliqué de présenter de façon succincte le but du traitement : il s'agit de répercuter sur la BD le contenu des fichiers plats (insert/update).
On doit traiter différents fichiers/tables et le format de fichiers peut évoluer (traitement journalier).
J'ai décidé donc d'écrire une procédure avec PLSQL dynamique qui s'appuie sur une table de paramétrage (format du fichier, mapping colonnes, jointures etc).
J'utilise SQLLDR pour charger le fichier dans une table de travail, et ensuite je déroule une action sur la BD à partir de cette table (ligne par ligne).
Le 'Update' cité ci-dessus a pour but de récupérer le type d'opération (inert/update) et event. code erreur oracle dans ma table de travail.
J'aurais aimé le limiter aux lignes en erreur au lieu d'update (inutile) de tous les enregistrements.
pourquoi ce n'est pas possible (à partir de mon tableau PLSQL) ?
Je dois par la suite restituer, pour la correction, la partie du fichier d'origine sous son format d'origine avec l'explication sur erreur rencontrée.
Pour cela je prévois une table de traduction de messages d'erreurs.
En espérant avoir été suffisamment claire dans mon explication.
Je vous remercie tous de votre intérêt et de vos participations.
Cdlt