存储过程如下:
PROCEDURE Query_org_increment(Errbuf OUT NOCOPY VARCHAR2,
Retcode OUT NOCOPY NUMBER,
p_Record_Set OUT Record_Set,
p_start_date VARCHAR2,
p_end_date VARCHAR2)
用PreparedStatement调用此存储过程时按顺序赋参数值时会出错:参数个数或类型不匹配
PreparedStatement stmt = new PreparedStatement();
for (int i=0;i<params.length;i++)
stmt.setObject(i + 1, params[i]);
但当我把存储过程入口参数放在前面时,就不会报错了
PROCEDURE Query_org_increment(
p_start_date VARCHAR2,
p_end_date VARCHAR2
Errbuf OUT NOCOPY VARCHAR2,
Retcode OUT NOCOPY NUMBER,
p_Record_Set OUT Record_Set,
)
我估计PreparedStatement给参数赋值的方法是把所有存储过程的参数都当作是入口参数,不会区分是否是IN还是OUT类型。如果存储过程的入口参数的顺序是错乱的,我怎么去赋值呢
PROCEDURE Query_org_increment(Errbuf OUT NOCOPY VARCHAR2,
Retcode OUT NOCOPY NUMBER,
p_Record_Set OUT Record_Set,
p_start_date VARCHAR2,
p_end_date VARCHAR2)
用PreparedStatement调用此存储过程时按顺序赋参数值时会出错:参数个数或类型不匹配
PreparedStatement stmt = new PreparedStatement();
for (int i=0;i<params.length;i++)
stmt.setObject(i + 1, params[i]);
但当我把存储过程入口参数放在前面时,就不会报错了
PROCEDURE Query_org_increment(
p_start_date VARCHAR2,
p_end_date VARCHAR2
Errbuf OUT NOCOPY VARCHAR2,
Retcode OUT NOCOPY NUMBER,
p_Record_Set OUT Record_Set,
)
我估计PreparedStatement给参数赋值的方法是把所有存储过程的参数都当作是入口参数,不会区分是否是IN还是OUT类型。如果存储过程的入口参数的顺序是错乱的,我怎么去赋值呢
对于Out类型参数的使用 CallableStatement有getXxx方法来获取Out参数返回值。
因为存储过程参数的属性在java里面设置是没有任何意义的,因为参数属性是数据库里面的属性,不属于java,所以java只能获取属性不能设置。
不过一般来说存储过程的参数都是in类型属性的,需要返回值的时候一般都用函数。
ParameterMetaData parameter = stmt.getParameterMetaData();
Exception in thread "main" java.lang.AbstractMethodError: oracle.jdbc.driver.T4CCallableStatement.getParameterMetaData()Ljava/sql/ParameterMetaData;
ParameterMetaData pmd=this.prepared.getParameterMetaData();
我估计是你的驱动包版本不对或是其它原因。