sqlplus是ORACLE數據庫的最重要的官方命令行client軟件。是DBA的必備工具,使用它可以完畢差點兒全部的管理任務。然而。sqlplus的交互界面並不是很友好,輸入命令時不具備歷史命令記錄功能。默認的輸出結果更是不堪入目。mysql
在易用性方面,sqlplus確實比mysqlclient差了很多。sql
既然sqlplus交互模式存在這麼多的不便。那麼不如干脆直接使用非交互模式使用它,再借助操做系統提供的shell工具集來協助完畢更復雜的任務。sqlplus自己就是支持非交互式使用的,而且支持的很好,符合通常的Unix設計哲學:從標準輸入讀取命令。把結果寫到標準輸出。shell
sqlplus在非交互模式下,可以從兩個地方爲其提供sql命令:一是經過外部文件,而是經過標準輸入。數據庫
sqlplus username/password@serverIP/偵聽服務名 @命令文件名稱
如下舉一個樣例。
命令文件名稱爲 1.sql。內容例如如下:安全
select count(*) from dba_objects;
exit;
運行命令爲:bash
sqlplus sys/***@172.16.2.190/xgdb.db001.xigang @1.sql
此時運行完畢會把結果輸出。
這樣的外部命令文件的方式。需要創建單獨的物理文件來存儲命令。適合經常使用的大批量管理任務。markdown
既然sqlplus從標準輸入來讀取命令,那麼就可以利用管道把命令發送給它。工具
echo 命令 | sqlplus username/password@serverIP/偵聽服務名
這樣的方式不需要在命令中包括 exit;,由於sqlplus運行後本身主動退出。如下是個樣例:ui
echo 'select count(*) from dba_objects;' | sqlplus sys/***@172.16.2.190/xgdb.db001.xigang as sysdba
這樣運行後結果輸出到屏幕。由於sql語句是bash命令的參數。而整個命令行可以經過bash方便的歷史記錄來反覆調用。又可以方便的使用上下箭頭來反覆使用運行過的sql語句了。spa
既然sqlplus把結果輸出到了標準輸出,那麼就可以藉助管道,使用sed,awk等文字處理工具來獲得想要的輸出。
echo -e 'set pagesize 0\nselect table_name,owner from dba_tables;' | sqlplus -S sys/***@172.16.2.190/xgdb.db001.xigang as sysdba | awk '{printf("%-10d%-30s%-20s\n",NR,$1,$2);}'
使用外部文件時,文件裏的命令與交互式使用全然一樣,無需操心。
使用echo + 管道輸入時,要避免 bash 元字符的干擾。必定要把sql命令使用單引號或雙引號保護起來。
當sql命令中有單引號時。應選擇使用雙引號保護。如
echo "insert into t1(name) values('奧巴馬');" | sqlplus ...
由於$在雙引號裏也會被當成元字符。因此需要對其進行轉義
echo "select * from v\$nls_valid_values where parameter='LANGUAGE';" | sqlplus ...
另外,sqlplus不一樣意把sqlplus指令和sql命令混合在一行使用。
而且sql命令必須以;結尾。這樣必須使用echo -e 選項來開啓把」\n」解釋成換行符。
好比
echo -e 'set pagesize 0\nset linesize 100\nselect * from dba_objects;' | sqlplus ...
上述命令行方式儘管可以方便的經過bash的歷史記錄功能調用運行過的sql語句,但是命令行中除了sql語句還有大量的其它內容,顯得繁瑣。因此。寫一個小腳本(文件名稱爲sql)會讓調用起來很方便,例如如下:
#!/bin/bash -
if [ $# -ne 1 ]
then
echo "Usage: $0 'SQL statement'"
else
SQL="set pagesize 0\nset linesize 300\n$1"
echo -e "$SQL"
echo -e "$SQL" | sqlplus -S sys/***@172.16.2.190/xgdb.db001.xigang as sysdba
fi
這樣調用起來就像如下同樣。
sql 'select * from dba_objects;'
這樣顯得很乾淨利落。而且也不會在歷史命令中記下ORACLE的帳戶信息,相對也安全。