2013-10-04 224 views
4

如何在設置變量時在shell腳本中運行SQL命令?我曾嘗試過這種方法,它不執行命令,它認爲命令只是一個字符串。如何在shell腳本中運行SQL

#!/bin/ksh 
variable1=`sqlplus -s username/[email protected]_instance <<EOF 
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF 
select count(*) from table; 
EXIT; 
EOF` 
if [ -z "$variable1" ]; then 
    echo "No rows returned from database" 
    exit 0 
else 
    echo $variable1 
fi 

回答

4
#!/bin/ksh 
variable1=$( 
echo "set feed off 
set pages 0 
select count(*) from table; 
exit 
" | sqlplus -s username/[email protected]_instance 
) 
echo "found count = $variable1" 
+0

自我應答,然後自我-C有用ommenting? – Aneri

+0

你在這裏使用了不同的shell ... – dwjv

+9

@Aneri,不確定你以前是否使用過SO,但是寫一個問題並添加一個SO中不存在的答案正在爲SO增加價值。這實際上是一個功能。 –

3

可以使用heredoc。例如從一個提示:

$ sqlplus -s username/[email protected]_instance <<EOF 
set feed off 
set pages 0 
select count(*) from table; 
exit 
EOF 

所以sqlplus將消耗所有到EOF標記爲標準輸入。

+0

我能夠得到像這樣的東西來執行,但是將結果設置爲變量時遇到了困難。 –

0

也許是來不及回答,但是,有一個工作代碼:

sqlplus -s "/ as sysdba" << EOF 
    SET HEADING OFF 
    SET FEEDBACK OFF 
    SET LINESIZE 3800 
    SET TRIMSPOOL ON 
    SET TERMOUT OFF 
    SET SPACE 0 
    SET PAGESIZE 0 
    select (select instance_name from v\$instance) as DB_NAME, 
      file_name 
     from dba_data_files 
    order by 2; 
+0

不應該在最後有EOF(爲了避免警告)? –

0
sqlplus -s /nolog <<EOF 
whenever sqlerror exit sql.sqlcode; 
set echo on; 
set serveroutput on; 

connect <SCHEMA>/<PASS>@<HOST>:<PORT>/<SID>; 

truncate table tmp; 

exit; 
EOF 
0

代碼

PL_CONNECT_STRING="$DB_USERNAME/[email protected]$DB_SERVICE" 

OUTPUT=$(sqlplus -s $PL_CONNECT_STRING <<-END-OF-SQL 
      select count(*) from table; 
exit; 
END-OF-SQL) 
echo "COMPLETED GATHER STATS $OUTPUT"; 

說明:

PL_CONNECT_STRING進達tabase用戶名,密碼和它的服務名稱

的sqlplus用來將數據庫與PL_CONNECT_STRING細節連接

END-OF-SQL標籤包含要執行

echo用於打印查詢輸出查詢

注:您可以給多個查詢的END-OF-SQL標籤內,所以其批量執行以及