执行存储过程的Oracle 12c给出空结果

时间:2017-05-09 11:45:51

标签: java oracle

我正在尝试使用java代码执行存储过程。我使用的是Ojdbc 7,Jdk 1.8。

我有两个数据库相同但版本不同的数据库。一个使用Oracle 10g,另一个使用Oracle 12c

Plsql执行成功,我在Oracle 10g,Oracle 12c中都看到了获取的数据。

我的Java代码适用于Oracle 10g版本。但是在Oracle 12c版本中,我得到了空的结果。

declare
 OFFERLIST_ID_TY OFFERLIST_ID_TYPES;
 OFFERLIST_ID_T OFFERLIST_ID_TYPE;
 OFFERS_INFO_TY OFFERS_INFO_TYPE;

begin

OFFERLIST_ID_T:=OFFERLIST_ID_TYPE('1234','MM');
OFFERLIST_ID_TY:=OFFERLIST_ID_TYPES(OFFERLIST_ID_T);


OFFERS(OFFERLIST_ID_TY,OFFERS_INFO_TY);

FOR i IN OFFERS_INFO_TY.FIRST..OFFERS_INFO_TY.LAST  LOOP
       DBMS_OUTPUT.PUT_LINE('Name: '|| OFFERS_INFO_TY(i).SERVICE_NAME);
    END LOOP;

    END;

Java类

public static void main(String[] args) {
    try {
        Class.forName("oracle.jdbc.driver.OracleDriver");

        Connection connection  = DriverManager.getConnection("jdbc:oracle:thin:@db:1521:sid", "user",
                "pwd");
        ArrayList<Struct> OFFERListIdType = new ArrayList<Struct>();
        OFFERListIdType.add(
                ((OracleConnection) connection).createStruct("OFFERLIST_ID_TYPE", new String[] { "1234", "MM" }));

        Array array_of_records = ((OracleConnection) connection).createARRAY("OFFERLIST_ID_TYPES",
                OFFERListIdType.toArray(new Struct[] {}));

        CallableStatement stmt = connection
                .prepareCall("{ call OFFERS(?,?) }");

        stmt.setArray(1, array_of_records);
        stmt.registerOutParameter(2, oracle.jdbc.OracleTypes.ARRAY, "OFFERS_INFO_TYPE");

        stmt.execute();

        System.out.println("Executed");
        Object[] data = (Object[]) ((Array) stmt.getObject(2)).getArray();
        System.out.println("Size:" + data.length);

        stmt.close();
        connection.close();

    } catch (SQLException | ClassNotFoundException e) {
    System.out.println("Connection Failed! Check output console");
    e.printStackTrace();
    return;
}
}

输出 System.out.println("Size:" + data.length);

给出空的但是相同的过程在数据库中为oracle 10g中的数据提供相同的数据。

有人可以帮忙吗?

这是一个开发数据库。开发人员有许多共享共同代码库的模式。

1 个答案:

答案 0 :(得分:2)

  

“有许多共享代码库的方案”

您可能遇到错误21068213或其变体。 12cR1中似乎存在一些问题,因此一个模式中的对象与另一个模式中的相同对象混淆。也许这是多租户代码中的漏洞。

无论如何,这个bug有一个补丁。所以值得联系Oracle支持部门(假设你有合同),看看这个错误是否是造成问题的原因。当然让你的DBA参与其中。