提议的解决方案都不能显示原始列名,所以我不确定人们为什么要对它们进行投票......我确实有一个适用于原始请求的“hack”,但我真的不喜欢它...也就是说,您实际上是在每列的查询中附加或前缀一个字符串,因此它们对于列标题总是足够长。如果您处于 HTML 模式(如海报所示),那么额外的空白间距几乎没有什么害处……它当然会减慢您的查询速度……
例如
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;