我有一个PL / SQL包(比如package1),它只包含一个过程。此过程用于安全目的,并使用SET_CONTEXT方法存储登录用户的应用程序。
我有另一个包(比如package2),它包含几个与应用程序功能相关的过程,但是它们使用SYS_CONTEXT来获取登录用户。
每当我想从Java调用package2的程序时,我首先要执行package1的程序,然后再执行package2的程序。原因是我希望这两个调用都发生在同一个数据库连接中。
有没有办法在Oracle中配置它,而不是在每个package2的程序中重复调用package1的过程。
答案 0 :(得分:0)
假设您在package1
中的程序是公开的(即在程序包规范中声明),并假设您的package2
程序在EXECUTE
上具有package1
权限,则其中一个可能的解决方案是使用INITIALIZING PACKAGE。
初始化包含在包声明结束时B语句之后的所有语句到END语句
实施例。
PACKAGE BODY package2
IS
--All your package2 procedures
--initialization section at the end of package2:
BEGIN
package1.procedure1();
END package2;
此初始化部分将仅在您的会话第一次使用package2时运行(通过使用其中的任何函数/过程)。如果重新编译它,将在同一会话中重新初始化该包。
答案 1 :(得分:0)
解决此问题的另一种方法是将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;