使用 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
已填充。
在我 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
已填充。