这是我的shell脚本。
echo "Start";echo @/opt/apps/Tests/SQLDir/Test1.sql | sqlplus Db1/Db1@//maydomain:port/abc;echo "Finish";
echo "Start";echo @/opt/apps/Tests/SQLDir/Test2.sql | sqlplus Db1/Db1@//maydomain:port/abc;echo "Finish";
我有30个这样的.sql文件,添加在一个.sh文件中,结果是30个.csv文件。
Test1.sql有
SPOOL /opt/apps/Tests/OF/output1.csv REPLACE;
select name from username where id = 10 and Sname is not NULL and ROWNUM < = 50000;
Test2.sql有
SPOOL /opt/apps/Tests/OF/output2.csv REPLACE;
select strname,ctyname from addr where city = 'NYC' and ROWNUM < = 50000;
我在output1.csv中的预期OP是
name
Abc
xyz
pqr
我在output2.csv中预期的OP是
strname | ctyname
10-AP NYC
11-KP MCH
90-ZP SDK
sqlplus Db1
name
-------------------------------
Abc
xyz
pqr
name
-------------------------------
TYU
KLH
50000 rows selected.
SQL>
那么有什么办法可以用shell脚本ql代码删除这些额外的行[------------------------------------------50000行选择。而在执行shell脚本时,所有的sql结果行都被打印在屏幕上。 如何避免这种情况?
下面的SQL*Plus命令应该可以完成这项工作。
set markup csv on delimiter ' ' quote off
set feedback off
我必须说,你把脚本名称传给sqlplus的方法是我见过的最奇怪的。 通常的做法(考虑到你们的名字)应该是。
sqlplus Db1/Db1@//maydomain:port/abc @/opt/apps/Tests/SQLDir/Test1.sql
sqlplus Db1
在我看来,你在脚本中想要的应该是
set echo off trimsp on head off pagesize 0
spool /opt/apps/Tests/OF/output2.csv replace
select strname,ctyname from addr where city = 'NYC' and ROWNUM < = 50000;
spool off
另外,'spool'是一个sqlplus命令--是sqlplus本身的指令,而不是sql语句。 因此,它不需要在结尾处使用分号。--编辑在sqlplus命令行使用环境变量的例子。
username=scott
userpw=tiger
server=myserver
port=1521
dbname=mydb
sqlplus $username/$userpw@//$server:$port/$dbname
虽然我会质疑为什么你需要把它们设置为变量.而且我更喜欢使用tnsnames而不是ezconnect.