TL;DR:定义相同类的 java 源对象 ( object_type='JAVA SOURCE'
) 已存在于数据库中。先放下吧。
$ oerr ora 29537
29537, 00000, “类或资源不能直接创建或删除”
// *原因:试图创建或删除一个 Java 类或资源,
// 已知该类或资源是由现有 Java 源对象的编译产生的。
// *Action:通过作用于源来作用于类或资源,或者改变
源以使其不再定义类或资源。
考虑以下 MCVE:
$ echo "public class SomeClass { }" >SomeClass.java
$ javac SomeClass.java
$ jar -cvf SomeClass.jar SomeClass.class
$ conndb="user/pass@db_server/sevice_name"
$ loadjava -u $conndb -r -v SomeClass.jar
resolving: class SomeClass
Classes Loaded: 1
$ dropjava -u $conndb -v SomeClass.jar
dropping: class SomeClass
到目前为止,一切都很好。现在,让我们创建定义相同类的 java 源对象:
$ sqlplus -l -s $conndb <<+++
create or replace and compile java source named "SomeClass" as
$(<SomeClass.java)
/
+++
Java created.
那么这个类既不能被直接创建也不能被直接删除:
$ loadjava -u $conndb -r -v SomeClass.jar
Error while creating class SomeClass
ORA-29537: class or resource cannot be created or dropped directly
$ dropjava -u $conndb -v SomeClass.jar
Error while dropping SomeClass
ORA-29537: class or resource cannot be created or dropped directly
删除定义具有相同名称的类的现有 java 源,它会再次工作:
$ sqlplus -l -s $conndb <<+++
drop java source SomeClass;
+++
Java dropped.
$ loadjava -u $conndb -r -v SomeClass.jar
resolving: class SomeClass
Classes Loaded: 1
$ dropjava -u $conndb -v SomeClass.jar
dropping: class SomeClass