由sqlplus中的一個小細節所做的折騰

jeanron100發表於2015-04-19
sqlplus是Oracle DBA每天都要用到爛的工具了。如果沒有sqlplus還真不知道怎麼和oracle對話了。轉念一想,自己已經很久沒使用過toad了。
我們知道在sqlplus登入的時候我們可以定義一些通用的設定,在每次登入sqlplus的時候都可以生效。
$ORACLE_HOME/sqlplus/admin/gloin.sql的內容是下面的形式,
--
-- Copyright (c) 1988, 2005, Oracle.  All Rights Reserved.
--
-- NAME
--   glogin.sql
--

在10g和11g中,其實還是有明顯的差別的,10g中glogin.sql已經自定義了一堆的設定。但是在11g中缺是空空如也,除了簡單的幾個註釋外,再沒有內容了,不過話說過來,在11g中這些設定已經作為預設設定,不需要再自定義了。

[oracle@oel1 admin]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on Sun Apr 19 21:14:45 2015
Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.
一般大家對於glogin的額外設定是:
set feedback on
define _editor=vi  
set serveroutput on size 1000000  
set trimspool on  
set long 5000  
set linesize 300  
set pagesize 9999  
column plan_plus_exp format a80  
column global_name new_value gname  
set termout off  
define gname=idle  
column global_name new_value gname  
select lower(user) || '@' || substr(global_name, 1, decode( dot, 0, length(global_name),  
dot-1) ) global_name  
from (select global_name,instr(global_name,'.') dot from global_name );  
set sqlprompt '&gname> '  
set termout on 

簡單實用一把,還是很不錯的。
[ora11g@oel1 admin]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Sun Apr 19 21:18:55 2015
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
idle> exit
[ora11g@oel1 admin]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Sun Apr 19 21:19:07 2015
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
sys@TEST11G> 

這個時候我注意到一個細節,很細小的地方,可能是自己敏感了。glogin.sql的時間戳和使用sqlplus的時間戳還是差別很大的。sqlplus中是1982,2009
--
-- Copyright (c) 1988, 2005, Oracle.  All Rights Reserved.
--
-- NAME
--   glogin.sql
我們來看看是怎麼回事。簡單string一把sqllplus看看裡面大概都有些啥。首先如果是我來寫這個部分,肯定不會在程式碼層寫死,肯定是透過配置來做。
如果單純看下面的相關內容,感覺關聯的就是libsqlplus.so了。
[ora11g@oel1 bin]$ strings sqlplus
/lib/ld-linux.so.2
libsqlplus.so
saficxa
afidrv
_Jv_RegisterClasses
__gmon_start__
libclntsh.so.11.1
__intel_new_proc_init
_fini
libnnz11.so
libdl.so.2
libm.so.6
libpthread.so.0
libnsl.so.1
libc.so.6
__libc_start_main
_edata
__bss_start
_end
/u01/app/ora11g/product/11.2.0/dbhome_1/lib
GLIBC_2.0
PTRh`
PPPPPj
[^_]

這個檔案在$ORACLE_HOME/lib下面,我們來簡單看看。
對於這種二進位制檔案,有時候檢視還是有不少的收穫的。
使用vi來檢視,找到下面的一段。
^@FMDy Mon dd FMhh24:mi:ss YYYY^@^@^@ on ^@^@^@^@%d.%d.%d.%d.%d^@^@: Release ^@^@2009^@^@^@^@%d.%d.%d^@^@^@^@Production^@^@Copyright (c) 1982, %s, Oracle.  All rights reserved.^@^@^@sqlerror^@^@^@^@continue^@^@^@^@oserror^@WHENEVER OSERROR %s
可以看到1982出現了,2009是透過紅色的部分傳入的引數。
我們甚至可以為了測試一下,可以簡單修改一下這些內容。比如我們修改為1983年吧。
[ora11g@oel1 lib]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Sun Apr 19 21:36:51 2015
Copyright (c) 1983, 2009, Oracle.  All rights reserved.
idle> exit

當然只是為了測試一下而已,不要為了個性而做改動,如果修改不當,很可能會得到如下的錯誤。
[ora11g@oel1 lib]$ sqlplus /nolog
Segmentation fault

這個時候我們再加把勁,我們知道desc是sqlplus中特有的命令。我們看看是怎麼描述的。
^@DEFINE %-15s = %s (NUMBER)
^@DEFINE %-15s = %s (DATE)
^@^@^@DEFINE %-15s = %s (BUFFER)
^@DEFINE %-15s = %s (BINARY_DOUBLE)
^@^@DEFINE %-15s = %s (BINARY_FLOAT)
^@^@^@DESCRIBE^@^@^@^@8.0^@%s(%d)^@^@BYTE^@^@^@^@%s(%d %s)^@^@^@Argument Name^@^@^@Type^@^@^@^@In/Out^@^@Default?^@^@^@^@ RETURNS ^@^@^@ENCRYPT^@NOT NULL^@^@^@^@ %s %8s %s
^@%-*s^@^@^@^@ %%-%2ds %%-%1ds %%s%1s^@ FINAL^@^@%s MEMBER PROCEDURE %s
可以看到輸入輸出引數的情況和使用desc命令是一致的。
sys@TEST11G> desc cat
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 TABLE_NAME                                            NOT NULL VARCHAR2(30)
 TABLE_TYPE                                                     VARCHAR2(11)



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1586264/,如需轉載,請註明出處,否則將追究法律責任。

相關文章