如何从java类调用不带参数的过程作为表类型(2)

Posted

技术标签:

【中文标题】如何从java类调用不带参数的过程作为表类型(2)【英文标题】:how to call procedure with out parameter as table type from a java class (2) 【发布时间】:2013-05-31 06:47:48 【问题描述】:

这里已经有答案了: how to call procedure with out parameter as table type from a java class

但我们有问题,返回值 vor 代码总是“???”,正确返回 trxSeq 的值。 如果我们直接在db上调用它,代码会被值填充。

我们尝试了 varchar2、char、varchar 类型的代码。没有区别。

desc t_mam_code:
       TYPE t_mam_code AS OBJECT(                              
         code VARCHAR2(30),                                                
         trxSeq NUMBER(12)

java方法

final String typeName = "T_MAM_CODE";
final String typeTableName = "T_MAM_CODE_TAB";

// no difference, if we use Oracle Connection or java.sql.Connection
OracleConnection oracleConnection= connection.unwrap(OracleConnection.class);

// Get a description of your type (Oracle specific)
final StructDescriptor structDescriptor = StructDescriptor.createDescriptor(typeName, oracleConnection);
final ResultSetMetaData metaData = structDescriptor.getMetaData();

CallableStatement call = oracleConnection.prepareCall("call business.getCodes(?, ?, ?, ?, ?, ?, ?)");
// CallableStatement call = connection.prepareCall("call business.getCodes(?, ?, ?, ?, ?, ?, ?)");

int i = 1;
call.setString(i++, shopId);
call.setDate(i++, new java.sql.Date(consumerStamp.getTime()));
call.setInt(i++, version);
...

int out1 = i++;

call.registerOutParameter(out1, Types.ARRAY, typeTableName);
//call.registerOutParameter(out1, OracleTypes.ARRAY, typeTableName);

call.execute();

Object[] data = (Object[]) ((Array) call.getObject(out1)).getArray();
for(Object tmp : data) 
  Struct row = (Struct) tmp;
  // Attributes are index 1 based...
  int idx = 1;
  for(Object attribute : row.getAttributes())                
     System.out.println(metaData.getColumnName(idx) + " " + attribute);                                            
     ++idx;

输出是:

CODE ??? 
TRXSEQ 200001520606 ...

输出应该是:

CODE ABC1234 
TRXSEQ 200001520606

我们使用 Java 1.6、Oracle 11g、驱动 ojdbc6-11.2.0.3.0.jar 到 hibernate 4.1.12

【问题讨论】:

猜是编码问题,直接选择查询该数据时是否有乱码? 【参考方案1】:

感谢提示 didxga - 你把我们引向了正确的方向。我们将 orai18n.jar 添加到类路径中,现在一切正常 :)

【讨论】:

以上是关于如何从java类调用不带参数的过程作为表类型(2)的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程输入参数能否为空

Java调用SQL Server的存储过程详解(转)

SQL Server 如何执行 带参数的 存储过程

java中有哪些类型的方法,如何调用它们?

JAVA对存储过程的调用方法

覆盖在Ada中接收类范围类型作为参数的过程