我可以让 SQLPlus 中的会话保持活动状态,然后重新连接到同一个会话吗? BASH相关

Posted

技术标签:

【中文标题】我可以让 SQLPlus 中的会话保持活动状态,然后重新连接到同一个会话吗? BASH相关【英文标题】:Can I keep the session in SQLPlus alive, and reconnect to the same session? BASH-related 【发布时间】: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 中,临时表比在其他一些数据库中更永久。参见例如***.com/q/2671518/272735临时是指行的生命周期,而不是表的生命周期。 如果你真的需要不同的 SQL 会话,为什么不做一个普通的表,作为临时表呢?之后您需要手动删除它,但使用不同的会话不会有问题。请注意,您必须确保表的名称非常具体。 不要在脚本中使用硬编码密码。 【参考方案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

以上是关于我可以让 SQLPlus 中的会话保持活动状态,然后重新连接到同一个会话吗? BASH相关的主要内容,如果未能解决你的问题,请参考以下文章

服务器断开连接后如何在 Spring MVC 中保持客户端会话处于活动状态

让会话无限期地保持活跃状态

保持 php 会话处于活动状态并可以从 jquery 访问

排查oracle会话非活动状态的语句

从使用 axios 调用响应启动 php 会话不会使会话保持活动状态,但使用邮递员执行它就可以了

如何防止 Ajax 调用使会话保持活动状态?