#cat file.txt
12354
13456
13498
#!/bin/bash
for i in `cat file.txt`
do
sqlplus XXXXX/XXXXX@DB_NAME << EOF
select *from TABLE_NAME where id="$i"
EOF
done
这对我不起作用。帮助我如何解决这个问题。
答案 0 :(得分:1)
@codeforester给出的解决方案有效。但是我无法使用它,因为它创建了与文件中的行数一样多的数据库连接,这可能会产生影响。
为了解决这个问题,我选择了下面的解决方案,这可能并不理想,只需要一个数据库连接即可完成工作。
考虑file.txt中的相同数据
ValueFilter("val1")
ColumnFilter("val2")
ValueFilter("val3")
我使用下面的sed命令将上面的内容填充到单个变量&#34; 12354,13456,13498&#34;
12354
13456
13498
现在,下面的脚本会将此变量传递给SQL查询,并将数据假脱机到文本文件中:
myvariable=$(echo "`cat file.txt | sed '$!s/$/,/g' | tr -d '\n' | tr -d ' '`")
输出存储在dboutput.txt(以及SQL查询)
中#!/bin/bash
myvariable=$(echo "`cat file.txt | sed '$!s/$/,/g' | tr -d '\n' | tr -d ' '`")
echo @myvariable
sqlplus /nolog << EOF
CONNECT user@dbname/dbpassword
SPOOL dboutput.txt
select column1 from table_name where id in ($myvariable);
SPOOL OFF
EOF
答案 1 :(得分:0)
以下是使用heredoc <<
以及选择while read
而不是for
来阅读文件的正确方法:
#!/bin/bash
while read -r value; do
sqlplus xxxxx/xxxxx@db_name << EOF
select * from table_name where id='$value';
# make sure heredoc marker "EOF" is not indented
EOF
done < file.txt
另见:
BashFAQ001了解为什么for
循环不是从文件中读取文本行的最佳方式。