【问题标题】:How to get plain formatted output in csv with shell script for oracle sql query如何使用用于 oracle sql 查询的 shell 脚本在 csv 中获取纯格式输出
【发布时间】:2020-09-22 07:48:06
【问题描述】:

这是我的 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

现在我在 csv 中变得奇怪 o/p

name
-------------------------------
Abc
xyz 
pqr

name
-------------------------------
TYU
KLH

50000 rows selected.
SQL>

那么有什么方法可以用 shell 脚本/sql 代码删除那些额外的行 [--------- 和 50000 行。]? 在执行 shell 脚本时,所有 sql 结果行都打印在屏幕上。 如何避免这种情况? 提前致谢。

【问题讨论】:

标签: oracle shell csv sqlplus


【解决方案1】:

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

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

【讨论】:

  • stackoverflow.com/users/10726850/pifor 试过这个。但它仍然在 csv 中多次给出 name 和下面的 ---------------------------- 行.并且在文件的末尾有 14291 行被选中。SQL> 又写了一遍
  • 您不能删除显示为标题的列名。但它们不应与--- ... --- 一起显示。我无法重现这一点。用set feedback offSQL*Plus 不应该显示行数。
  • @pifor - “您不能删除显示为标题的列名。”。你当然可以。只是“设置标题关闭”。并且为了避免分页符,“设置 pagesize 0”。
  • @EdStevens:是的。谢谢。
【解决方案2】:

我必须说,您将脚本名称传递给 sqlplus 的方法是我见过的最奇怪的方法。通常的做法(根据你的名字)是:

 sqlplus Db1/Db1@//maydomain:port/abc  @/opt/apps/Tests/SQLDir/Test1.sql

我看不到您的“回声开始”和“回声完成”在哪里完成任何事情,因为没有随之而来的澄清信息。

在我看来,你想要的脚本应该是

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。

【讨论】:

  • stackoverflow.com/users/5732537/edstevens 您能否建议将变量存储值作为数据库名称、密码、端口、数据库名称等传递给 sqlplus 的方法。我试过这个DBUN=DB1 DBPW= DB1 Domain=maydomain Port=1521 DBName=abc 并用作sqlplus "${DBUN}"/${DBPW}"@//${Domain}":${Port}"/${DBName}" @/opt/apps/Tests/SQLDir/Test1.sql 但它抛出一个_无效选项错误_
  • 很难说没有在上下文中看到错误消息。我必须说你继续想出我见过的最奇怪的语法。请参阅我的更新答案以获取格式化示例。
猜你喜欢
  • 2020-04-23
  • 2015-02-28
  • 2023-01-18
  • 2019-05-14
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
相关资源
最近更新 更多