2

我正在尝试执行 dropjava 命令以将 jar 文件放入数据库中......

dropjava -u username/password@schema -v -r abc.jar 

...但它给了我以下错误:

ORA-29537: class or resource cannot be created or dropped directly

问题是什么?

我使用以下命令加载了 JAR:

loadjava -u username/password@schema -v -r -f abc.jar 
4

5 回答 5

4

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
于 2018-08-31T19:05:24.973 回答
2

删除某个日期之后创建的 java 资源的示例:

declare
  cursor c is 
   SELECT dbms_java.longname (t.object_name) long_n
   FROM 
    user_objects
   WHERE 
   (object_name NOT LIKE 'SYS_%' AND 
    object_name NOT LIKE 'CREATE$%' AND 
    object_name NOT LIKE 'JAVA$%' AND 
    object_name NOT LIKE 'LOADLOB%') AND
    object_type LIKE 'JAVA %' AND
    created > to_date('20190830', 'YYYYMMDD');

begin
  for i in c loop
    dbms_java.dropjava(i.long_n);
  end loop;
end;
/
于 2019-10-07T13:49:03.803 回答
0

这基本上是一个猜测,但我认为值得一试。

以适当的用户身份连接到您的数据库并尝试使用PL/SQL 包 DBMS_JAVA删除 JAR 。在 SQL*Plus 中看起来像 L

dbms_java.dropjava('-jarsasdbobjects abc.jar');

PL/SQL 采用与命令行相同的选项dropjava

于 2012-07-11T08:05:34.023 回答
0

这个命令有效,我认为:

dropjava -u username/password@schema -v -r -f abc.jar
于 2017-07-14T05:37:51.940 回答
-1
select 'exec dbms_java.dropjava('''||dbms_java.longname (object_name)||''');' from user_objects where object_type like '%JAVA%';
于 2020-09-29T13:18:59.263 回答