gpt4 book ai didi

java - Oracle Java存储过程想知道调用者是谁?

转载 作者:行者123 更新时间:2023-12-01 07:32:24 26 4
gpt4 key购买 nike

我的 Oracle 数据库中有一个 Java 存储过程,我需要知道谁调用了它。我想根据调用它的人做不同的事情。我在网上搜索了这个,但我没有运气。

最佳答案

这是我自己的解决方案。它主要由两个Oracle特性组成:

(1) SYS_CONTEXT function :

SYS_CONTEXT('USERENV', 'SESSION_USER') 返回登录时数据库用户的名称。该值在整个 session 期间保持不变。

SYS_CONTEXT('USERENV', 'CURRENT_USER') 返回其权限当前处于 Activity 状态的数据库用户的名称。

根据目的,可以使用这些函数中的任何一个或两个。在我的示例中,我将同时使用两者。

(2) Server-Side Internal Driver :

服务器端内部驱动程序本质上与 Oracle 数据库和 Java 虚拟机 (JVM) 相关。驱动程序作为与数据库相同的进程的一部分运行。它还在默认 session 中运行,该 session 与启动 JVM 的 session 相同。

据我所知,如果没有此功能,该演示将无法运行。这是因为要运行 SYS_CONTEXT 函数,我需要首先连接到数据库。但是,在这种情况下,我将获得用于连接数据库的相同 SESSION_USER。另一个问题是,我将失去当前函数调用的上下文。我想要的是获取有关当前函数调用的信息。这个功能满足了我的需要。

这是工作示例:

class Demo{

public static java.lang.String getUser()
throws java.sql.SQLException {

java.sql.Statement stmt = null;
java.sql.ResultSet rs = null;

try{
java.sql.Connection con =
java.sql.DriverManager.getConnection("jdbc:default:connection");

java.lang.String query =
"SELECT SYS_CONTEXT('USERENV', 'CURRENT_USER')," +
"SYS_CONTEXT('USERENV', 'SESSION_USER') FROM DUAL";


stmt = con.createStatement();
rs = stmt.executeQuery(query);

rs.next();

return "Current User: [" + rs.getString(1) + "] ; " +
"Session User: [" + rs.getString(2) + "]";
}
finally{
rs.close();
stmt.close();
}

}

}

PL/SQL 包装器代码:

CREATE OR REPLACE FUNCTION MyFunc
RETURN VARCHAR2
AS
LANGUAGE JAVA
NAME 'Demo.getUser() return java.lang.String';

此函数是在 SYS 下创建的,并且该函数的 EXECUTE 权限已授予 SCOTT

执行结果如下:

MYFUNC
----------------------------------
Current User: [SYS] ; Session User: [SCOTT]

关于java - Oracle Java存储过程想知道调用者是谁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16280336/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com