2015-03-31 50 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