如何从java类中获取用户定义的sql过程out参数
我有一个sql过程,有3个IN和1个OUT参数。其中OUT参数具有用户定义的数据类型,这意味着它是表的一种类型, 所以我想从java类中得到这个表类型的输出。 我试图通过创建一个java类来实现这一点,该类被如何从java类中获取用户定义的sql过程out参数,java,sql,stored-procedures,callable-statement,Java,Sql,Stored Procedures,Callable Statement,我有一个sql过程,有3个IN和1个OUT参数。其中OUT参数具有用户定义的数据类型,这意味着它是表的一种类型, 所以我想从java类中得到这个表类型的输出。 我试图通过创建一个java类来实现这一点,该类被java.sql.Struct实现,并通过CallableStatementregisterOutParameter作为java.sql.Struct类型在一个支持bean中使用,但出现了错误 实际上,下面是我想要解决的情况 在我的例子中,我想保存500条或更多记录,并通过Java类逐个保存
java.sql.Struct
实现,并通过CallableStatement
registerOutParameter作为java.sql.Struct
类型在一个支持bean中使用,但出现了错误
实际上,下面是我想要解决的情况
在我的例子中,我想保存500条或更多记录,并通过Java类逐个保存。但我希望使用Oracle流程,在该流程中,如果我们传递一些参数以将数据插入表中,那么该流程将逐个插入所有数据,如果在任何位置发生任何错误,那么该记录将使用pipe row()进入一个用户定义的tabletype对象。所以我想使用java类获取用户定义的tabletype对象
您对这种类型的问题有什么想法吗?您可以定义几种oracle对象类型。对于oracle对象,它们被映射到
java.sql.Struct
。对于集合(如据我所知,您正在引用的表类型),它们被映射到java.sql.Array
。只需将out参数注册为java.sql.Array
。对于较旧的oracle JDBC驱动程序(10g),请记住使用对类型(包括架构)的完全引用,否则可能会出现“无效类型”之类的错误:
例如:
stmt.registerOutParameter(4, Types.ARRAY, "SCHEMA.TABLE_TYPE");
stmt.execute();
Array array = stmt.getArray(4);
如果您有很多这样的代码,您可以从eclipselink的方法中获益:
@Entity
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(
name = "Company.getCompanies",
procedureName = "SQL_PACKAGE.GET_COMPANIES",
parameters = {
@StoredProcedureParameter(queryParameter = "p_filter", direction = Direction.IN),
@StoredProcedureParameter(queryParameter = "p_result", direction = Direction.OUT_CURSOR),
},
resultClass = Company.class)
})
public class Company {
@Id
@Column(name = "COMPANY_NO")
private Long companyNo;
@Column(name = "COMPANY_NAME")
private String companyName;
public Long getCompanyNo() {
return companyNo;
}
public String getCompanyName() {
return companyName;
}
}
然后在DAO中使用这样一个实体:
@Transactional(readOnly = true)
public List<Company> getCompanies(String filter) {
EntityManager em = entityManagerProvider.get();
Query query = em.createNamedQuery("Company.getCompanies");
query.setParameter("p_filter", filter);
return query.getResultList();
}
@Transactional(readOnly=true)
上市公司(字符串过滤器){
EntityManager em=EntityManager提供程序.get();
Query Query=em.createNamedQuery(“Company.getcompanys”);
setParameter(“p_filter”,filter);
返回query.getResultList();
}
在这种情况下,您不必为输出定义特殊的oracle集合类型,只需在PL/SQL中返回ref cursor
。我是的开发人员,我创建jOOQ正是为了这些目的。除了jOOQ的完全SQL支持之外,您还可以为存储过程和用户定义的类型生成Java类。在Java中,存储过程调用将类似于这样
MyUserType result = Procedures.myProcedure(1, 2, 3);
在Oracle中,这目前适用于
对象
和VARRAY
类型。有关更多信息,请参见您使用的是哪个数据库?显示您的代码和错误,否则没有人能帮助Quick Google为我提供了这些链接-我相信Oracle JDBC方法()和Spring converter()都可以工作。我有两个OUT参数,它们是自定义Oracle对象(employee和financial对象,有一组字段40+)。我在Java代码中将它们的类型设置为“OracleTypes.STRUCT”,然后在存储过程执行后调用“STRUCT.getObject()”获取对象,然后我可以使用“structObject.getAttributes()”获取它们所有值的对象[]。但是我必须手动将其中的40个字段设置为Java POJO(因为无法将Object[]数组直接强制转换为Java POJO…)。没有更简单的方法将Oracle结构(Java.sql.Struct)映射到Java POJO吗????