2017-03-06 93 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; 
    }