Needs to execute one sql query against two Oracle DBs in shell script at a time and export the data to separate csv files

為{幸葍}努か 提交于 2020-07-31 04:19:03

问题


I have file1.sh file and which internally needs to execute one sql query against two Oracle DBs at a same time and needs to export date to csv fiiles, below is the sample shellscript which executes the query against two dbs.

    ....
    #!bin/bash
set -X
        sqlplus -S ${user1}@${DBCONNECTIONNAME_1}/${Pwd} Datesquery.sql & >> ${Targetdirectory}/csvfile1.csv
                         sqlplus -S ${user1}@${DBCONNECTIONNAME_2}/${Pwd} Datesquery.sql & >> ${Targetdirectory}/csvfile2.csv
                         sed 1d csvfile2.csv > file2noheader.csv
                         cat csvfile1.csv file2noheader.csv > ${Targetdirectory}/Expod.csv
    ....

But it does not connect to DB and does not execute any query and simply displays sqlplus manual as how to use the connection string, please let me know how to call one query against two dbs and execute them in parrallay and binds output to separate csv files.


回答1:


A given sqlplus session can only connect to one db at a time, so your requirement 'at the same time' is essentially a non-starter. If 'at the same time' really means 'sequentially, in the same script, then you are back to fixing your connect string. And at that you 'have more errors than an early Mets game' (with apologies to any NY Mets fans).

First, your script indicates that your sqlplus command is the very first actual command following specification of your shell processor and 'set -x'. Yet you make heavy use of environment variables as substitutions for username, password, and connection name - without ever setting those variables.

Second, your use of an '&' in the command line is totally confusing to both me and the parser.

Third, you need to preceed your reference to the sql script with '@'.

Fourth, your order of elements in the command line is all wrong.

Try this

#!/bin/bash
orauser1=<supply user name here>
orapw2=<supply password here>
oradb_1=<supply connection name of first database>
#
orauser1=<supply user name here>
orapw2=<supply password here>
oradb_1=<supply connection name of first database>
#
Targetdirectory=<supply value here>
#
sqlplus -S ${orauser1}/${orapw1}@${oradb_1} @Datesquery.sql >> ${Targetdirectory}/csvfile1.csv

sqlplus -S ${orauser2}/${orapw2}@${oradb_1} @Datesquery.sql >> ${Targetdirectory}/csvfile2.csv



回答2:


Or create a database link form one DB to other and then run both sqls in one db, one over DB link.

select * from tab1 union select * from tab1@db_link



来源:https://stackoverflow.com/questions/63135837/needs-to-execute-one-sql-query-against-two-oracle-dbs-in-shell-script-at-a-time

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