【问题标题】:How to display table data more clearly in oracle sqlplusoracle sqlplus中如何更清晰的显示表数据
【发布时间】:2011-03-01 16:33:26
【问题描述】:

我希望能够以漂亮的方式显示来自选择的结果数据,而不是其他列下的所有列。

这里是sqlplus显示我的表数据的方式:

但我想将它们显示为:

Name   |    Address    |    Phone    |
-------+---------------+-------------+
name1  |    address1   |    phone1   |
name2  |    address2   |    phone2   |
name3  |    address3   |    phone3   |

不是每一列都在另一列下

【问题讨论】:

  • errr.. 我想像普通桌子一样展示它们。一个接一个

标签: database oracle sqlplus


【解决方案1】:

我通常从以下内容开始:

set lines 256
set trimout on
set tab off

如果您安装了帮助信息,请查看help set。然后select name,address 而不是select * 如果你真的只想要这两列。

【讨论】:

  • @user206168 - 问题是关于 SQL*Plus。你能详细说明什么不起作用吗?
  • set space 1set tab off 的意义何在?
  • @Coffee - 我设置了制表符,所以它用空格而不是制表符填充东西;在屏幕上无关紧要,但如果将输出放在文件中,那么如果选项卡宽度不同,它可能会产生奇怪的效果。 set space 1 虽然是多余的; spaceobsolete 开始,无论如何它默认为 1;但它相当于set colsep ' '。我想我是从一个非常古老的环境中实现的,该环境默认为列之间的三个空格,我只是更喜欢一个。
【解决方案2】:

如果你的意思是你想像这样看到它们:

WORKPLACEID NAME       ADDRESS        TELEPHONE
----------- ---------- -------------- ---------
          1 HSBC       Nugegoda Road      43434
          2 HNB Bank   Colombo Road      223423

然后在 SQL Plus 中,您可以像这样设置列宽(例如):

column name format a10
column address format a20
column telephone format 999999999

如有必要,您还可以像这样指定行大小和页面大小:

set linesize 100 pagesize 50

您可以通过在运行查询之前将这些命令键入 SQL Plus 来执行此操作。或者您可以将这些命令和查询放入脚本文件中,例如myscript.sql 并运行它。例如:

column name format a10
column address format a20
column telephone format 999999999

select name, address, telephone
from mytable;

【讨论】:

  • 另外,我们可能想要SET PAGESIZE 200(比如说)以减少大结果集中列标题的重复。
  • 所以这应该在表创建期间完成,或者你能详细说明一下吗
  • linespages 从来没有为我工作过。使用column 很简单,而且很棒。谢谢
【解决方案3】:

您可以根据窗口的宽度设置线条大小,并使用以下命令设置换行。

set linesize 160;
set wrap off;

我根据自己的喜好使用了 160,您可以将其设置为介于 100 - 200 之间的某个位置,并且设置 wrap 不会显示您的数据,它会正确显示数据。

【讨论】:

    【解决方案4】:

    如果您使用 sqlplus 进行了转储,并且由于有人之前没有设置这 3 个值而导致输出出现乱码,则有一条出路。

    就在几个小时前,数据库管理员向我发送了在 sqlplus 中执行的查询的丑陋输出(我不知道,也许他讨厌我……)。我必须找到出路:这是一个 awk 脚本,用于解析该输出以使其至少更具可读性。它远不完美,但我没有足够的时间来正确打磨它。无论如何,它做得很好。

    awk ' function isDashed(ln){return ln ~ /^---+/};function addLn(){ln2=ln1; ln1=ln0;ln0=$0};function isLoaded(){return l==1||ln2!=""}; function printHeader(){hdr=hnames"\n"hdash;if(hdr!=lastHeader){lastHeader=hdr;print hdr};hnames="";hdash=""};function isHeaderFirstLn(){return isDashed(ln0) && !isDashed(ln1) && !isDashed(ln2) }; function isDataFirstLn(){return isDashed(ln2)&&!isDashed(ln1)&&!isDashed(ln0)}                         BEGIN{_d=1;h=1;hnames="";hdash="";val="";ln2="";ln1="";ln0="";fheadln=""}                                 { addLn();  if(!isLoaded()){next}; l=1;             if(h==1){if(!isDataFirstLn()){if(_d==0){hnames=hnames" "ln1;_d=1;}else{hdash=hdash" "ln1;_d=0}}else{_d=0;h=0;val=ln1;printHeader()}}else{if(!isHeaderFirstLn()){val=val" "ln1}else{print val;val="";_d=1;h=1;hnames=ln1}}   }END{if(val!="")print val}'
    

    如果其他人想尝试改进此脚本,以下是变量: hnames - 标题中的列名,hdash - 标题下方的虚线,h - 我当前是否正在解析标题(然后 ==1),val - 数据,_d - - 在 hnames 和 hdash 之间交换,ln0 - 最后一行读取,ln1 - 之前读取的行(这是我实际使用的那个),ln2 - 在 ln1 之前读取的行

    解析愉快!

    哦,差点忘了……我自己用这个来美化sqlplus的输出:

    [oracle@ora ~]$ cat prettify_sql 
    set lines 256
    set trimout on
    set tab off
    set pagesize 100
    set colsep " | "
    

    colsep 是可选的,但它使输出看起来像 sqlite,使用脚本更容易解析。

    编辑: 解析和非解析输出的一点预览

    【讨论】:

      【解决方案5】:

      啊,愚蠢的线条大小...... 这是我在 profile.sql 中所做的 - 仅适用于 unix:

      echo SET LINES $(tput cols) > $HOME/.login_tmp.sql
      @$HOME/.login_tmp.sql
      

      如果您在 Windows 上找到 tput 的等价物,它也可以在那里工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-10
        • 2021-05-19
        • 1970-01-01
        • 2019-12-24
        • 1970-01-01
        • 2016-08-26
        • 1970-01-01
        • 2023-04-05
        相关资源
        最近更新 更多