我在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)正在工作。作业号5也应该给出整个链的结果。
直到我让包在一步完成他们的工作,运行这个循环是完美的。但是TEMPORARY_TABLE
在断开连接之后就消失了,我不能只在这个包中为我的bash脚本添加一个特殊的部分,因为可能有更多的包,步数不同。这必须自动完成,而不需要使用此脚本的用户付出太多努力。
那么有没有办法保持会话活着?或者还有其他方法吗?
答案 0 :(得分:0)
不要在$string
中只存储一个过程调用,而是尝试将匿名块写入变量并执行该变量。该块可以包含对程序的多次调用(以及其他内容),并且在完成所有操作之前不会返回。