gpt4 book ai didi

java - Oracle ORA-29536 关于 DDL-将 java 源加载到数据库中

转载 作者:行者123 更新时间:2023-11-30 06:49:00 24 4
gpt4 key购买 nike

我正在考虑在 pl/sql 中包装一些 java 函数,但在加载 java 源代码时在 for 循环中的冒号字符上遇到 ORA-29536。
我希望理解为什么数据库在这方面遇到困难,因为它似乎没有误解冒号并尝试绑定(bind),并获得有关前进道路的任何建议。
我希望避免重构源代码以废除所有 for 循环,并且希望尽可能避免使用 loadjava 工具。
数据库是12cR1,ojdk是1.6.0_71。

这是一个例子。
给定这两个简单的 hello-world-type 类:

public final class HelloWorld {
public static String greet(final String userName) {
return "Hello " + userName;
}
}

还有:

import java.util.Arrays;
import java.util.List;

public final class LoopingTest {
public static String greet(final String userName) {
final List<String> emptyList = Arrays.asList(userName);
for (final String string : emptyList) {
System.out.println(string);
}
return "Hello " + userName;
}
}

当我编译到数据库中时,第一个顺利并注册了JAVA SOURCEJAVA CLASS对象(我在这个中使用动态SQL和一个clob)例如,因为最终目标将是 >32K 字符,并有足够的 @& 等,以使原始脚本中的转义变得复杂):

BEGIN
EXECUTE IMMEDIATE
'
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "HelloWorld" AS
public final class HelloWorld {
public static String greet(final String userName) {
return "Hello " + userName;
}
}
';
END;
/

PL/SQL procedure successfully completed.

但是第二个导入失败:

BEGIN
EXECUTE IMMEDIATE
'
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "HelloWorld" AS
import java.util.Arrays;
import java.util.List;

public final class LoopingTest {
public static String greet(final String userName) {
final List<String> emptyList = Arrays.asList(userName);
for (final String string : emptyList) {
System.out.println(string);
}
return "Hello " + userName;
}
}
';
END;
/

ERROR at line 1:
ORA-29536: badly formed source: Encountered "final String string :" at line 1,
column 195.

我想知道是否可以进行任何更改来哄骗 Oracle 加载此内容。
如果使用 loadjava 是唯一的导入方式,我可以接受,但如果可能的话,我更喜欢一步 DDL 加载。谢谢

最佳答案

Oracle 似乎对 Java 代码进行了一些奇怪的预处理,将 for-each 循环中的 final String string 标记为问题。该错误并非来自 Java 编译器 - 正如您所期望的那样,因为这是有效的。我看不到任何有关此问题的信息,包括在 My Oracle Support 上。

正如 @JonHeller 在编辑评论中指出的那样,这与字符串连接无关,但也与动态 SQL 无关 - 在 11gR2 中无论如何我仍然会看到相同的 ORA-29536 错误,如果我只是使用您的第二个代码块直接从 SQL 提示符运行 DDL。

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "LoopingTest" AS 
import java.util.Arrays;
import java.util.List;

public final class LoopingTest {
public static String greet(final String userName) {
final List<String> emptyList = Arrays.asList(userName);
for (final String string : emptyList) {
System.out.println(string);
}
return "Hello " + userName;
}
}
/

Error report -
ORA-29536: badly formed source: Encountered "final String string :" at line 7, column 14.
Was expecting one of:
"boolean" ...
...

作为解决方法,您可以删除 final 关键字:

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "LoopingTest" AS 
import java.util.Arrays;
import java.util.List;

public final class LoopingTest {
public static String greet(final String userName) {
final List<String> emptyList = Arrays.asList(userName);
// remove 'final' to avoid ORA-29536
// for (final String string : emptyList) {
for (String string : emptyList) {
System.out.println(string);
}
return "Hello " + userName;
}
}
/

Java source LoopingTest compiled

或者在您的原始 PL/SQL 代码中:

DECLARE
V_SQL_TEXT CLOB := ' ' ||
'CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "LoopingTest" AS ' ||
'import java.util.Arrays; ' ||
'import java.util.List; ' ||
' ' ||
'public final class LoopingTest { ' ||
'public static String greet(final String userName){ ' ||
'final List<String> emptyList = Arrays.asList(userName); ' ||
-- remove 'final' to avoid ORA-29536
-- 'for (final String string : emptyList){ ' ||
'for (String string : emptyList){ ' ||
'System.out.println(string); ' ||
'} ' ||
'return "Hello " + userName; ' ||
'} ' ||
'} ';
BEGIN
EXECUTE IMMEDIATE V_SQL_TEXT;
END;
/

PL/SQL procedure successfully completed.

您应该考虑向 Oracle 提出服务请求,看看他们是否可以解释和/或解决问题。

关于java - Oracle ORA-29536 关于 DDL-将 java 源加载到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43173752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com