sqlplus的非交互式使用

1 sqlplus交互界面存在的問題

sqlplus是ORACLE數據庫的最重要的官方命令行client軟件。是DBA的必備工具,使用它可以完畢差點兒全部的管理任務。然而。sqlplus的交互界面並不是很友好,輸入命令時不具備歷史命令記錄功能。默認的輸出結果更是不堪入目。mysql

在易用性方面,sqlplus確實比mysqlclient差了很多。sql

既然sqlplus交互模式存在這麼多的不便。那麼不如干脆直接使用非交互模式使用它,再借助操做系統提供的shell工具集來協助完畢更復雜的任務。sqlplus自己就是支持非交互式使用的,而且支持的很好,符合通常的Unix設計哲學:從標準輸入讀取命令。把結果寫到標準輸出shell

2 sqlplus的兩種非交互式使用方式

sqlplus在非交互模式下,可以從兩個地方爲其提供sql命令:一是經過外部文件,而是經過標準輸入。數據庫

2.1 經過外部命令文件

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

2.2 經過標準輸入

既然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

3 利用管道作興許處理

既然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);}'

4 需要注意的地方

使用外部文件時,文件裏的命令與交互式使用全然一樣,無需操心。

  • 使用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 ...

5 一個簡單的腳本

上述命令行方式儘管可以方便的經過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的帳戶信息,相對也安全。

相關文章
相關標籤/搜索