2013-03-22 112 views
1

可以將String []從存儲過程轉換爲「ORA_MINING_VARCHAR2_NT」作爲返回值嗎? VARRAY是不是一種選擇(我有可變數量的元素)從Java存儲過程將字符串[]轉換爲ORA_MINING_VARCHAR2_NT

我總是得到一個錯誤:

ORA-00932: inconsistent datatypes: expected a return value that is an instance of a user defined Java class convertible to an Oracle type got an object that could not be converted 

在此代碼:

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED Parser AS 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import oracle.sql.ARRAY; 
import oracle.sql.ArrayDescriptor; 

public class Parser { 

    public static oracle.sql.ARRAY parseToArray(String str, String delim) throws SQLException { 
     Connection conn = DriverManager.getConnection("jdbc:default:connection"); 
     ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("ORA_MINING_VARCHAR2_NT", conn); 
     ARRAY result = new ARRAY(descriptor, conn, str.split(delim)); 
     return result; 
    } 
} 
/
CREATE OR REPLACE FUNCTION 
PARSETOARRAY (str IN VARCHAR2, delim IN VARCHAR2) 
RETURN ORA_MINING_VARCHAR2_NT AS 
LANGUAGE JAVA NAME 'Parser.parseToArray (java.lang.String, java.lang.String) return oracle.sql.ARRAY'; 
/
DECLARE 
v_array ORA_MINING_VARCHAR2_NT; 
BEGIN 
    FOR testing IN (SELECT record FROM interfacelog) LOOP 
    v_array := PARSETOARRAY(testing.record, '|'); 
    -- do smth 
    END LOOP; 
END; 

謝謝!

PS對不起我的英文不好

回答

2

我解決了它。它的做工精細一些其他類:

create or replace type stringArray is table of varchar2(4000); 
/
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED Parser AS 
import java.sql.Connection; 
import oracle.jdbc.OracleDriver; 
import oracle.jdbc.OracleConnection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.sql.Array; 

public class Parser { 

    public static Array parseToArray(String str, String delim) throws SQLException { 
     OracleDriver ora = new oracle.jdbc.OracleDriver(); 
     Connection conn = ora.defaultConnection(); 
     OracleConnection oraConn = (OracleConnection)conn; 
     Array arr = oraConn.createARRAY("STRINGARRAY", str.split(delim)); 
     return arr; 
    } 
} 
/
CREATE OR REPLACE FUNCTION 
PARSETOARRAY (str IN VARCHAR2, delim IN VARCHAR2) 
RETURN STRINGARRAY AS 
LANGUAGE JAVA NAME 'Parser.parseToArray (java.lang.String, java.lang.String) return java.sql.Array'; 
/
DECLARE 
v_array STRINGARRAY; 
BEGIN 
    FOR testing IN (SELECT record FROM interfacelog) LOOP 
    v_array := PARSETOARRAY(testing.record, '|'); 
    END LOOP; 
END; 
1

始終指定架構你的類型傳遞給createDescriptor作爲參數名稱。

+0

沒有幫助=( – 2013-03-22 13:15:02

+1

@酷-T - 嘗試'oracle.sql.ARRAY結果=新陣列(...);' – 2013-03-22 13:21:12

+0

不工作已經嘗試過。也許java不能轉換成這種類型,因爲它是一個TABLE type = / – 2013-03-22 13:31:17