oracle sqlplus中如何更清晰的显示表数据

Posted

技术标签:

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

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

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

但我想将它们显示为:

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

不是每一列都在另一列下

【问题讨论】:

errr.. 我想像普通桌子一样展示它们。一个接一个 【参考方案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 虽然是多余的; space 是 obsolete 开始,无论如何它默认为 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;elsehdash=hdash" "ln1;_d=0else_d=0;h=0;val=ln1;printHeader()elseif(!isHeaderFirstLn())val=val" "ln1elseprint val;val="";_d=1;h=1;hnames=ln1   ENDif(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 的等价物,它也可以在那里工作

【讨论】:

以上是关于oracle sqlplus中如何更清晰的显示表数据的主要内容,如果未能解决你的问题,请参考以下文章

计算Oracle中的表数

oracle安装后完善2-2 sqlplus配置变量 命令提示符如何显示为用户名

sqlplus多行代码怎么

如何使用 SQLPlus 查看 Oracle 存储过程?

[Oracle]sqlplus 启动参数说明

ORACLE 在 SQLPLUS 与 PL/SQL 中显示乱码的问题