Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何使用批处理脚本格式化sql结果_Oracle_Batch File - Fatal编程技术网

Oracle 如何使用批处理脚本格式化sql结果

Oracle 如何使用批处理脚本格式化sql结果,oracle,batch-file,Oracle,Batch File,我正在编写批处理脚本来连接不同的数据库,并为每个数据库执行相同的SQL脚本。 我希望输出为: "db_name1","Query_result: "xyz" "db_name2","Query_result: abc" "db_name3","Query_result: lmn" 但是现在在Query\u result中,spool之后的所有内容,甚至sql查询也会附加到结果中。 我只想在第一列显示数据库名称,在第二列显示查询结果。第二列可能有多行或多列显示结果,即假设查询结果包含多个用户名,

我正在编写批处理脚本来连接不同的数据库,并为每个数据库执行相同的SQL脚本。 我希望输出为:

"db_name1","Query_result: "xyz"
"db_name2","Query_result: abc"
"db_name3","Query_result: lmn"
但是现在在
Query\u result
中,spool之后的所有内容,甚至sql查询也会附加到结果中。 我只想在第一列显示数据库名称,在第二列显示查询结果。第二列可能有多行或多列显示结果,即假设查询结果包含多个用户名,则每个用户名应位于不同的行中

这是我的批处理脚本

@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;
而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
请尽快帮助我。
谢谢。

使用sqlplus的
-S
选项,这样它就不会打印连接到等的

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-S%%b
而不是

sqlplus %%b < mysql.sql 
sqlplus%%b
可能是和/或有助于:

查看更多信息

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;
因此,只需循环遍历条目,并以文件名和数据库名作为参数启动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"

您当前的输出是什么样子的?当前在我的输出中,包括所有内容,如连接到数据库,然后查询,结果n,然后从数据库断开连接。请再次检查问题我已对其进行了一些更改。spool将输出路由到一个文件中,第一个参数(
&1
)是文件名。您可以创建新文件或附加到现有文件(请参见)
&1
本身是传递到脚本中的第一个参数(检查传递参数…)查看批处理脚本,我认为仍然存在一个问题:spool in
sqlplus%%b
可以将输出附加到文件中;但是,批处理脚本本身已经打开了文件。因此,让我建议一个小小的改变…您可以根据自己的喜好设置行的格式。我做了一个小的调整,所以输出与您在问题中得到的结果相似
TRIMSPOOL ON
删除尾随空格,如果行大小为32000个字符,效果会更好;)对不起,雷内,我做了一些改变,还加了一句,非常感谢
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;
"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"