2010-12-10 61 views
0

我们最近将从Oracle帐户开发的一个数据库更改为LDAP登录帐户,并且对于访问系统的员工使用的前端进行了很好的改进。但是,我们有第二种限制管理人员进入数据库的方法,并且使用dbms_scheduler调用大量处理。Oracle全球临时表和使用存储过程和功能

大多数数据库表都有一个created_by列,默认从sys_context获取其用户名,但是当数据从dbms_scheduler运行时,此信息不可用,因此created_by列全部使用APP_GLOBAL填充。

我设法用sys_context值填充全局临时表(GTT),并使用它从dbms_scheduler调用的存储过程填充created_by,所以我的下一个逻辑步骤是将它放入函数中并调用它它可以在整个系统中使用,甚至可以在插入前触发引用。

问题是,将代码放入函数中时未找到来自GTT的数据。该表被设置为保留行。

我已经拖网许多网站的答案,但没有发现任何帮助我任何人都可以在这里提供解决方案?

回答

0

调度程序将使用与创建作业的会话不同的会话 - preserve rows不会使GTT数据在不同会话中可见。

我假设created_by列有一个默认值,如nvl(sys_context(...),'APP_GLOBAL')。考虑将用户名作为参数传递给作业,并将上下文设置为作业的第一步。

+0

杰克,我已经成功地填充了与dbms_scheduler相同的会话的GTT,并且可以从中进行选择。我将代码放入函数中,以便可以从调度程序运行的所有存储过程引用它,但是在引用该函数时,不会返回来自GTT的数据。你对created_by的假设几乎是正确的,表达式是列的默认值,不在触发器中。 – Colin 2010-12-10 09:58:50

+0

@Colin对不起 - 对触发器的引用是一个错字 – 2010-12-10 10:11:06

+0

@Colin调度程序将为它运行的每个作业使用不同的会话 – 2010-12-10 10:12:01

0

周末休息一下,仔细查看我的代码,发现我的语法中存在一个致命的缺陷,即从GTT中选择数据永远不会发生。一个快速的调整和重新编译,一切都很好。

杰克,谢谢你的帮助。