【问题标题】:Needs to execute one sql query against two Oracle DBs in shell script at a time and export the data to separate csv files需要在 shell 脚本中一次对两个 Oracle DB 执行一个 sql 查询,并将数据导出到单独的 csv 文件
【发布时间】:2020-11-17 15:46:55
【问题描述】:

我有 file1.sh 文件,内部需要同时对两个 Oracle DB 执行一个 sql 查询,并且需要将日期导出到 csv 文件,下面是对两个 db 执行查询的示例 shellscript。

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

但它没有连接到数据库,也没有执行任何查询,只是将sqlplus手册显示为如何使用连接字符串,请告诉我如何对两个数据库调用一个查询并在parrallay中执行它们并将输出绑定到单独的 csv 文件。

【问题讨论】:

    标签: linux oracle shell unix sqlplus


    【解决方案1】:

    给定的 sqlplus 会话一次只能连接到一个数据库,因此您的“同时”要求本质上是一个非首发。如果“同时”真的意味着“按顺序在同一个脚本中”,那么您将返回修复您的连接字符串。而且你“比早期的大都会队比赛犯了更多的错误”(向任何纽约大都会队的球迷道歉)。

    首先,您的脚本表明您的 sqlplus 命令是遵循您的 shell 处理器和“set -x”规范的第一个实际命令。然而,您大量使用环境变量来替换用户名、密码和连接名称 - 却从未设置这些变量。

    其次,你在命令行中使用“&”让我和解析器都感到困惑。

    第三,你需要在引用sql脚本之前加上'@'。

    第四,你在命令行中的元素顺序都是错误的。

    试试这个

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

    【讨论】:

    • 嗨@Edstevens,我使用Db.prop 文件来声明用户、密码和目标目录,并在shell 脚本文件中使用源命令来引用配置文件
    • 没有看到您在哪里采购了任何外部环境。文件。无论如何,除此之外,您的 sqlplus 命令行语法不正确,如您所询问的错误所示。我在回答中提供了正确的语法。
    • @Edstevenes,感谢您的回复。我有配置文件并使用源命令获取道具数据库连接字符串,现在它正在连接到数据库,但给出了./script2.sh:第 105 行:/temp/test_sql/sqlextracted/data/csvfile1.csv:没有这样的文件或目录 ./script2.sh:第 106 行:/temp/test_sql/sqlextracted/data/csvfile2.csv:没有这样的文件或目录,我在上面使用了在 sql 查询中包含 spool 命令并且它可以工作,但是当我将输出定向到shell 脚本,它会抛出错误消息。
    • 这里没有人知道 ./script2.sh 中有什么。你能调试你看不到的代码吗?很明显,你给我们的只是一个非常小的 sn-p。
    【解决方案2】:

    或者创建一个从一个 DB 到另一个 DB 的数据库链接,然后在一个 db 中运行两个 sql,一个通过 DB 链接。

    从 tab1 中选择 * 联盟 select * from tab1@db_link

    【讨论】:

      猜你喜欢
      • 2012-11-24
      • 2021-12-19
      • 2020-12-04
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 2018-01-19
      • 2016-10-03
      相关资源
      最近更新 更多