Oracle JVM未启用导致CREATE JAVA SOURCE报ORA-00942,实为JVM未加载:需先查v$option确认Java支持(TRUE),再验dbms_java.get_jdk_version;若未启用,须重启库并设java_pool_size>0,且授JAVAUSERPRIV权限。
直接执行 create or replace and resolve java source 报 ora-00942: table or view does not exist,根本不是表不存在,而是 oracle jvm(ojvm)根本没加载。必须先确认 jvm 是否编译进实例且已启用。
SELECT * FROM v$option WHERE parameter = 'Java',返回 TRUE 才表示支持SELECT dbms_java.get_jdk_version FROM dual,19c 只认 JDK 8/11 字节码,JDK 17 编译的 .class 会触发 ORA-29548
java_pool_size > 0,例如:ALTER SYSTEM SET java_pool_size=128M
JAVAUSERPRIV,JAVADEBUGPRIV 不够用ORA-29532 表面是“Java call terminated”,实际是 Java 层抛了未处理异常(比如 NullPointerException、SQLException),PL/SQL 包装函数没兜住。这不是权限问题,是契约断裂。
public static,且参数/返回类型严格映射 SQL 类型(如 java.lang.String ↔ VARCHAR2)try-catch 吞掉或转为 unchecked,否则 PL/SQL 无法接住EXCEPTION 块,否则一出错就炸,连日志都看不到System.out.println 查错——默认不输出,得先调 dbms_java.set_output
只要 Java 代码碰网络、文件、系统属性等,就会触发沙箱拦截,报 java.security.AccessControlException。这不是数据库权限,是 OJVM 的安全策略。
dbms_java.grant_permission 授 SYS:java.net.SocketPermission,目标地址和端口要写全,例如 '127.0.0.1:7777'
SYS:java.io.FilePermission,路径需用 Oracle 目录对象映射,不能写绝对路径;'/tmp/-' 表示该目录下所有文件可读写JAVASYSPRIV 角色,仅 JAVAUSERPRIV 不够函数声明里写的 NAME 字符串稍有偏差,调用就报 ORA-29531: no method 或静默失败。OJVM 对签名敏感度极高,空格、大小写、分号都不能错。
java.lang.String,不能写 String;int 要写 java.lang.Integer 或 int(但后者不推荐)java.lang.String[],不是 String[],更不是 java.lang.String...
AS LANGUAGE JAVA NAME '...',不带 RETURN
CREATE OR REPLACE AND RESOLVE JAVA SOURCE,光改 PL/SQL 函数没用Oracle 存储过程调 Java 最容易卡在权限链上:JVM 开关、用户角色、Java 安全策略、PL/SQL 签名,四层缺一不可。尤其注意 dbms_java.grant_permission 的第三个参数(permission_name)必须精确到 IP+端口或路径通配符,少一个字符就拒绝。
立即学习“Java免费学习笔记(深入)”;