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

Posted

技术标签:

【中文标题】Oracle Java 存储过程想知道调用者是谁?【英文标题】:Oracle Java Stored Procedure wants to know who is the caller? 【发布时间】:2013-04-29 13:48:18 【问题描述】:

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

【问题讨论】:

我的 Oracle 数据库中的 Java 存储过程 ? 看看这些:***.com/questions/250792/…***.com/questions/8159127/… 你需要知道的是什么? @AlfredoFerreira 我在当前执行的上下文中需要此信息。 我觉得这有点奇怪。首先,您发布了一个问题,说明“我在网上搜索了它,但没有运气”,3 分钟后您发布了对您自己问题的广泛答案? 【参考方案1】:

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

(1)SYS_CONTEXT function:

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

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

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

(2)Server-Side Internal Driver:

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

据我所知,如果没有此功能,此演示将无法运行。那是因为要运行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]

【讨论】:

以上是关于Oracle Java 存储过程想知道调用者是谁?的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 存储函数

oracle数据库之存储函数和过程

oracle存储过程代码日志记录

PL/SQL轻量版——存储函数/存储过程

SQL Server 存储过程向其调用者报告进度,一个 Access (VBA DAO) 传递查询

Snowflake /当存储过程作为OWNER执行时如何获取原始调用者