Java 使用自定义类型执行存储过程会产生空结果
我已经为下面的plsql代码编写了java代码来执行存储过程。当我从Java代码运行该过程时,并没有得到结果 PLSQL 我的Java存储过程类Java 使用自定义类型执行存储过程会产生空结果,java,plsql,spring-jdbc,Java,Plsql,Spring Jdbc,我已经为下面的plsql代码编写了java代码来执行存储过程。当我从Java代码运行该过程时,并没有得到结果 PLSQL 我的Java存储过程类 @Component public class GetOffersFromCAMFORM extends StoredProcedure { private static final String OFEERS_LIST = "Offers"; @Autowired private String MySchema; @Autowir
@Component
public class GetOffersFromCAMFORM extends StoredProcedure {
private static final String OFEERS_LIST = "Offers";
@Autowired
private String MySchema;
@Autowired
@Qualifier("MyDataSource")
private DataSource dataSourceMy;
@PostConstruct
public void postConstruct() {
this.setDataSource(dataSourceMy);
this.setSql(MySchema + ".getOffersFromCAMFORM");
declareParameter(new SqlParameter(SUB_FORM, Types.ARRAY, MySchema + ".CAMFORMLIST_ID_TYPES"));
declareParameter(
new SqlOutParameter(OFEERS_LIST, OracleTypes.ARRAY,
MySchema + ".OFEERS_INFO_TYPE", new ReturnType()));
}
@SuppressWarnings("unchecked")
public List<MyOffer> execute(final String subscriptionForm, final String subscriptionClass)
throws Exception {
Map<String, Object> objects = new HashMap<String, Object>();
objects.put(SUB_FORM, new AbstractSqlTypeValue() {
@Override
protected Object createTypeValue(Connection con, int SqlType, String typeName)
throws SQLException {
OracleConnection oracle =
(OracleConnection) (new DelegatingConnection(con)).getInnermostDelegate();
if (oracle != null) {
con = oracle;
}
ArrayList<Struct> CAMFORMListIdType = new ArrayList<Struct>();
CAMFORMListIdType
.add(((OracleConnection) con).createStruct(MySchema + ".CAMFORMLIST_ID_TYPE",
new String[] {subscriptionForm, subscriptionClass}));
return ((OracleConnection) con).createARRAY(MySchema + ".CAMFORMLIST_ID_TYPES",
CAMFORMListIdType.toArray(new Struct[] {}));
}
});
Map<?, ?> result = execute(objects);
List<MyOffer> items = (List<MyOffer>) result.get(OFEERS_LIST);
return items;
}
}
@组件
公共类GetOffersFromCAMFORM扩展了StoredProcess{
私有静态最终字符串的eers_LIST=“Offers”;
@自动连线
私有字符串MySchema;
@自动连线
@限定符(“MyDataSource”)
私有数据源数据源;
@施工后
施工后公共空间(){
this.setDataSource(dataSourceMy);
这个.setSql(MySchema+“.getOffersFromCAMFORM”);
declareParameter(新的SqlParameter(SUB_FORM,Types.ARRAY,MySchema+“.CAMFORMLIST_ID_Types”);
申报参数(
新的SqlOutParameter(OFEERS_列表、OracleTypes.ARRAY、,
MySchema+“.OFEERS\u INFO\u TYPE”,新返回类型();
}
@抑制警告(“未选中”)
公共列表执行(最终字符串subscriptionForm,最终字符串subscriptionClass)
抛出异常{
Map objects=newhashmap();
put(子表单,新的AbstractSqlTypeValue(){
@凌驾
受保护对象createTypeValue(连接con、int-SqlType、字符串typeName)
抛出SQLException{
OracleConnection oracle=
(OracleConnection)(新的DelegatingConnection(con)).getInnermostDelegate();
if(oracle!=null){
con=甲骨文;
}
ArrayList CAMFORMListIdType=新ArrayList();
CAMFORMListIdType
.add(((OracleConnection)con).createStruct(MySchema+“.CAMFORMLIST\u ID\u TYPE”,
新字符串[]{subscriptionForm,subscriptionClass}));
return((OracleConnection)con).createARRAY(MySchema+“.CAMFORMLIST\u ID\u TYPES”,
toArray(新结构[]{});
}
});
映射结果=执行(对象);
List items=(List)result.get(of eers_List);
退货项目;
}
}
返回类型
public class ReturnType implements SqlReturnType {
@Override
public List<PCOffer> getTypeValue(CallableStatement cs, int colIndx, int sqlType,
String typeName) throws SQLException {
Array dba = (Array) cs.getObject(colIndx);
if (dba == null || ((Object[]) dba.getArray()).length == 0) {
return null;
}
...
}
public类ReturnType实现SqlReturnType{
@凌驾
公共列表getTypeValue(CallableStatement cs、int-colIndx、int-sqlType、,
字符串类型名)引发SQLException{
数组dba=(数组)cs.getObject(colIndx);
if(dba==null | |((Object[])dba.getArray()).length==0){
返回null;
}
...
}
使用Ojdbc 7驱动程序
我没有得到输出。当我执行procueudre时,我在ReturnType类中得到空数组
我做错什么了吗
public class ReturnType implements SqlReturnType {
@Override
public List<PCOffer> getTypeValue(CallableStatement cs, int colIndx, int sqlType,
String typeName) throws SQLException {
Array dba = (Array) cs.getObject(colIndx);
if (dba == null || ((Object[]) dba.getArray()).length == 0) {
return null;
}
...
}