我在oracle db中有这样的功能。
create or replace function pin_sf_get_pin_detail
(p_pin in varchar2)
return pin_tm_form%rowtype
as
l_pin_record pin_tm_form%rowtype;
begin
select * into l_pin_record from pin_tm_form
where pin = p_pin;
return(l_pin_record);
end;
我想从java端调用这个函数,因为我编写了一个不起作用的小程序。这是我的java程序。
final String typeName = "pin_details";
final String typeTableName = "pin_tm_form";
Connection con=ConnectionTest.getConnection();
final StructDescriptor structDescriptor = StructDescriptor.createDescriptor(typeName.toUpperCase(),con);
final ResultSetMetaData metaData = structDescriptor.getMetaData();
CallableStatement cst=(OracleCallableStatement)con.prepareCall("{?=call pin_sf_get_pin_detail(?)}");
cst.registerOutParameter(1,OracleTypes.CURSOR,typeTableName.toUpperCase());
cst.setString(2,"505460");
cst.execute();
Object [] data = (Object[]) ((java.sql.Array) cst.getObject(1)).getArray();
for(Object tmp : data) {
Struct row = (Struct) tmp;
int idx = 1;
for(Object attribute : row.getAttributes()) {
if(metaData.getColumnName(idx).equalsIgnoreCase("FIRST_NAME"))
{
System.out.println((String)attribute);
}
}
}
我在oracle中创建了一个类型为Pin_details的类型。 这里我的疑问是cst.registerOutParameter当我尝试使用Types.ARRAY时,我必须传递的第二个参数我尝试使用Types类所有常量 它给出了无效的名称模式:Pin.Pin_tm_FORM但该表存在于同一模式中。 当我使用Types.VARCHAR时,它给出了
java.sql.SQLException: ORA-06550: line 1, column 13:
PLS-00382: expression is of wrong type
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
我只是尝试其他争论,但我真的不知道我必须通过什么以及它将如何运作。可以请任何人帮助解决这个问题。