我有一个 sql 过程,有 3 个 IN 和 1 个 OUT 参数。其中 OUT 参数具有用户定义的数据类型,这意味着它是表的一种类型,
所以我想从java类中获取这个表类型的输出。
我试图通过创建一个已实现的 java 类来实现这一点 java.sql.Struct
并通过 CallableStatement
在一个支持 bean 中使用它将输出参数注册为 java.sql.Struct
输入 ,但出现错误。
实际上以下是我想要解决方案的情况。
就我而言,我想通过 Java 类逐一保存 500 条或更多记录。但我想要 Oracle 进程,如果我们传递一些用于将数据插入表中的参数,那么该过程将一一插入所有数据,并且通过这样做,如果在任何位置发生任何错误,则该记录将使用以下命令进入一个用户定义的表类型对象:管道行()。所以我想使用java类获取用户定义的表类型对象。
您对此类问题有什么想法吗?
最佳答案
您可以定义多种 Oracle 对象类型。对于 oracle 对象,它们被映射到 java.sql.Struct
。对于集合(例如您引用的表类型,据我所知),它们被映射到 java.sql.Array
。只需将您的输出参数注册为 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();
}
在这种情况下,您不必为输出定义特殊的 oracle 集合类型,只需在 PL/SQL 中返回引用游标
即可。
关于java - 如何从java类获取用户定义的sql过程输出参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5580884/