Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Produzir um arquivo de saída de formato simples de largura fixa a partir de uma consulta SQL


Você está transmitindo seus valores de coluna para char(n) , que preencherá strings e números mais curtos (implicitamente convertidos em strings) para n chars e truncar valores mais longos. (Isso é melhor do que usar varchar2(n) , o que geraria erros com números mais longos e não faria diferença para strings mais curtas).

Você terá um problema com nulos, porém, como cast(null as char(n)) - ou qualquer outra coisa - ainda é nulo, em vez de n espaços como você poderia esperar. Isso pode ser um problema para qualquer uma de suas colunas, mas principalmente para suas expressões de caso.

Se alguma coluna puder ser nula, você poderá usar nvl ou coalesce para tratá-los como um único espaço, e o elenco os preencherá também:
cast(coalesce(First_name, ' ') as char(20))

Em vez de transmitir, você também pode usar rpad() :
rpad(coalesce(First_name, ' '), 20, ' ')

Para as expressões case você pode fazer o else cláusula avalia para um único espaço em vez de nulo, mas você também precisa aplicar a conversão à expressão geral de maiúsculas e minúsculas, não dentro de um when ramo; então ao invés disso:
max(case when email_Rank = 1 then cast(email_address as char(100)) else null end)

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

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

Seu cliente pode estar preenchendo com a direita a string geral para o mesmo comprimento de qualquer maneira (o SQL*Plus fará isso se você set trimout off , ou se estiver em spool set trimspool off; que pode ser o que BobC estava se referindo), mas isso não ajuda muito se o que você está realmente tentando criar são campos de comprimento fixo , que cumulativamente também forneceria um registro de comprimento fixo - e se você não tivesse campos de comprimento fixo, seria impossível interpretar os dados de qualquer maneira.