2017-03-06 74 views
0

我有一个plsql函数,它返回记录类型challan_rec在java中返回记录类型来自plsql函数

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中获取该记录类型。 请指导我如何做到这一点。 谢谢

+0

你是怎么声明challan_rec类型的?它是SQL还是PLSQL对象? –

+0

看到更新,对不起,我忘记分享包规格。 –

回答

0

第一让我们开始纠正你的代码。我可以看到你的发布代码不会编译并且会抛出问题。正确的代码如下:

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:无效的数据类型

做到这一点,最好的办法就是在你的函数创建一个OBJECT和对象的TYPE然后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; 
    /
+0

非常感谢你,问题解决了。 –

1

首先,你只能调用从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返回此对象

  • 实现SQLDATA接口

    public class Chellan_Rec implements SQLData{ 
    
    //override readSQL, writeSQL and getSQLTypeName methods 
    } 
    
  • 呼叫从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; 
    }