所有列的Oracle列宽

时间:2013-03-18 09:10:27

标签: oracle sqlplus

执行用于显示各种列的长语句时的问题之一,例如

 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

依旧......

有没有办法说根据文字宽度调整列宽,以便每个人都很好地适应。而不是这样..

enter image description here

我更喜欢一些不涉及使用FUNCTIONS的解决方案。

5 个答案:

答案 0 :(得分: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
每次(重新)连接时都会设置

列参数。

答案 1 :(得分:0)

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行。

答案 2 :(得分:0)

正如其他用户已经说过的那样,sqlplus没有简单的解决方案。也许使用glogin.sqllogin.sql文件会很有帮助(@RenéNyffenegger提供了article about those files)。 您可以将列定义放在这些文件中。如果您始终查询相同的查询,或者您的列具有一致的命名,这可能会有所帮助。

或者您将列语句放在由

调用的脚本中
@scriptname.sql

如果要使用列格式。您将脚本放在SQLPATH variable的一部分目录中,以便可以从任何目录中调用它。

或者您使用其他工具。一位用户alredy指着SQLcl

答案 3 :(得分:-1)

在运行查询之前,会话不知道要返回的字符串的最大长度是多少。当然,列的大小应该适当,但是你可能真的会获得一个长度为80个字符的名字列表 - 如果没有,那么你的数据类型长度太大了。

正如Eric所说,GUI工具更好,Oracle的SQL Developer是免费的。

答案 4 :(得分:-1)

您可能正在寻找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...

此格式会根据查询结果的大小自动调整列数。