You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:30:38