所提出的解决方案都无法显示原始列名称,所以我不确定为什么人们会对它们进行投票...我确实有一个适用于原始请求的“黑客”,但我真的不喜欢它...也就是说,您实际上在每列的查询中附加或添加了一个字符串前缀,因此它们对于列标题始终足够长。如果您处于 HTML 模式,就像海报一样,一点额外的空白间距几乎没有什么坏处……它当然会减慢您的查询速度……
e.g.
SET ECHO OFF
SET PAGESIZE 32766
SET LINESIZE 32766
SET NUMW 20
SET VERIFY OFF
SET TERM OFF
SET UNDERLINE OFF
SET MARKUP HTML ON
SET PREFORMAT ON
SET WORD_WRAP ON
SET WRAP ON
SET ENTMAP ON
spool '/tmp/Example.html'
select
(s.ID||' ') AS ID,
(s.ORDER_ID||' ') AS ORDER_ID,
(s.ORDER_NUMBER||' ') AS ORDER_NUMBER,
(s.CONTRACT_ID||' ') AS CONTRACT_ID,
(s.CONTRACT_NUMBER||' ') AS CONTRACT_NUMBER,
(s.CONTRACT_START_DATE||' ') AS CONTRACT_START_DATE,
(s.CONTRACT_END_DATE||' ') AS CONTRACT_END_DATE,
(s.CURRENCY_ISO_CODE||' ') AS CURRENCY_ISO_CODE,
from Example s
order by s.order_number, s.contract_number;
spool off;
当然,您可以编写一个存储过程来做得更好,但实际上对于这个简单的场景来说,这似乎有点矫枉过正。
这仍然不符合最初海报的要求。因为它需要手动在列上列出而不是使用 select *。但至少当您愿意详细说明字段时,这是一个有效的解决方案。
然而,由于 HTML 中的字段太长确实没有问题,因此有一种相当简单的方法可以修复 Chris 的解决方案以使其在本示例中发挥作用。这只是选择 Oracle 允许的最大值。遗憾的是,这仍然无法真正适用于每个表的每个字段,除非您明确为每种数据类型添加格式。该解决方案也不适用于联接,因为不同的表可以使用相同的列名但不同的数据类型。
SET ECHO OFF
SET TERMOUT OFF
SET FEEDBACK OFF
SET PAGESIZE 32766
SET LINESIZE 32766
SET MARKUP HTML OFF
SET HEADING OFF
spool /tmp/columns_EXAMPLE.sql
select 'column ' || column_name || ' format A32766'
from all_tab_cols
where data_type = 'VARCHAR2' and table_name = 'EXAMPLE'
/
spool off
SET HEADING ON
SET NUMW 40
SET VERIFY OFF
SET TERM OFF
SET UNDERLINE OFF
SET MARKUP HTML ON
SET PREFORMAT ON
SET WORD_WRAP ON
SET WRAP ON
SET ENTMAP ON
@/tmp/columns_EXAMPLE.sql
spool '/tmp/Example.html'
select *
from Example s
order by s.order_number, s.contract_number;
spool off;