我正在尝试使用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中的数据提供相同的数据。
有人可以帮忙吗?
这是一个开发数据库。开发人员有许多共享共同代码库的模式。
答案 0 :(得分:2)
“有许多共享代码库的方案”
您可能遇到错误21068213或其变体。 12cR1中似乎存在一些问题,因此一个模式中的对象与另一个模式中的相同对象混淆。也许这是多租户代码中的漏洞。
无论如何,这个bug有一个补丁。所以值得联系Oracle支持部门(假设你有合同),看看这个错误是否是造成问题的原因。当然让你的DBA参与其中。