在 bash 脚本中循环 sql 查询

Posted

技术标签:

【中文标题】在 bash 脚本中循环 sql 查询【英文标题】:loop sql query in a bash script 【发布时间】:2011-02-01 06:07:14 【问题描述】:

我需要使用 bash 循环一个 oracle sqlplus 查询。

我的情况是这样的。我在一个文本文件中有一组名称,我需要使用 sqlplus 查询找出这些名称的详细信息。

textfile.txt 内容:

john
robert
samuel
chris

bash 脚本

#!/bin/bash

while read line
do
/opt/oracle/bin/sqlplus -s user@db/password @query.sql $line
done < /tmp/textfile.txt

sql查询:query.sql

set verify off
set heading off
select customerid from customers where customername like '%&1%';
exit

问题是当我运行脚本时出现类似的错误

SP2-0734:未知命令开始 "robert..." - 其余行被忽略。

谁能告诉我如何解决这个问题?

【问题讨论】:

通常最好执行一个大查询并避免sql循环 确实如此。看起来 OP 正在尝试重新发明保存在文本文件中的存储过程。 【参考方案1】:

我一直这样做的方式如下:

#!/bin/bash

cat textfile.txt |while read Name
do
sqlplus -s userid/password@db_name > output.log <<EOF
set verify off 
set heading off 
select customerid from customers where customername like '%$Name%'
/
exit
EOF

Bash 会自动为每一行神奇地扩展 $Name 并将其放入 sql 命令中,然后再将其发送到 sqlplus

【讨论】:

【参考方案2】:

你有set define on 吗?你的通配符是&amp; 吗?您可以查看glogin.sql 了解。

是的,建立n 连接以传递n 查询可能不是一个好的解决方案。也许你的开发速度更快,你会这样做一次,但如果不是,你也许应该考虑制定一个程序。

【讨论】:

以上是关于在 bash 脚本中循环 sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何避免作为 sql 查询输出的一部分返回的字符串值被拆分为 bash/shell 脚本中数组中的不同字段

如何从sqlplus到bash脚本获取SQL查询输出

在脚本中迭代/循环 Spark parquet 文件会导致内存错误/堆积(使用 Spark SQL 查询)

与服务器同时运行循环 bash 脚本?

如何在带有 for 循环的 bash 脚本中使用标志?

bash脚本循环