我可以让 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 中保持客户端会话处于活动状态