从SQL查询生成固定宽度的平面格式输出文件

从SQL查询生成固定宽度的平面格式输出文件,sql,oracle,plsql,Sql,Oracle,Plsql,我需要帮助生产固定宽度的文件,其中每一行都是相同的长度。我知道我必须将每个字段转换为固定长度的字符字段。字段的大小应为源表中字段的最大大小。但是,无法使用以下查询生成文件- Select cast(x.account_id as char(10)) || cast(birth_month as char(2)) || cast(birth_year as char(4))|| TO_CHAR(LastVisittDate

我需要帮助生产固定宽度的文件,其中每一行都是相同的长度。我知道我必须将每个字段转换为固定长度的字符字段。字段的大小应为源表中字段的最大大小。但是,无法使用以下查询生成文件-

    Select cast(x.account_id as char(10)) ||
           cast(birth_month as char(2)) ||
           cast(birth_year as char(4))|| 
           TO_CHAR(LastVisittDate,'yyyymmdd') ||'    '||
           max(case when email_Rank = 1 then cast(email_address as char(100)) else null end) ||chr(13) as ConstitRow

 from INTERS XR
               inner join INTERS_REL RX on XR.account_id = RX.account_id and RX.sts <> 'D'

       where 
               RX.account_id in (deleted - long list of account IDs)

我以前也有过类似的问题。有一个名为Anton Scheffer的包,它解决了我的问题。检查有关此的问题:。希望这对您有所帮助。

您正在将列值强制转换为charn,这将把较短的字符串和隐式转换为字符串的数字填充为n个字符,并截断较长的值。这比使用varchar2n要好,因为varchar2n会对较长的数字产生错误,并且不会对较短的字符串产生任何影响

尽管如此,您仍然会遇到null问题,因为castnull和charn或其他任何东西仍然是null,而不是您可能期望的n个空格。这对于任何列来说都可能是一个问题,但对于case表达式来说尤其如此

如果任何列可以为null,则可以使用nvl或coalesce将其视为单个空格,然后强制转换也将填充这些列:

cast(coalesce(First_name, ' ') as char(20))
您也可以使用rpad,而不是铸造:

对于case表达式,您可以使else子句的计算结果为单个空格,而不是null,但是您还需要将强制转换应用于整个case表达式,而不是将其放在一个when分支中;因此,与此相反:

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

cast(max(case when email_Rank = 1 then email_address else ' ' end) as char(100))
或者,如果您愿意:

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

您的客户端可能已经正确地将整个字符串填充到相同的长度,如果您已关闭trimout,或者如果spooling已关闭trimspool,SQL*Plus将执行此操作;这可能是BobC所指的,但如果您真正尝试创建的是固定长度字段,那么这并没有真正的帮助,因为累积起来也会给您一个固定长度的记录——如果您没有固定长度字段,那么无论如何都无法解释数据。

PL/SQL是否适合您?或者只是简单的SQL?是的,它是-谢谢,不是每一行的长度都是一样的吗?我遗漏了什么吗?我检查了您的查询,您似乎遗漏了表名。请根据问题更新您的查询。可能重复@AmeerB。我重复我的问题。默认情况下,您没有从sqlplus获得固定格式吗?嗨,Alex-谢谢您的帮助。我完成了所有工作,除了castbirth|day作为char2| |和CHARLastGiftDate,'yyyymmdd'之外,我得到了ORA-00932:不一致的数据类型:预期得到的日期CHAR@AmeerB. - 这两列是什么数据类型?
cast(coalesce(max(case when email_Rank = 1 then email_address end), ' ') as char(100))