Oracle 所有列的列宽
Posted
技术标签:
【中文标题】Oracle 所有列的列宽【英文标题】:Oracle Column width for all columns 【发布时间】:2013-03-18 09:10:26 【问题描述】:执行用于显示各种列的长语句时的问题之一
select g.guestid, g.forename, g.surname, b.bookingid,
b.arrivedate, b.departdate, br.floorno, br.roomno from...
linux 终端上的列大小似乎是一个问题。例如,Forename VarChar(80) 列在执行上述语句时占据了屏幕的大部分宽度,减少它的一种方法是:
SET COLUMN FORENAME FORMAT A10
例如。但是,许多列需要反复经过,这很长。即
SET COLUMN FORENAME FORMAT A10
SET COLUMN SURNAME FORMAT A10
等等……
有没有办法说根据文本宽度调整列宽,以便每个都很好地适应。而不是这样的..
我更喜欢一些不涉及使用 FUNCTIONS 的解决方案。
【问题讨论】:
尝试使用 GUI 工具而不是 SQLPlus。终端窗口不适合数据网格显示。 @EgorSkriptunoff: 取决于命令行客户端 ;) SQL*Plus 在这方面真的很烦人。 是的,Spark 的数据帧在终端上显示得很漂亮。csvlook
也比 SQLPlus 做得更好。像我这样的人不适合使用 GUI 而不是终端 :)
@EgorSkriptunoff:直到您想保存输出并将结果与差异进行比较。
【参考方案1】:
不,没有简单的方法可以使 SQL*Plus “自动调整”列宽到文本宽度。
但是,脚本可以让您的生活更轻松。
首先,减少打字。不要做SET COLUMN FORENAME FORMAT A10
,而是做类似@c forename 10
的事情。
17:33:31 SYSTEM@dwal> cl col
columns cleared
17:33:33 SYSTEM@dwal> select * from dual;
D
-
X
Elapsed: 00:00:00.01
17:33:37 SYSTEM@dwal> @c dummy 10
17:33:43 SYSTEM@dwal> select * from dual;
DUMMY
----------
X
Elapsed: 00:00:00.01
17:33:45 SYSTEM@dwal> get s:\c.sql
1* col &1. for a&2.
17:33:50 SYSTEM@dwal>
或者像这样快速隐藏宽列:
17:48:44 SYSTEM@dwal> select owner, table_name from all_tables where rownum = 1;
OWNER TABLE_NAME
------------------------------ ------------------------------
SYS CON$
Elapsed: 00:00:00.24
17:48:49 SYSTEM@dwal> @np owner
17:48:53 SYSTEM@dwal> select owner, table_name from all_tables where rownum = 1;
TABLE_NAME
------------------------------
CON$
Elapsed: 00:00:00.26
17:48:56 SYSTEM@dwal> get s:\np
1 col &1 noprint
2* @undef
这些只是我每天使用的众多脚本中的两个。这种方法需要时间和一些个人对自定义的关注才能习惯它并使其有效,但会大大减少您按下的按键数量。
其次,还有glogin.sql。这是一个脚本,每次连接到某个地方时都会执行。我假设您知道使您的行换行的“长”列的列表。
只需在此处列出它们,然后您的
SET COLUMN FORENAME FORMAT A10
SET COLUMN SURNAME FORMAT A10
每次(重新)连接时都会设置列参数。
【讨论】:
【参考方案2】:Tom Kyte 写了一个print_table procedure,它以垂直方式显示结果集。
例如:
SQL> exec print_table('select g.guestid, g.forename, ... from ...')
GUESTID : 210
FORENAME : DINGLE
...
etc...
....
-----------------
PL/SQL procedure successfully completed.
此过程非常有用,尤其是在结果集很小(理想情况下不超过 10 行)时。
【讨论】:
【参考方案3】:ansiconsole
SQL 格式可能正是您想要的。
set sqlformat ansiconsole;
select g.guestid, g.forename, g.surname, b.bookingid,
b.arrivedate, b.departdate, br.floorno, br.roomno from...
或者:
select /*ansiconsole*/ g.guestid, g.forename, g.surname, b.bookingid,
b.arrivedate, b.departdate, br.floorno, br.roomno from...
这种格式会根据查询结果的大小自动调整列的大小。
【讨论】:
那不是 sqlplus 而是 SQLcl【参考方案4】:正如其他用户所说,sqlplus 没有简单的解决方案。也许使用glogin.sql
或login.sql
文件会有所帮助(@René Nyffenegger 提供了article about those files)。
您可以将列定义放在这些文件中。如果您总是查询相同的查询,或者您的列名称一致,这可能会有所帮助。
或者您将列语句放在您调用的脚本中
@scriptname.sql
如果你想使用列格式。您将脚本放在属于SQLPATH
variable 一部分的目录中,以便可以从任何目录调用它。
或者您使用其他工具。一位用户已经指向SQLcl。
【讨论】:
【参考方案5】:从语句中删除set
:
COLUMN FORENAME FORMAT A10
SET COLUMN SURNAME FORMAT A10
【讨论】:
【参考方案6】:在运行查询之前,会话不知道要返回的字符串的最大长度是多少。当然,该列的大小应该适当,但也许你真的会得到一个 80 个字符长的名字列表——如果不是,那么你的数据类型长度太大了。
正如 Eric 所说,GUI 工具更好,而 Oracle 的 SQL Developer 是免费的,而且很好。
【讨论】:
以上是关于Oracle 所有列的列宽的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 R Markdown 显式设置 R DT 表的列宽?