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

余生长醉 提交于 2019-12-30 13:42:11

问题


#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

This is not working for me. Help me how I can solve this.


回答1:


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:

  • How can I write a here doc to a file in Bash script?

  • BashFAQ001 to understand why for loop is not the best way to read text lines from a file.




回答2:


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


来源:https://stackoverflow.com/questions/42407325/pass-values-read-from-a-file-as-input-to-an-sql-query-in-oracle

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