【发布时间】:2017-03-20 16:47:42
【问题描述】:
我问了一个问题,可能看起来与这个问题相似,但它是关于不同的东西。
假设我没有权限从运行 Oracle 软件包的帐户运行 ALTER SYSTEM FLUSH SHARED_POOL。
另一方面,我可以访问有权运行ALTER SYSTEM FLUSH SHARED_POOL 的帐户,但我无法从该帐户运行Oracle 软件包。有点搞混了,不过现在就这样吧。
现在,我有一个 Bash 脚本,让我假设它在当前版本中以这种方式运行包:
负责flush的部分:
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 必须在精确的时刻运行......我只是不知道如何解决这个问题,它是足以让天使哭泣。
【问题讨论】:
-
这是一个架构问题,而不是技术问题。我在想的第一件事是:为什么你必须做所有这些事情,而你可能只有一个用户可以运行上述所有内容,作为那个用户?使用 SYSDBA 不应与数据操作混合使用,因此您知道应该使用哪个用户。您是否问过您的 DBA 为什么他不想给您“用户”所需的权限?是什么原因?
-
这方面有什么更新吗?
-
@tvCa - 管理员授予我从我的数据库用户运行
alter system flush shared_pool的权限,现在一切都很好:) -
这正是您需要的解决方案..
标签: oracle bash session sqlplus