Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何向Oracle触发器发送任意参数?_Java_Oracle_Jdbc_Plsql - Fatal编程技术网

Java 如何向Oracle触发器发送任意参数?

Java 如何向Oracle触发器发送任意参数?,java,oracle,jdbc,plsql,Java,Oracle,Jdbc,Plsql,其目的是从web应用程序向触发器发送额外信息,如当前用户id。既然使用了连接池,并且所有连接都使用相同的用户id,那么如何传递原始web用户id以触发?我需要在不接触应用程序代码的情况下实现这一点。它是一个基于java的应用程序 John您可以使用软件包跟踪web用户: create package web_user_pkg is procedure set_username (p_username varchar2); function username return va

其目的是从web应用程序向触发器发送额外信息,如当前用户id。既然使用了连接池,并且所有连接都使用相同的用户id,那么如何传递原始web用户id以触发?我需要在不接触应用程序代码的情况下实现这一点。它是一个基于java的应用程序


John

您可以使用软件包跟踪web用户:

create package web_user_pkg is

    procedure set_username (p_username varchar2);

    function username return varchar2;

end;

create package body web_user_pkg is

    g_username varchar2(30);

    procedure set_username (p_username varchar2)
    is
    begin
        g_username := p_username;
    end;

    function username return varchar2 is
    begin
        return g_username;
    end;

end;
在网页中,在执行任何DML或其他程序包调用之前,使用当前用户的ID调用web_user_pkg.set_username


在触发器中,使用web\u user\u pkg.username获取web用户名。

您可以使用client\u identifier会话变量将应用程序用户传递给触发器

连接到数据库后按如下方式进行设置:

  CALL dbms_session.set_identifier('<<username>>');
有关更多信息,请参见您可以使用Oracle的


这似乎是一个很好的解决办法。此程序包变量是否在其他连接中共享?否,它是该连接的唯一变量。如果不同的最终用户共享相同的数据库状态,则连接池将不可用!只是澄清一下,如果有10个数据库会话,那么即使有50个应用程序最终用户,也最多有10个并发数据库状态。连接池的作用是共享这些数据库会话。应用程序将在事务期间获取一个连接/会话。对于同一个应用程序最终用户的后续事务,它不一定使用相同的连接。如果您只需要将少数几个相对常见的属性中的一个传递给触发器,则这种方法是有效的。然而,Vincent使用上下文的方法允许传递任意参数。谢谢,在我陷入困境时帮了我很大的忙!我只想提一下,在第一行代码的所有大写字母中使用“USERNAME”一词有点让人困惑。它看起来像是字面意思,但实际上,它是登录应用程序用户的用户ID的代理,您希望将其发送到触发器。第二行代码是文字,假设您希望“username”是保存已登录应用程序用户的用户ID的变量。您是对的。迟做总比不做好:我已经改正了。
  SELECT sys_context('USERENV','CLIENT_IDENTIFIER') INTO username FROM DUAL;
SQL> CREATE OR REPLACE PACKAGE test_pkg AS
  2     PROCEDURE set_context(p_attribute VARCHAR2, p_value VARCHAR2);
  3  END test_pkg;
  4  /

Package created
SQL> CREATE OR REPLACE PACKAGE BODY test_pkg AS
  2     PROCEDURE set_context(p_attribute VARCHAR2, p_value VARCHAR2) IS
  3     BEGIN
  4        dbms_session.set_context('test_ctx', p_attribute, p_value);
  5     END;
  6  END test_pkg;
  7  /

Package body created

SQL> create context test_ctx using test_pkg;

Context created

SQL> exec test_pkg.set_context ('user_id', 'Vincent');

PL/SQL procedure successfully completed

SQL> select sys_context('test_ctx', 'user_id') from dual;

SYS_CONTEXT('TEST_CTX','USER_I
--------------------------------------------------------------------------------
Vincent