Oracle
 sql >> Base de données >  >> RDS >> Oracle

Produire un fichier de sortie au format plat à largeur fixe à partir d'une requête SQL

Vous convertissez vos valeurs de colonne en char(n) , qui remplira les chaînes et les nombres plus courts (implicitement convertis en chaînes) en n chars et tronquer les valeurs plus longues. (C'est mieux que d'utiliser varchar2(n) , ce qui entraînerait une erreur avec des nombres plus longs et ne ferait aucune différence avec des chaînes plus courtes).

Vous aurez cependant un problème avec les valeurs nulles, car cast(null as char(n)) - ou toute autre chose - est toujours null, plutôt que n espaces comme on peut s'y attendre. Cela peut être un problème pour n'importe laquelle de vos colonnes, mais particulièrement pour vos expressions de casse.

Si des colonnes peuvent être nulles, vous pouvez utiliser nvl ou coalesce pour les traiter comme un seul espace à la place, et la distribution les remplira également :

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

Plutôt que de lancer, vous pouvez également utiliser rpad() :

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

Pour les expressions de cas, vous pouvez faire le else clause évalue à un seul espace au lieu de null, mais vous devez également appliquer le cast à l'expression de cas globale, ne pas l'avoir dans un when bifurquer; donc au lieu de ça :

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

vous feriez :

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

ou si vous préférez :

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

Votre client a peut-être rempli à droite la chaîne globale à la même longueur de toute façon (SQL*Plus le fera si vous avez set trimout off , ou en cas de mise en file d'attente set trimspool off; ce à quoi BobC faisait peut-être référence), mais cela n'aide pas vraiment si ce que vous essayez vraiment de créer sont des champs de longueur fixe , ce qui vous donnerait également un enregistrement de longueur fixe - et si vous n'aviez pas de champs de longueur fixe, il serait de toute façon impossible d'interpréter les données.