【问题标题】:Can I keep the session in SQLPlus alive, and reconnect to the same session? BASH-related我可以让 SQLPlus 中的会话保持活动状态,然后重新连接到同一个会话吗? BASH相关
【发布时间】:2014-12-11 10:38:12
【问题描述】:

我在 Bash 中有一个循环,直到今天它都像魅力一样工作。循环看起来像:

while read line1 ; do
    while read line2 ; do
      stringArray=($line2)
      string=$line1.${stringArray[1]}

        sqlplus /nolog <<EOF
        connect sysuser/syspassword@db_instance
        alter system flush shared_pool;
        quit
        EOF

        sqlplus -s /nolog > /dev/null 2>&1  <<EOF
        connect user/password@db_instance
        variable rc refcursor;
        SPOOL ${line1}_${stringArray[0]}.DATA
        exec :rc := $string;
        print rc;
        spool off
        exit
        EOF

    done < file2.txt
done < file1.txt

澄清一点,变量$string的内容是带有函数和参数的Oracle包:

SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',numbers)

现在 - 直到包在一次参数化运行中完成它应该做的事情 - 一切都很好。但是现在我遇到了一个包,它分 5 个步骤完成工作,步骤由最后一个参数确定。它看起来像这样:

SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',1)
SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',2)
SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',3)
SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',4)
SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',5)

第一个以 1 结束,正在生成一个 TEMPORARY_TABLE,其他作业(2 到 5)正在处理该 TEMPORARY_TABLE。作业编号 5 也应该给出整个链条的结果。

直到我让包在 1 步中完成它们的工作,运行这个循环才是完美的。但是TEMPORARY_TABLE 在断开连接后消失了,我不能只在我的 bash 脚本中为这个包添加一个特殊的部分,因为可能有更多的包,具有不同的步骤数。这必须自动完成,不需要使用此脚本的用户付出太多努力。

那么有没有办法让会话保持活跃?或者有没有其他方法可以做到这一点?

【问题讨论】:

  • 在协同进程中运行sqlplus
  • 为每次运行创建一个新的临时表并不是在 Oracle 中使用临时表的正确方法。在 Oracle 中,临时表比在其他一些数据库中更永久。参见例如stackoverflow.com/q/2671518/272735临时是指行的生命周期,而不是表的生命周期。
  • 如果你真的需要不同的 SQL 会话,为什么不做一个普通的表,作为临时表呢?之后您需要手动删除它,但使用不同的会话不会有问题。请注意,您必须确保表的名称非常具体。
  • 不要在脚本中使用硬编码密码。

标签: oracle bash session plsql sqlplus


【解决方案1】:

不要在$string 中只存储一个过程调用,而是尝试将一个匿名块写入变量并执行它。该块可以包含对过程的多次调用(以及其他内容),并且在它们全部完成之前不会返回。

【讨论】:

  • 似乎是个好主意,但我不知道从哪里开始。我应该在$string下存储一个完整的过程,或者更多的过程,比如variable rc refcursor; SPOOL ${line1}_${stringArray[0]}.DATA exec :rc := $string; print rc; spool off
  • 您可以在BEGIN...END 块中编写所需的任何PL/SQL 语句。由于这个块在技术上只是一个字符串,您可以在客户端动态生成它,然后将其发送到服务器执行。然而,需要记住的是它在服务器上运行,因此您不能使用SPOOL 语句(无论如何这是一个SQL*PLUS 语句)。您将不得不使用DBMS_OUTPUT
猜你喜欢
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 2012-03-06
  • 2018-11-26
  • 1970-01-01
  • 2019-06-15
相关资源
最近更新 更多