Oracle

SQL*Plus 預設輸出格式

  • August 27, 2013

我注意到使用相同的 SQL*Plus 客戶端連接到不同的 Oracle 數據庫會導致相同 SQL 查詢的不同輸出。

數據庫 1:

C:\Oracle\instantclient_10_2>sqlplus user/passwd@'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host1)(PORT=1521))(CONNECT_DATA=(SID=SID1)))'

SQL*Plus: Release 10.2.0.5.0 - Production on Fri Aug 23 11:54:45 2013

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options

SQL> select 'XXXX ',to_char(UniqueSequenceNumber,'xxxxxxxxxxxxxx') from mytable where rownum < 2;

'XXXX TO_CHAR(UNIQUES
----- ---------------
XXXX          300f483

這裡輸出在一行上,標題被截斷。

在另一個數據庫上也是如此:

C:\Oracle\instantclient_10_2>sqlplus user/passwd@'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host2)(PORT=1521))(CONNECT_DATA=(SID=SID2)))'

SQL*Plus: Release 10.2.0.5.0 - Production on Fri Aug 23 11:58:15 2013

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, Data Mining and Real Application Testing options

SQL> select 'XXXX ',to_char(UniqueSequenceNumber,'xxxxxxxxxxxxxx') from mytable where rownum < 2;

'XXXX'
--------------------------------
TO_CHAR(UNIQUESEQUENCENUMBER,'XXXXXXXXXXXXXX')
--------------------------------------------------------------------------------
XXXX
       3a1393b

這裡的輸出分為兩行。

我不是在尋找只會影響目前會話的 SQL*Plus 格式化選項,如 linesize、column format 等。我需要了解的是,即使我沒有指定任何選項,輸出也會有所不同。

伺服器端是否有一些預設設置?它是否取決於 Oracle 伺服器版本(一種情況下為 10.2.0.1,另一種情況下為 10.2.0.5)?

注意:列UniqueSequenceNumber是類型NUMBER

注 2:在伺服器版本 10.2.0.3 上嘗試過,結果與 10.2.0.1 相同(一個班輪)

回复奇蹟173:

C:\Oracle\instantclient_10_2>sqlplus /nolog

SQL*Plus: Release 10.2.0.5.0 - Production on Mon Aug 26 09:32:02 2013

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.

SQL> connect user/passwd@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host1)(PORT=1521))(CONNECT_DATA=(SID=SID1)))
Connected.
SQL> select 'xxxx' from dual;

'XXX
----
xxxx

SQL> connect user/passwd@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host2)(PORT=1521))(CONNECT_DATA=(SID=SID2)))
Connected.
SQL> select 'xxxx' from dual;

'XXXX'
--------------------------------
xxxx

SQL> connect user/passwd@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host1)(PORT=1521))(CONNECT_DATA=(SID=SID1)))
Connected.
SQL> select 'xxxx' from dual;

'XXX
----
xxxx

SQL> connect user/passwd@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host2)(PORT=1521))(CONNECT_DATA=(SID=SID2)))
Connected.
SQL> select 'xxxx' from dual;

'XXXX'
--------------------------------
xxxx

Tom Kyte 曾經發布過類似的內容,問題是 CURSOR_SHARING 參數。

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:3696883368520

如果它在 host2 上的系統/數據庫級別設置為 FORCE,它可能會將“XXXX”硬編碼值映射/強制為任意 32 個字元的變數。

至少有控制 sqlplus 行為的文件 - 它們是目前目錄中的“login.sql”和 $ORACLE_HOME/sqlplus/admin/ 中的“glogin.sql” 檢查兩台伺服器上的這些文件。

閱讀文件了解更多資訊: http ://docs.oracle.com/cd/B28359_01/server.111/b31189/ch2.htm (適用於 10g AFAIK)。

引用自:https://dba.stackexchange.com/questions/48602