Java ORA-03115:不支持的网络数据类型或表示形式

Java ORA-03115:不支持的网络数据类型或表示形式,java,oracle,procedure,Java,Oracle,Procedure,在提出这个问题之前,我在谷歌上搜索了一段时间,但现在发现了结果。我的代码尝试调用oracle软件包中的过程(我对oracle软件包不太熟悉),并始终获得“ORA-03115:不支持的网络数据类型或表示法", 英语中应为“不支持的网络数据类型或表示” 以下是我的包装: create or replace PACKAGE PKG_ACTIVITY_REPORT IS TYPE activity_report_item_type IS RECORD ( emp_id MERCHAN

在提出这个问题之前,我在谷歌上搜索了一段时间,但现在发现了结果。我的代码尝试调用oracle软件包中的过程(我对oracle软件包不太熟悉),并始终获得“ORA-03115:不支持的网络数据类型或表示法", 英语中应为“不支持的网络数据类型或表示”

以下是我的包装:

create or replace 
PACKAGE PKG_ACTIVITY_REPORT 
IS
    TYPE activity_report_item_type IS RECORD
    ( emp_id MERCHANT.merchant_id%TYPE,
    emp_name MERCHANT.MERCHANT_NAME%TYPE,
    emp_gender MERCHANT.MERCHANT_CODE%TYPE );
    TYPE activity_report_items_type IS TABLE OF activity_report_item_type INDEX BY     BINARY_INTEGER;

    -- Procedure to retrive the activity report of given operator
    PROCEDURE enquiry_activity_report(activity_report_items OUT activity_report_items_type);
END PKG_ACTIVITY_REPORT;

create or replace 
PACKAGE BODY PKG_ACTIVITY_REPORT 
IS
PROCEDURE enquiry_activity_report (activity_report_items OUT activity_report_items_type)
IS
    activity_report_item activity_report_item_type;
BEGIN
    activity_report_item.emp_id := 300000000;
    activity_report_item.emp_name := 'Barbara';
    activity_report_item.emp_gender := 'Female';

    activity_report_items(1) := activity_report_item;

    activity_report_item.emp_id := 300000008;
    activity_report_item.emp_name := 'Rick';
    activity_report_item.emp_gender := 'Male';

    activity_report_items(2) := activity_report_item;

    FOR i IN 1..activity_report_items.count LOOP
        DBMS_OUTPUT.PUT_LINE('i='||i||', emp_id ='||activity_report_items(i).emp_id||', emp_name ='
        ||activity_report_items(i).emp_name||', emp_gender = '||activity_report_items(i).emp_gender);
    END LOOP;
END enquiry_activity_report;

END PKG_ACTIVITY_REPORT;
我想从过程中返回一个数组,并从java调用此过程:

        conn = ds.getConnection();
        String storedProc = "{call pkg_activity_report.enquiry_activity_report(?)}";
        CallableStatement cs = conn.prepareCall(storedProc);
        // register output parameter
        cs.registerOutParameter(1, java.sql.Types.ARRAY);
        cs.execute();
        Array array = cs.getArray(1);
        System.out.println(array);
        cs.close();
运行时,异常抛出。如何将out参数映射到java类型?请帮助

注意:从oracle sqldeveloper运行此过程时,它工作正常

DECLARE
  ACTIVITY_REPORT_ITEMS RAMON.PKG_ACTIVITY_REPORT.ACTIVITY_REPORT_ITEMS_TYPE;
BEGIN

  PKG_ACTIVITY_REPORT.ENQUIRY_ACTIVITY_REPORT(
    ACTIVITY_REPORT_ITEMS => ACTIVITY_REPORT_ITEMS
  );
END;
DBMS输出结果:

i=1, emp_id =300000000, emp_name =Barbara, emp_gender = Female
i=2, emp_id =300000008, emp_name =Rick, emp_gender = Male

现在,我创建了两个架构级别类型:

CREATE OR REPLACE TYPE activity_report_item_type AS OBJECT( 
emp_id NUMBER,
emp_name VARCHAR2(30),
emp_gender VARCHAR2(30) 
);

CREATE OR REPLACE TYPE activity_report_items_type AS TABLE OF activity_report_item_type;
并将过程查询\活动\报告移出包,使其独立,然后成功地从java调用它

        conn = ds.getConnection();
        String storedProc = "{call enquiry_activity_report(?)}";
        CallableStatement cs = conn.prepareCall(storedProc);
        // register output parameter
        cs.registerOutParameter(1, OracleTypes.ARRAY, "ACTIVITY_REPORT_ITEMS_TYPE");
        cs.execute();
        Array array = cs.getArray(1);
        ResultSet rs = array.getResultSet();
        while (rs.next()) {
            // why getObject(2) instead of getObject(1)?
            Object elements[] = ((STRUCT) rs.getObject(2)).getAttributes();
            System.out.println(elements[0]);
            System.out.println(elements[1]);
            System.out.println(elements[2]);
        }

        cs.close();

如果我将类型声明和过程放入包中,java代码将抛出异常通知“未找到“活动\报告\项目\类型”的类型定义”。

现在我创建了两个架构级类型:

CREATE OR REPLACE TYPE activity_report_item_type AS OBJECT( 
emp_id NUMBER,
emp_name VARCHAR2(30),
emp_gender VARCHAR2(30) 
);

CREATE OR REPLACE TYPE activity_report_items_type AS TABLE OF activity_report_item_type;
并将过程查询\活动\报告移出包,使其独立,然后成功地从java调用它

        conn = ds.getConnection();
        String storedProc = "{call enquiry_activity_report(?)}";
        CallableStatement cs = conn.prepareCall(storedProc);
        // register output parameter
        cs.registerOutParameter(1, OracleTypes.ARRAY, "ACTIVITY_REPORT_ITEMS_TYPE");
        cs.execute();
        Array array = cs.getArray(1);
        ResultSet rs = array.getResultSet();
        while (rs.next()) {
            // why getObject(2) instead of getObject(1)?
            Object elements[] = ((STRUCT) rs.getObject(2)).getAttributes();
            System.out.println(elements[0]);
            System.out.println(elements[1]);
            System.out.println(elements[2]);
        }

        cs.close();

若我将类型声明和过程放入包中,java代码将抛出异常通知“未找到”活动\报告\项目\类型的类型定义“

尝试更新您的JDBC驱动程序以匹配您的Oracle数据库版本。同样,我的Oracle server和JDBC驱动程序都是11.2.0.3.0在阵列中使用PLSQL包级别类型显然有点复杂,您可能希望使用它来生成映射。还有一些信息。请尝试更新您的JDBC驱动程序以匹配您的Oracle数据库版本。同样,我的Oracle server和JDBC驱动程序都是11.2.0.3.0在阵列中使用PLSQL包级别类型显然有点复杂,您可能希望使用它来生成映射。还有一些信息。你找到解决方案了吗?你找到解决方案了吗?