Oracle 所有列的列宽

问题描述 投票:0回答:8

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

 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

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

oracle sqlplus
8个回答
3
投票

不,没有简单的方法可以让 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

每次(重新)连接时都会设置列参数。


0
投票

Tom Kyte 编写了一个 print_table 过程,它以垂直方式显示结果集。

例如:

SQL> exec print_table('select g.guestid, g.forename, ... from ...')
GUESTID                       : 210
FORENAME                      : DINGLE
...
etc...
....
-----------------

PL/SQL procedure successfully completed.

此过程非常有用,尤其是当结果集很小(最好不超过 10 行)时。


0
投票

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...

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


0
投票

正如其他用户已经指出的那样,sqlplus 没有简单的解决方案。也许使用

glogin.sql
login.sql
文件会有所帮助(@René Nyffenegger 提供了一篇关于这些文件的 文章)。 您可以将列定义放入这些文件中。如果您总是查询相同的查询,或者您的列具有一致的命名,这可能会有所帮助。

或者将列语句放入由

调用的脚本中
@scriptname.sql

如果您想使用列格式。您将脚本放在属于

SQLPATH
变量 一部分的目录中,以便可以从任何目录调用它。

或者您使用其他工具。一位用户已经指出了 SQLcl


0
投票

从语句中删除

set

COLUMN FORENAME FORMAT A10

SET COLUMN SURNAME FORMAT A10


0
投票

我的解决方法是使用 CSV:

set markup csv on

根据数据和您拥有的列数,这可能会为您提供可读的输出。

否则只需将结果粘贴到 Excel 或 Visidata


0
投票

最佳解决方案

set markup csv on

-1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.