sql * plus根据该列中的值截断列名

时间:2017-11-02 13:07:44

标签: oracle oracle-sqldeveloper sqlplus

我有两个广泛的问题:

Q1。在Oracle SQL Developer中执行代码行并在sqlplus命令提示符中执行相同的代码同样的事情? (之所以我问这个,我听说并非所有的sqlplus命令都可以在SQL Developer中执行。如果对上述问题的答案是肯定的,那么请使用一些有用的链接来帮助)

Q2。我将sql查询的结果假脱机到.csv文件,但问题是列名称根据该列中值的最大长度被截断。 我的代码是:

set colsep ","
spool C:\Oracle\sample.csv
select * from acct_clas_rule;
spool off;

上述代码的输出是(中间列具有空值)

 ABCD_,ABCD_,ABC
-----,-----,---
AB   ,     ,WSD
ABCD ,     ,WSD
ABCD ,     ,WSD
SG   ,     ,WSD
KD   ,     ,WSD
WD   ,     ,LKJ
KLHGF,     ,LKO
WSDFG,     ,LOK
WSDF ,     ,LKO
WS   ,     ,GH

在上面的输出中,列名称已被截断。我想要显示列的全名。有人可以帮忙吗? 我已经看到了问题in this link,但我并不了解如何应用那里提供的答案,因为没有引用特定的例子。我是新手,所以我无法理解。

我的列的原始名称(上表中从左到右)是: ABCD_DFGT_SDF, ABCD_EDF_GH, ABCD_DFRE

PS -

1。我正在使用Oracle SQL开发人员来运行sqlplus命令。我认为因为我的命令不起作用(如set underlineset linesize等)。如果是这种情况,请告诉我。我实际上想删除列名称下面的那些下划线。

2。另请告诉我,您的回答是否适用于Oracle SQL Developer或sqlplus。 谢谢

3 个答案:

答案 0 :(得分:1)

除了@ JChomel的方法之外,还有一些事情可以在SQL Develoepr或SQL * Plus中使用,而这些建议特定于SQL Developer。

让我们从基于CTE的虚拟查询开始,以获得类似于您的情况:

set colsep ","
with acct_clas_rule (abdc_1, abcd_2, abcd_3) as (
  select cast('AB' as varchar2(5)), cast(null as varchar2(5)), cast('WSD' as varchar2(4)) from dual
  union all select 'ABCD', null, 'WSD' from dual
  -- ...
  union all select 'WS', null, 'GH' from dual
)
select * from acct_clas_rule;

在SQL Developer中作为脚本运行时(从文档+箭头图标或F5),输出为:

ABDC_,ABCD_,ABCD
-----,-----,----
AB   ,     ,WSD 
ABCD ,     ,WSD 
WS   ,     ,GH  

如果您更改查询以包含SQL Developer特定的格式提示/*csv*/,那么您将获得所需的输出:

select /*csv*/ * from acct_clas_rule;

"ABDC_1","ABCD_2","ABCD_3"
"AB","","WSD"
"ABCD","","WSD"
"WS","","GH"

除了字符串全部用双引号括起来,这可能不是你真正想要的。 (这取决于您对假脱机文件执行的操作以及您的任何字符串值是否包含逗号,这会使Excel混淆。)

使用更新版本的SQL Developer,您可以在不使用sqlformat选项修改查询的情况下获得完全相同的结果:

set sqlformat csv
select * from acct_clas_rule;

但你再次获得双引号。您可以将双引号更改为不同的机箱字符,但这可能没有帮助。

另一种方法是使用内置导出工具而不是假脱机。如果您将查询作为语句运行(绿色'播放按钮'图标或控制输入),则不会显示在“脚本输出”面板中,而是会在其旁边打开一个新的“查询结果”面板,显示结果作为网格。

enter image description here

如果您右键点击结果,您将获得一个上下文菜单,然后从中选择导出...将为您提供一个向导,以您选择的格式导出结果,包括CSV:

enter image description here

您可以将左侧和右侧围栏保留为双引号,以获得与上述选项相同的结果,但空值使用单词' null'而不是空字符串:

"ABDC_1","ABCD_2","ABCD_3"
"AB",null,"WSD"
"ABCD",null,"WSD"
"WS",null,"GH

或者您可以更改它们,或者通过选择“无”来删除它们,它们会为您提供:

ABDC_1,ABCD_2,ABCD_3
AB,null,WSD
ABCD,null,WSD
WS,null,G

@thatjeffsmith评论了如何更改/*csv*/方法的空替换文本。对于导出,它看起来像是“#" null'可能是17.2.0中的错误;在17.3.1中没有出现,而是你看到:

ABDC_1,ABCD_2,ABCD_3
AB,,WSD
ABCD,,WSD
WS,,GH

或封闭的空字符串(""),如果您设置了外壳。

答案 1 :(得分:0)

Q1:TI不是SQL Developer的专家。可能存在类似"命令行的模式"或者你可以获得类似结果的东西,但不确定。

Q2:你必须为sqlplus设置正确的选项:这是我知道的一个技巧(它还将删除导致其他问题的--- --- ---):

  1. SET HEADING OFF`,以避免打印列名称
  2. 联合脚本开头的所有列名:

    set colsep ","
    spool C:\Oracle\sample.csv
    select 'ABCD_DFGT_SDF', 'ABCD_EDF_GH', 'ABCD_DFRE' from dual
    UNION ALL
    select * from acct_clas_rule;
    spool off;
    

答案 2 :(得分:0)

使用sql plus set命令----->设置下划线关闭