我有一个PL/SQL包(比如package1),它只包含一个过程。此过程用于安全目的,并使用SET_CONTEXT方法存储已登录的应用程序用户。
我还有另一个包(比如package2),其中包含几个与应用程序功能相关的过程,但它们使用SYS_CONTEXT来获取登录用户。
每当我想从Java调用Package2的过程时,我都希望首先执行Package1的过程,然后再执行Package2的过程。原因是我希望这两个调用都发生在同一个数据库连接中。
有没有办法在Oracle中配置它,而不是在每个Package2的过程中重复调用package1的过程。
发布于 2015-05-29 10:14:53
假设您在package1中的过程是公共的(即,在包规范中声明的),并且假设您的package2过程在package1上具有EXECUTE权限,则可能的解决方案之一是使用INITIALIZING PACKAGE。
初始化由包声明末尾的BEGIN语句后到end语句的所有语句组成
例如。
PACKAGE BODY package2
IS
--All your package2 procedures
--initialization section at the end of package2:
BEGIN
package1.procedure1();
END package2;只有当您的会话第一次使用package2 (通过使用其中的任何函数/过程)时,才会运行此初始化部分。如果包被重新编译,它将在同一会话中被重新初始化。
发布于 2015-05-29 13:40:25
解决这个问题的另一种方法是将package1 (package1.procedure1();)的代码放入用户登录触发器中,或者从该触发器中调用该过程;请参阅下面的触发器示例
Example:
CREATE OR REPLACE TRIGGER hr_logon_trigger
AFTER LOGON
ON HR.SCHEMA
BEGIN
-- you code here or call to package1.procedure1();
END;https://stackoverflow.com/questions/30517906
复制相似问题