SQLPlus varchar2输出空格

时间:2014-09-02 08:52:55

标签: oracle oracle11g terminal sqlplus

当我像下面一样查询我的表时,“NAME”列的输出太长了。我最近将数据类型更改为VARCHAR2(150)而不是VARCHAR(150),以便不保存空格。但是,输出似乎还包括(某些?)空格。任何人都可以清楚这里发生了什么吗?我在这里看空白,或者问题只是我的终端/控制台,还是SQLPLUS本身与它有关?使用Windows终端。

SQL> SELECT * FROM SYS.O1_Orders;

        ID
----------
NAME
--------------------------------------------------------------------------------

  QUANTITY      PRICE
---------- ----------
         1
Cakes
        25        200

3 个答案:

答案 0 :(得分:3)

这纯粹是SQL * Plus显示问题。 VARCHARVARCHAR2数据类型之间没有差异(当前) - 也不会对您保存的数据进行空格键填充。只有CHAR列才会这样做。

在SQL * Plus中,您可以控制name列的显示范围

SQL> column name format a30;
例如,

将告诉SQL * Plus使用30列来显示name列中的数据。您可以向上或向下调整,具体取决于数据的实际长度,您希望在一行中放入多少数据等。您必须将它与SQL语句一起放在脚本中,否则您将需要在发出语句之前在每个会话中复制它,或者您需要将它添加到login / glogin.sql文件中。

如果您尝试生成固定宽度的文本报告,SQL * Plus是一个可爱的工具。但是,如果您只是以交互方式运行查询,那么它不是最便于用户使用的解决方案 - 调整文本列的宽度,处理比您的行更长的输出等等。如果您正在进行交互式开发,那么像SQL Developer这样的工具具有适当的GUI会更加友好。

答案 1 :(得分:2)

varchar2在存储时没有空白填充,但varchar也没有,这对SQL * Plus如何显示它没有任何影响。

SQL * Plus显示具有可包含的最大宽度的列,它在检索实际结果集之前从查询元数据中获取。否则,它必须获取所有值,将它们保存在某处,找到最长值的长度,然后才开始产生输出。并且输出会随着不同的执行而变化,这可能对报告没有用。

您有几个选择。如果你知道这个值永远不会超过一定长度(在这种情况下为什么列的最大大小会大于那个?)那么你可以将它强制转换为那个,或告诉SQL * Plus使用{*的列宽度3}}:

column name format a20

with the column command。但是如果它们确实发生了更长的值(或者如果在查询中转换/截断,数据将会丢失)。

您也可以将所有输出放在一行上,但您没有明确询问这些内容,但会让事情看起来更整洁:

set linesize 200

...或者某些值足以容纳所有列。当然,您可以将两种设置结合起来。单行仍然可以在您的终端窗口中进行包装,因此您可以根据需要将其更宽。

答案 2 :(得分:0)

您可以使用 SET NUM [WIDTH] {10 | N}
设置显示数字的默认宽度。

或使用 SET LONG {80 | N}
设置显示BLOB,BFILE,CLOB,LONG,NCLOB和XMLType值的最大宽度(以字节为单位)。

如果存在用于在所有VARCHAR2字段中显示固定宽度的SET选项,则问题仍然存在。至于我所知道的,如上所述,你可以使用 COLUMN column_name FORMAT 模型来格式化特定的( !)特定表格的列。