Plsql 使用SET\u上下文和SYS\u上下文

Plsql 使用SET\u上下文和SYS\u上下文,plsql,Plsql,我有一个PL/SQL包,比如package1,它只包含一个过程。此过程用于安全目的,并使用SET_CONTEXT方法存储用户登录的应用程序 我有另一个包,比如package2,它包含几个与应用程序功能相关的过程,但是它们使用SYS_上下文来获取登录用户 每当我想从Java调用package2的过程时,我都希望首先执行package1的过程,然后再执行package2的过程。原因是我希望这两个调用都发生在同一个数据库连接中 有没有办法在Oracle中进行配置,而不是在每个package2的过程中重

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

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

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


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

假设package1中的过程是公共的,即在package规范中声明的,并且假设package2过程对package1具有执行权限,其中一个可能的解决方案是使用

初始化由包声明末尾的BEGIN语句之后到end语句的所有语句组成

PACKAGE BODY package2
IS
   --All your package2 procedures

--initialization section at the end of package2:
BEGIN
   package1.procedure1();
END package2;

此初始化部分将仅在会话第一次使用包2时通过其中的任何函数/过程运行。如果重新编译包,则会在同一会话中重新初始化包。

解决此问题的另一种方法是包1 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;

谢谢你的建议。但是,我还需要将一个值作为参数传递给package1.procedure1。该值将在调用另一个过程时从Java发送。如果可能的话,请告诉我。谢谢你的建议。但是,我还需要将一个值作为参数传递给package1.procedure1。该值将在调用另一个过程时从Java发送。请让我知道这是否可行。我认为另一种方法是,如果java用户正在执行任何dml,那么您可以在特定的表上编写触发器,并从该触发器调用此过程;无需调用此过程表单代码。