Oracle 我是否可以使SQLPlus中的会话保持活动状态,并重新连接到同一会话?BASH相关

Oracle 我是否可以使SQLPlus中的会话保持活动状态,并重新连接到同一会话?BASH相关,oracle,bash,session,plsql,sqlplus,Oracle,Bash,Session,Plsql,Sqlplus,我在Bash中有一个循环,直到今天它还像一个符咒一样工作。循环看起来像: while read line1 ; do while read line2 ; do stringArray=($line2) string=$line1.${stringArray[1]} sqlplus /nolog <<EOF connect sysuser/syspassword@db_instance alter sy

我在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
现在——直到软件包在一次参数化运行中完成了它应该做的事情——一切都很好。但是现在我遇到了一个包,它分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结束时,生成一个
临时_表
,其他作业(2到5)在该表上工作。作业编号5也应该给出整个链的结果

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


那么,有没有办法让会话保持活跃?或者还有其他方法吗?

不要在
$string
中只存储一个过程调用,尝试向变量写入一个匿名块并执行它。块可以包含对过程的多个调用(以及其他调用),并且在所有调用完成之前不会返回。

在协进程中运行
sqlplus
。为每次运行创建新的临时表不是在Oracle中使用临时表的正确方法。在Oracle中,临时表比在其他一些数据库中更持久。请参阅,例如,Temporary指的是行的生命周期,而不是表的生命周期。如果确实需要不同的SQL会话,为什么不创建一个用作临时表的常规表呢?之后您需要手动删除它,但是使用不同的会话不会有问题。您必须确保表的名称非常具体。不要在脚本中使用硬编码密码。这似乎是个好主意,但我不知道从哪里开始。我应该存储一个完整的过程,或者更多的过程,比如
variable rc refcursor;SPOOL${line1}{stringArray[0]}。数据执行:rc:=$string;打印rc;在
$string
下关闭
?您可以在
开始…结束
块中编写所需的任何PL/SQL语句。由于这个块在技术上只是一个字符串,您可以在客户机上动态生成它,然后将其发送到服务器执行。但是,需要记住的是,它是在服务器上运行的,因此不能使用
SPOOL
语句(无论如何,这是一个SQL*PLUS语句)。您必须使用
DBMS\u输出
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)