Oracle 12.2嵌入式Java用Lambda报ORA-29536错误,Java8为何不识别->符号?
Oracle 12.2嵌入式Java中Lambda表达式报错ORA-29536的解决方法
问题描述
在Oracle 12.2的嵌入式Java环境中使用Lambda表达式时,触发ORA-29536错误,提示无法识别->符号。通过dbms_java.get_jdk_version()确认JDK版本为1.8.0_271(该版本原生支持Lambda特性),且在虚拟机中全新安装Oracle Linux+Oracle 12.2后测试,问题依旧。测试代码在Oracle 19c及标准Java 8环境中可正常运行,测试代码如下:
create or replace and compile java source named lambda_test_min as public class MyClass2 { interface i_add_function { String add ( String i_s ) ; } public static void out_call() { main( null ) ; } public static void main(String args[]) { i_add_function v_add_function = new i_add_function() { public String add ( String i_s2 ) { return "Added text by anonimous class: " + i_s2 ; } }; v_add_function = i_s -> "Added text by lambda: " + i_s ; System.out.println ( v_add_function.add ( "added text." ) ) ; System.out.println( "java version = " + System.getProperty("java.version") ); } }
问题原因
Oracle 12.2的嵌入式Java虽然底层JDK版本为1.8,但默认的Java编译级别并未设置为Java 8。数据库嵌入式Java编译器默认使用较低的版本(如Java 6)进行编译,而Lambda是Java 8新增的语法特性,因此会出现语法不识别的错误。
解决方案
显式指定Java源的编译级别为1.8,在创建Java源时添加COMPILE OPTIONS 'javac -source 1.8 -target 1.8'参数即可。修改后的创建语句如下:
create or replace and compile java source named lambda_test_min COMPILE OPTIONS 'javac -source 1.8 -target 1.8' as public class MyClass2 { interface i_add_function { String add ( String i_s ) ; } public static void out_call() { main( null ) ; } public static void main(String args[]) { i_add_function v_add_function = new i_add_function() { public String add ( String i_s2 ) { return "Added text by anonimous class: " + i_s2 ; } }; v_add_function = i_s -> "Added text by lambda: " + i_s ; System.out.println ( v_add_function.add ( "added text." ) ) ; System.out.println( "java version = " + System.getProperty("java.version") ); } }
验证步骤
编译成功后,可通过以下PL/SQL代码调用测试:
set serveroutput on; call dbms_java.set_output(10000); call lambda_test_min.out_call();
执行后会输出Lambda表达式生成的字符串以及Java版本信息,确认功能正常。
内容的提问来源于stack exchange,提问作者vasu2005s
相关产品推荐
相关产品推荐

