écrire plus que 32767 octets dans un fichier!!

écrire plus que 32767 octets dans un fichier!! - SQL/NoSQL - Programmation

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.
 

Reply

Marsh Posté le 26-01-2010 à 12:30:25   

Reply

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 ?

Reply

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.

Reply

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

Reply

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

Reply

Marsh Posté le 26-01-2010 à 15:09:53    

Merci beaucoup pour ces précisions.
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed