将从文件读取的值作为输入传递给Oracle中的SQL查询

时间:2017-02-23 04:53:38

标签: oracle bash unix sqlplus

#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

这对我不起作用。帮助我如何解决这个问题。

2 个答案:

答案 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

另见: