Pass values read from a file as input to an SQL query in Oracle

元气小坏坏 提交于 2019-12-01 14:18:45
codeforester

Here is the right way to use the heredoc <<, along with the choice of while read instead of for to read the file:

#!/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

See also:

The solution given by @codeforester works. However I was unable to use it because it created as many DB connections as the number of lines in your file which is a potential impact.

To overcome this, I chose the below solution which may not be ideal but does the job with just one DB connection.

Considering the same data in file.txt

 12354
 13456
 13498

I used the below sed command to populate the above to a single variable "12354,13456,13498"

myvariable=$(echo "`cat file.txt | sed '$!s/$/,/g' | tr -d '\n' | tr -d ' '`")

Now below script will pass this variable to the SQL query and spool the data into a text file:

#!/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

The output is stored in dboutput.txt (along with the SQL query)

cat dboutput.txt
SQL>   select column1 from table_name where id in (12354,13456,13498);

NAME
----------------------------------------------------------------------------  ----
data1
data2
data3

SQL> spool off
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!