【问题标题】:Convert String[] to ORA_MINING_VARCHAR2_NT from java stored procedure从 java 存储过程中将 String[] 转换为 ORA_MINING_VARCHAR2_NT
【发布时间】:2013-03-22 11:48:08
【问题描述】:

我可以将 String[] 从存储过程转换为“ORA_MINING_VARCHAR2_NT”作为返回值吗? VARRAY 不是一个选项(我有可变数量的元素)

我总是得到一个错误:

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;

谢谢!

抱歉我的英语不好

【问题讨论】:

    标签: java arrays oracle stored-procedures type-conversion


    【解决方案1】:

    我已经解决了。它适用于其他一些类:

    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;
    

    【讨论】:

      【解决方案2】:

      始终为传递给createDescriptor 的类型指定架构名称作为参数。

      【讨论】:

      • @Cool-T - 试试oracle.sql.ARRAY result = new ARRAY(...);
      • 不起作用。已经试过了。也许java无法转换成这种类型,因为它是TABLE类型=/
      猜你喜欢
      • 2020-06-06
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多