从java中的plsql函数获取返回的记录类型

我有一个plsql函数返回记录类型challan_rec

 create or replace package xx_bal_api as type challan_rec is record ( challan_number varchar2(40), challan_amount number ); FUNCTION get_challan(foo number) return challan_rec; end; create or replace package body xx_bal_api as FUNCTION get_challan(foo number) return challan_rec is cr challan_rec; begin cr.challan_number := '00002154215'; cr.challan_amount := 2265; return cr; end get_challan; end; 

我想从java代码中调用此函数并在java中获取该记录类型。 请指导我如何做到这一点。 谢谢

首先让我们从纠正您的代码开始。 我可以看到你发布的代码不会编译而且会引发问题。 正确的代码如下:

 CREATE OR REPLACE PACKAGE xx_bal_api AS TYPE challan_rec IS RECORD ( challan_number VARCHAR2 (40), challan_amount NUMBER ); TYPE rec IS TABLE OF challan_rec index by pls_integer; FUNCTION get_challan (foo NUMBER) RETURN rec; END; / CREATE OR REPLACE PACKAGE BODY xx_bal_api AS FUNCTION get_challan (foo NUMBER) RETURN rec IS cr rec; BEGIN cr (1).challan_number := '00002154215'; cr (1).challan_amount := foo; RETURN cr; END get_challan; END; 

执行此代码时,您可能会遇到invalid datatype等问题。 这是因为RECORD仅限于在PLSQL

 select xx_bal_api.get_challan(2265) from dual; 

ORA-00902:数据类型无效

执行此操作的最佳方法是创建OBJECTTYPE ,然后在函数中return它:

 CREATE OR REPLACE TYPE challan_rec IS OBJECT ( challan_number VARCHAR2 (40), challan_amount NUMBER ); / CREATE OR REPLACE Type rec is table of challan_rec; / CREATE OR REPLACE FUNCTION get_challan(foo number) return rec is cr rec:=rec(); begin cr.extend(); cr(1):= challan_rec('00002154215',foo); return cr; end get_challan; end; / 

执行:

 SQL> select get_challan(2265) from dual; / 

首先,您只能调用从Java返回SQL对象的函数,而不是PLSQL对象。 所以相应地改变你的challan_rec。 整个过程应包括以下4个步骤。

  1. 在架构级别(不在包中)创建对象类型。 此外,您的类型应为OBJECT类型,而不是RECORD类型。

     CREATE OR REPLACE TYPE Some_schema.chellan_rec IS OBJECT ( challan_number varchar2(40), challan_amount number ) 

2。 更改函数get_chellan以返回此对象

  1. 实现SQLData接口

     public class Chellan_Rec implements SQLData{ //override readSQL, writeSQL and getSQLTypeName methods } 
  2. 从Java代码调用PLSQL

     ResultSet rs=null; CallableStatement stmt=null; Chellan_Rec rec = null; try{ String sqlQuery = "{call get_chellan(?,?)}"; //map plsql type to Java type Map m = conn.getTypeMap(); m.put("schema_name.chellan_rec", Class.forName("some_java_package.Chellan_Rec"));//this maps the Java class to the Oracle custom type conn.setTypeMap(m); stmt=conn.prepareCall(sqlQuery); stmt.registerOutParameter(1, Types.STRUCT, "chellan_rec"); stmt.setObject(2, fooNum); stmt.execute(); rec = (Chellan_Rec)stmt.getObject(1); }catch(Exception e){ //log the exception; }