如何用shell脚本获取csv中的纯格式输出,用于oracle sql查询。

问题描述 投票:0回答:1

这是我的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结果行都被打印在屏幕上。 如何避免这种情况?

oracle shell csv sqlplus
1个回答
0
投票

下面的SQL*Plus命令应该可以完成这项工作。

 set markup csv  on delimiter ' ' quote off
 set feedback off

0
投票

我必须说,你把脚本名称传给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.

© www.soinside.com 2019 - 2024. All rights reserved.