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 1
和 set 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
(比如说)以减少大结果集中列标题的重复。
所以这应该在表创建期间完成,或者你能详细说明一下吗
lines
和 pages
从来没有为我工作过。使用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中如何更清晰的显示表数据的主要内容,如果未能解决你的问题,请参考以下文章