Java Oracle 12c执行存储过程时给出空结果
我正在尝试使用java代码执行存储过程。我使用的是OJDBC7和JDK1.8 我有两个数据相同但版本不同的数据库。一个使用Oracle 10g,另一个使用Oracle 12c Plsql执行成功,我在Oracle10g和Oracle12c中都看到了获取的数据 我的Java代码适用于Oracle 10g版本。但在Oracle12c版本中,我得到的结果是空的Java Oracle 12c执行存储过程时给出空结果,java,oracle,Java,Oracle,我正在尝试使用java代码执行存储过程。我使用的是OJDBC7和JDK1.8 我有两个数据相同但版本不同的数据库。一个使用Oracle 10g,另一个使用Oracle 12c Plsql执行成功,我在Oracle10g和Oracle12c中都看到了获取的数据 我的Java代码适用于Oracle 10g版本。但在Oracle12c版本中,我得到的结果是空的 declare OFFERLIST_ID_TY OFFERLIST_ID_TYPES; OFFERLIST_ID_T OFFERLIST_
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;
}
}
publicstaticvoidmain(字符串[]args){
试一试{
类forName(“oracle.jdbc.driver.OracleDriver”);
Connection Connection=DriverManager.getConnection(“jdbc:oracle:thin:@db:1521:sid”,“user”,
“pwd”);
ArrayList offerListType=新的ArrayList();
OfferListType.add(
createStruct(“OFFERLIST_ID_TYPE”,新字符串[]{“1234”,“MM”});
Array Array of_records=((OracleConnection)connection).createARRAY(“OFFERLIST_ID_类型”,
toArray(新结构[]{});
CallableStatement stmt=连接
.prepareCall(“{call OFFERS(?,)}”);
stmt.setArray(1,数组\u的\u记录);
stmt.registerOutParameter(2,oracle.jdbc.OracleTypes.ARRAY,“提供信息类型”);
stmt.execute();
系统输出打印项次(“已执行”);
对象[]数据=(对象[])((数组)stmt.getObject(2)).getArray();
System.out.println(“大小:“+数据长度”);
stmt.close();
connection.close();
}catch(SQLException | ClassNotFoundException e){
System.out.println(“连接失败!检查输出控制台”);
e、 printStackTrace();
返回;
}
}
输出
System.out.println(“大小:+data.length”)代码>
为空,但相同的过程为数据库中的数据提供oracle 10g中的相同数据
有人能帮忙吗
这是一个开发数据库。对于共享公共代码库的开发人员,有许多模式
“有许多Schemas共享公共代码库”
您可能遇到了Bug 21068213或其变体。12cR1中似乎存在一些问题,例如一个模式中的对象与另一个模式中的相同对象相混淆。也许这是多租户代码中的漏洞
无论如何,这个bug有一个补丁。因此,有必要联系Oracle支持部门(假设您有合同),看看这个bug是否是导致您出现问题的原因。当然要让你的DBA参与进来 我假设您的12c实例中的数据已提交-您并没有将其插入正在测试调用的客户机/会话中,而是没有提交以使其在Java会话中可见?@AlexPoole。谢谢你的帮助。请详细说明一下。如何将oracle 12c设置为对Java会话可见?您是否刚刚插入了希望看到的数据?如果是这样,您是否发布了
commit
?@AlexPoole。我已经插入了数据。但是看不见。没有发出提交。我还没有发布oracle 10G中的commit。这是一个开发数据库吗?谢谢。如果有关于这个bug和补丁的参考,你能帮助我吗?我已经提供了bug编号。您应该能够通过MyOracleSupport门户找到它。