使用SET_CONTEXT和SYS_CONTEXT

时间:2015-05-28 22:09:11

标签: plsql

我有一个PL / SQL包(比如package1),它只包含一个过程。此过程用于安全目的,并使用SET_CONTEXT方法存储登录用户的应用程序。

我有另一个包(比如package2),它包含几个与应用程序功能相关的过程,但是它们使用SYS_CONTEXT来获取登录用户。

每当我想从Java调用package2的程序时,我首先要执行package1的程序,然后再执行package2的程序。原因是我希望这两个调用都发生在同一个数据库连接中。

有没有办法在Oracle中配置它,而不是在每个package2的程序中重复调用package1的过程。

2 个答案:

答案 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;