écrire plus que 32767 octets dans un fichier!! - SQL/NoSQL - Programmation
Marsh Posté le 26-01-2010 à 14:22:42
1/ Quelle version d'Oracle ? (parce que déjà, faut réussir à détecter que c'est d'Oracle qu'il s'agit)
2/ Le passage de ton script qui déconne ?
3/ Comment accèdes-tu à Oracle ? SQL+, OLEDB, etc ?
Marsh Posté le 26-01-2010 à 14:42:15
C'est la version 10g.
En fait le problème il est déjà dans la taille de la variable qui stocke les données que je veux récupérer. La taille de ces données est supérieure à 32767 et j'aurais voulu savoir si je peux utiliser CLOB pour tout stocker. Si oui comment faire pour écrire le contenu dans un fichier que j'ai crée pour tracer le traitement.
J'accède à oracle avec SQL+.
voici une partie du script:
CREATE OR REPLACE PROCEDURE SPBUCI0101_07
(par_idOrdon IN VARCHAR2,
par_jobSet IN VARCHAR2,
par_vcListeCmdOrd IN VARCHAR2,
par_vcListeMgtrt IN VARCHAR2,
par_cheminLog IN VARCHAR2,
par_fichierLog IN VARCHAR2) IS
vcMesErr VARCHAR2(32767);
vcValParam VARCHAR2(32767);
vcListeTemp VARCHAR2(8000);
vcCodMgfon VARCHAR2(8);
vcTypMgfon VARCHAR2(1);
vcEdiMgfon VARCHAR2(1);
vcUtil VARCHAR2(12);
vcTemMess VARCHAR2(1);
vcMessParam VARCHAR2(32767);
vdValParam DATE;
var_idOrdon NUMBER;
iValParam NUMBER;
iNumParam NUMBER;
iEtpnbMgtrt NUMBER;
iNumMgtrt NUMBER;
i NUMBER;
ivcVAL VARCHAR(8);
ivcVAL2 VARCHAR(8);
CURSOR C_OPLOPCOD IS
select FIOPF.FIOPF_COD,OPLOP_COD from OPLOP,FIOPF
where OPLOP.FIOPF_COD = FIOPF.FIOPF_COD
AND FIOPF.TOTIE_CODSOC=7
AND FIOPF.TASTA_COD <>'A'
AND FIOPF.TASTA_COD <>'S'
;
vcValParam := '';
BEGIN
OPEN C_OPLOPCOD ;
LOOP
FETCH C_OPLOPCOD INTO ivcVAL,ivcVAL2;
EXIT WHEN C_OPLOPCOD%NOTFOUND;
IF (vcValParam is null) THEN
vcValParam := ''||(ivcVAL);
ELSE
vcValParam := vcValParam||'!'||(ivcVAL);
END IF;
END LOOP;
CLOSE C_OPLOPCOD;
vcValParam := vcValParam||'!';
dbms_output.put_line ('Liste des codes opération: '||vcValParam);
END;
vcMesErr := ALIM_MGVLP(iNumMgtrt,2,vcValParam);
IF (vcMesErr is not null) THEN
goto FIN_PROCEDURE;
END IF;
vcMessParam := ' 2 - Liste des codes opérations : '||vcValParam;
utl_file.put_line(FIC_TRACE,vcMessParam);
Comme tu peux le constater j'aurais voulu que la capacité de la variable vcValParam soit supérieure à 32767 et pouvoir écrire le contenu de cette variable grâce au utl_file.put_line de la fin.
Merci de ton attention.
Marsh Posté le 26-01-2010 à 15:02:48
tu t'étais toi même répondu à tes question ^^ t'aurais testé au lieu de t'affoler y'aurais pas eu de soucis
- oui tu peux utiliser un CLOB pour dépasser la limite des 32K
- UTL_FILE étant limité à 32K, et qu'en plus peu de DBA activent l'option dans le fichier init (car considéré comme une faille), oui tu peux utiliser dbms_lob
Marsh Posté le 26-01-2010 à 15:03:46
Déjà, tu dois savoir qu'un CLOB peut contenir plusieurs Go de données. 4 si je ne m'abuse, à moins que ce ne soit seulement 2 sous Oracle.
Dans tous les cas, une fois qu'on sait ça, on commence à se dire "ah ouais, en fait mes 32 Ko c'est la taille du buffer qui permet d'interroger ce type de données, et non une variable.
Bon, après, comment parcourir le contenu du CLOB, à vrai dire, aucune idée. Je m'en suis servis qu'une fois, en programmation depuis du C#, du coup il fallait un streamreader (ça se lisait comme un fichier texte si tu préfères).
Ici, tu trouveras pas mal de doc :
http://helyos.developpez.com/lob/
Avec des pistes apparemment pour lire l'intégralité d'un CLOB.
Et à priori, la réponse à ton problème :
http://www.dba-oracle.com/t_writin [...] s_file.htm
Marsh Posté le 26-01-2010 à 12:30:25
Bonjour,
Je souhaiterais écrire plus de 32767 octets de données dans un fichier que j'ai défini dans un procédure pl/sql.
Ces données sont contenues dans une variable qui j'ai déclaré en CLOB pour des contraintes de taille (type VARCHAR2 ne suffisant pas). Quand je test la procédure sans l'écriture dans le fichier, elle me ramène bien les données souhaitée. Mais pour l'écriture dans le fichier c'est impossible au-delà des 32767.
Y-a-t-il un moyen de pouvoir écrire ces données??
Grâce à l'utilisation du package dbms_lob peut-être compte-tenu des variables CLOB?
Merci d'avance pour votre aide.