并行SqlPlus会话或在断开连接后保持会话处于活动状态

时间:2014-12-12 08:50:44

标签: oracle bash session sqlplus

我问了一个类似于这个问题的问题,但它的内容与之不同。

让我们假设我没有权限从我运行Oracle软件包的帐户运行ALTER SYSTEM FLUSH SHARED_POOL

另一方面,我可以访问一个有权运行ALTER SYSTEM FLUSH SHARED_POOL的帐户,但是从那个角度来看,我无法运行Oracle软件包。有点混乱,但这就是现在的情况。

现在,我有一个Bash脚本,让我假设它在当前版本中以这种方式运行包:

负责冲洗的部分:

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

负责包裹的部分:

sqlplus user/password@db_instance @sqlfile.sql

sqlfile.sql(尽可能简化):

variable rc refcursor;
exec :rc := package.function(parameter,parameter,parameter);
print rc;
exit

直到一切看起来都像这样 - 它运作正常。但是有一些例子,当我必须一个接一个地运行几个包时,因为它们依赖于保存在TEMPORARY_TABLE中的每个其他输出数据。 我绝对相信,当断开连接时,至少会刷新 TEMPORARY TABLE 中的数据。因此,即使断开连接后TEMPORARY_TABLE保持活动状态,数据也会丢失。多包sqlfile.sql的示例:

variable rc refcursor;
exec :rc := package.function(parameter,parameter,1);
print rc;
variable rc refcursor;
exec :rc := package.function(parameter,parameter,2);
print rc;
variable rc refcursor;
exec :rc := package.function(parameter,parameter,3);
print rc;
exit

因为我正在做的是用于Oracle软件包输出和性能的测试目的,所以我必须运行

alter system flush shared_pool

每次exec :rc := package.function(parameter,parameter,parameter)发生后。如果只有一个,那没问题。但如果有很多,他们互相依赖......问题就会开始发生。

sqlplus /nolog << EOF

connect user/password@db_instance
variable rc refcursor;
exec :rc := package.function(parameter,parameter,1);
print rc;
connect sysuser/syspassword@db_instance
alter system flush shared_pool;

connect user/password@db_instance
variable rc refcursor;
exec :rc := package.function(parameter,parameter,2);
print rc;
connect sysuser/syspassword@db_instance
alter system flush shared_pool;

connect user/password@db_instance
variable rc refcursor;
exec :rc := package.function(parameter,parameter,3);
print rc;
connect sysuser/syspassword@db_instance
alter system flush shared_pool;

exit
EOF

脚本本身正在运行 - 但TEMPORARY_TABLE的数据丢失了。

我考虑过在bash中并行运行两个sqlplus命令,但 flush 必须在精确的时刻运行......我只是不知道如何解决这个问题,这足以让天使哭泣。

1 个答案:

答案 0 :(得分:0)

admin授予我从我的数据库用户运行alter system flush shared_pool的权限,现在一切都很好:)                      - dziki