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

前端 未结 2 860
囚心锁ツ
囚心锁ツ 2021-01-17 05:31
#cat file.txt
 12354
 13456
 13498

#!/bin/bash
for i in `cat file.txt`
do
    sqlplus XXXXX/XXXXX@DB_NAME << EOF 
        selec         


        
相关标签:
2条回答
  • 2021-01-17 05:56

    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.

    0 讨论(0)
  • 2021-01-17 06:07

    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
    
    0 讨论(0)
提交回复
热议问题