Oracle
 sql >> Database >  >> RDS >> Oracle

Produci un file di output in formato flat a larghezza fissa da una query SQL

Stai trasmettendo i valori delle colonne a char(n) , che riempirà stringhe e numeri più brevi (convertiti implicitamente in stringhe) in n caratteri e tronca i valori più lunghi. (Questo è meglio che usare varchar2(n) , che comporterebbe un errore con numeri più lunghi e non farebbe alcuna differenza con stringhe più brevi).

Avrai comunque un problema con i null, come cast(null as char(n)) - o qualsiasi altra cosa - è ancora nullo, anziché n spazi come ci si potrebbe aspettare. Potrebbe essere un problema per qualsiasi colonna, ma in particolare per le espressioni maiuscole.

Se una qualsiasi colonna può essere nulla puoi usare nvl o coalesce per trattarli invece come un unico spazio, e il cast riempirà anche quelli:

cast(coalesce(First_name, ' ') as char(20))

Invece di trasmettere, puoi anche usare rpad() :

rpad(coalesce(First_name, ' '), 20, ' ')

Per le espressioni case puoi creare else la clausola restituisce un singolo spazio anziché null, ma devi anche applicare il cast all'espressione case complessiva, non averlo all'interno di un when ramo; quindi invece di questo:

max(case when email_Rank = 1 then cast(email_address as char(100)) else null end)

faresti:

cast(max(case when email_Rank = 1 then email_address else ' ' end) as char(100))

o se preferisci:

cast(coalesce(max(case when email_Rank = 1 then email_address end), ' ') as char(100))

Il tuo client potrebbe comunque aver riempito a destra la stringa complessiva alla stessa lunghezza (SQL*Plus lo farà se hai set trimout off , o se lo spooling set trimspool off; che potrebbe essere ciò a cui si riferiva BobC), ma questo non aiuta se ciò che stai veramente cercando di creare sono campi di lunghezza fissa , che cumulativamente ti darebbe anche un record di lunghezza fissa - e se non avessi campi di lunghezza fissa sarebbe comunque impossibile interpretare i dati.