最初由 zhouwf0726 发布
[B]Nocopy 修改符
NOCOPY 是 IN OUT 和 OUT 参数模式的修改符。NOCOPY 特性允许您通过引用将参数传递给过程或函数,避免了 CPU 和内存开销。该代码示例也演示了因使用 NOCOPY 修改符而获得的性能改善。
尝试下 OUT NOCOPY [/B]
当然把NOCOPY加上后不会报警告,但有个问题就是:
java.sql.SQLException: ORA-06550: 第 1 行, 第 13 列:
PLS-00306: 调用 'PROCEDURE1' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
官方的参考地址:
http://www.oracle.com/technology/global/cn/sample_code/tech/java/codesnippet/jdbc/varray/index.html
但同样的,他这是9.0版本的,用10G得到的值为'????'
JAVA代码为(JAR包为
jdbc14):
OracleCallableStatement stmt = (OracleCallableStatement) conn.prepareCall("{?=call procedure1()}"
;
stmt.registerOutParameter(1, OracleTypes.ARRAY, "GRADE"
;
stmt.executeUpdate();
ARRAY simpleArray = stmt.getARRAY(1);
TchipInResults[] values = (TchipInResults[]) simpleArray.getArray();
for (int i = 0; i < values.length; i++)
System.out.println("row " + i + " = '" + values.getFormerNumber() + "'"
;
[B]最后出现的情况,数字可以正常得到,当字符乱码了,以前论坛也有些问题,但没有得到解决的[/B] OracleCallableStatement stmt = (OracleCallableStatement) conn
.prepareCall("{call procedure1(?)}"
;
// OracleCallableStatement stmt = (OracleCallableStatement)
// conn.prepareCall("{?=call GETPROCEDURE1()}"
;
stmt.registerOutParameter(1, OracleTypes.ARRAY, "GRADE"
;
stmt.execute();
ARRAY simpleArray = stmt.getARRAY(1);
// ResultSet rs = simpleArray.getResultSet();
Object[] obj = (Object[]) simpleArray.getArray();
for (int i = 0; i < obj.length; i++) {
STRUCT struct = (STRUCT) obj;
Datum[] dt = struct.getOracleAttributes();
System.out.println(dt[0].longValue());
System.out.println(dt[1].longValue());
System.out.println(dt[2].stringValue());
// System.out.println(dt[3].stringValue());
/**
* for (int n = 0; n < dt.length; n++){
* System.out.println(dt[n].intValue()); }
*/
/*
* /** Object[] dt = struct.getAttributes();
*
* for (int n = 0; n < dt.length; n++){
* System.out.println(String.valueOf(dt[n])); }
*/
}
|