2011-08-26 15 views
5

Sto scrivendo un file di grandi dimensioni> 7 MB da una stored procedure Oracle ei requisiti non devono contenere caratteri di terminazione di riga (nessun ritorno a capo/avanzamento riga) alla fine di ogni record.Oracle PL/SQL UTL_FILE.PUT buffering

Ho scritto una procedura memorizzata utilizzando UTL_FILE.PUT e sto seguendo ogni chiamata a UTL_FILE.PUT con un UTL_FILE.FFLUSH. Questa procedura commette errori con un errore di scrittura una volta arrivato al punto in cui ho scritto più della dimensione del buffer (impostata su massimo 32767) anche se sto effettuando le chiamate FFLUSH. La procedura funziona correttamente se sostituisco le chiamate PUT con le chiamate PUT_LINE.

Non è possibile scrivere più della dimensione del buffer senza un carattere di fine riga? Se è così, c'è un lavoro in giro?

risposta

3

Dustin,

La documentazione di Oracle qui: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_file.htm#i1003404

membri che: fflush scrive fisicamente i dati in sospeso al file identificato dal gestore di file. Normalmente, i dati che vengono scritti su un file sono memorizzati nel buffer. La procedura FFLUSH impone la scrittura dei dati nel buffer sul file. I dati devono essere terminati con un carattere di nuova riga.

L'ultima frase è la più pertinente.

Non è possibile scrivere i dati utilizzando UTL_FILE.PUT_LINE prima di cercare nel file risultante i terminatori di riga e rimuoverli?

Solo un pensiero ....

+0

Grazie per aver chiarito come funziona FFLUSH, non avevo visto l'ultima frase nelle mie ricerche. – Dustin

+0

Ciao @Ollie, sono ancora confuso su come funziona FFLUSH, per (1 -> 32767 + n), ogni volta che metto, e faccio fflush. Perché dovrebbe essere necessaria una nuova linea? Aiuteresti a spiegare? – Jaskey

4

cancellato citazione da Documenti, vedere la risposta di Ollie

Un altro possibile modo per farlo è una stored procedure Java, dove è possibile utilizzare il più ricco di funzionalità API Java per la creazione e la scrittura di file.

+0

buona idea con la procedura memorizzata Java +1 – Ollie

+0

Sono intrigato dalla procedura java memorizzata.Anche se credo che il codice Java stesso sarebbe semplice, non facciamo alcuna codifica java nel nostro negozio, quindi sarebbe un problema di manutenzione per qualcuno da raccogliere. – Dustin

+0

Ti aiuterebbe a spiegare come possiamo risolvere questo problema con BFILE Object? – Jaskey

0

Anche se è meno che desiderabile, è sempre possibile PUT finché non si è rilevato che ci si sta avvicinando alla dimensione del buffer. In questo caso, è possibile FCLOSE l'handle di file (svuotamento del buffer) e riaprire lo stesso file con FOPEN utilizzando 'a' (append) come modalità. Di nuovo, questa tecnica dovrebbe essere generalmente evitata, specialmente se anche altri processi stanno tentando di accedere al file (ad esempio: la chiusura di un file di solito revoca qualsiasi blocco che il processo aveva posto su di esso, liberando tutti gli altri processi che stavano cercando di acquisire un blocco).

0

Grazie per tutte le grandi risposte, sono stati molto utili. La procedura java memorizzata sembrava la strada da percorrere, ma dal momento che non abbiamo un sacco di esperienza java in-house, sarebbe disapprovata dalla direzione. Ma, sono stato in grado di trovare un modo per farlo dalla stored procedure. Ho dovuto aprire il file in modalità byte di scrittura 'WB'. Quindi, per ogni record che sto scrivendo nel file, lo converto nel tipo di dati RAW con UTL_RAW.CAST_TO_RAW. Quindi utilizzare UTL_FILE.PUT_RAW per scrivere nel file seguito da eventuali chiamate FFLUSH necessarie per svuotare i buffer. Il sistema di ricezione è stato in grado di leggere i file; Fin qui tutto bene.