使用 JDBC 编译函数或过程会从 all_statements 视图中删除所有记录

Compiling a function or procedure using JDBC removes all records from all_statements view

在我 execute/compile 存储的 procedure/function 之后,我查询 all_statements 视图以提取存储的 procedure/function 中的语句,如下所示:

select * from all_statements where owner = 'MY_USER' and object_name='MY_FUNCTION' and object_type='FUNCTION' order by line asc;

但是,我的一个应用运行下面的代码:

    try (Connection con = DriverManager.getConnection(url,username,password); Statement statement = con.createStatement();) {
        statement.execute("ALTER FUNCTION MY_FUNCTION COMPILE");
    } catch (Exception e) {
        LOGGER.error("error while executing query: {}", query, e);
    }

只要此代码为 运行,就会清除 all_statements 视图。即使我执行如下相同的功能:

    try (Connection con = DriverManager.getConnection(url,username,password); Statement statement = con.createStatement();) {
        statement.execute("SELECT MY_FUNCTION(123) FROM DUAL");
    } catch (Exception e) {
        LOGGER.error("error while executing query: {}", query, e);
    }

all_statements 中没有新条目显示我的 MY_FUNCTION 函数中的语句

我需要登录 SQL Developer 并手动编译该函数,才能再次开始工作。

这是什么原因?

有什么原因吗?

all_statements 由 PL/Scope 填充。默认情况下,SQL 开发人员启用 PL/Scope。默认情况下,大多数其他连接不会。

在您的 JDBC 会话中,您可以启用 PL/Scope

ALTER SESSION SET PLSCOPE_SETTINGS='IDENTIFIERS:ALL';

如果这样做,编译过程将导致 all_statements 被填充。

这是一个 dbfiddle 示例,其中我创建了一个简单的函数,表明创建和编译它都不会填充 all_statements,然后启用 PL/Scope,重新编译它,然后all_statements 已填充。