2015-03-31 56 views
1

我正在編寫批處理腳本來連接不同的數據庫併爲每個數據庫執行相同的SQL腳本。 我想輸出:如何使用批處理腳本格式化sql結果

"db_name1","Query_result: "xyz" 
"db_name2","Query_result: abc" 
"db_name3","Query_result: lmn" 

但是現在Query_result - 閥芯畢竟東西,甚至是SQL查詢也得到添加到結果。 我只是簡單地想在1st中顯示數據庫名稱而在第二列中查詢結果。第二列可能有多行或多列來顯示結果,即假設Query_result包含多個用戶名,那麼每個名稱應該在不同的行中。

這裏是我的批處理腳本

@ECHO OFF 
setlocal enabledelayedexpansion 
for /f "delims== tokens=1,2" %%a in (InstallList.txt) do (
echo "DB_NAME : %%a"," 
echo. 
echo QUERY_RESULT : 
echo. 
sqlplus %%b < mysql.sql 
echo " 
echo. 
) >> result.csv 
pause; 

在InstallList.txt

dbname1=username/password 
dbname2=username/password 
dbname3=username/password 

而且mysql.sql是

WHENEVER SQLERROR EXIT 1 
SET LINES 32000 
SET TERMOUT OFF ECHO OFF NEWP 0 SPA 0 PAGES 0 FEED OFF HEAD OFF TRIMS ON TAB OFF 
SET SERVEROUTPUT ON 
spool &1 
select user_name from employee where designation= 'manager'; 
spool off 
exit 

請幫助我儘早。 謝謝。

+1

您的輸出目前的樣子是什麼? – SomethingDark 2015-03-31 11:02:01

+0

目前在我的輸出中,所有東西都連接到數據庫然後查詢,結果n然後與數據庫斷開連接,所有這些消息都包含在內。 – angel 2015-04-01 06:19:13

+0

請再次檢查問題,我已經做了一些更改。 – angel 2015-04-01 06:30:43

回答

0

使用-S選項在sqlplus,所以它不打印connected to

sqlplus -h(幫助模式)顯示,-S下:

-S    Sets silent mode which suppresses the display of 
       the SQL*Plus banner, prompts, and echoing of 
       commands. 

所以,你的命令變得

sqlplus -S %%b < mysql.sql 

而不是

sqlplus %%b < mysql.sql 
+0

由於-s – angel 2015-04-01 07:15:22

+0

m sorrry rene我沒做任何改變我做了一些修改並且還添加了它的工作原理非常感謝你 – angel 2015-04-01 09:09:13

0

可能是SET VERIFY OFF和/或SET FEEDBACK OFF幫助:

WHENEVER SQLERROR EXIT 1 
SET LINES 32000 
SET TERMOUT OFF ECHO OFF NEWP 0 SPA 0 PAGES 0 FEED OFF HEAD OFF TRIMS ON TAB OFF 
SET SERVEROUTPUT ON 
SET FEEDBACK OFF 
SET VERIFY OFF 
... 

檢查this site更多。

p.s.:按評論中的問題添加。

@ECHO OFF 
setlocal enabledelayedexpansion 
for /f "delims== tokens=1,2" %%a in (InstallList.txt) do (
sqlplus %%bb @mysql.sql result.csv %%a 
) 
pause; 

通過條目,只是循環,並開始與文件名和DB名作爲參數的SQL腳本。

WHENEVER SQLERROR EXIT 1 

SET LINES 32000 
SET TERMOUT OFF 
SET NEWPAGE 0 
SET PAGESIZE 0 
SET FEEDBACK OFF 
SET HEADING OFF 
SET VERIFY OFF 
SET TRIMSPOOL ON 

SPOOL &1 APPEND 

SELECT '"DB_NAME: &2"' || ',' || '"Query result: ' || user_name || '"' 
    FROM employee 
WHERE designation= 'manager'; 

SPOOL OFF 
EXIT; 

使用append添加行,第二個參數來連接數據庫的名稱。請注意,這段代碼沒有經過測試,但基本想法工作得很好。

p.p.s.:以上輸出爲例如

"DB_NAME: DB1","Query result: Tom Scott" 
"DB_NAME: DB2","Query result: Liza Medison" 
"DB_NAME: DB3","Query result: Eric Brandon" 
"DB_NAME: DB4","Query result: Sam Smith" 
"DB_NAME: DB5","Query result: Paula Winter" 
+0

你可以解釋spool&1的工作原理嗎? – angel 2015-04-01 07:16:31

+0

假脫機將輸出路由到文件中,第一個參數('&1')是文件名。您可以創建新文件或附加到現有文件(請參閱http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12043.htm)。 '&1'本身是傳遞到腳本中的第一個參數(請查看_Passing Parameters ...._ at http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch5.htm#CACIIEDF) – Trinimon 2015-04-01 07:28:48

+0

看着你的批處理腳本,我可以認爲還有一個問題:在'sqlplus %% b Trinimon 2015-04-01 07:48:45