如何从java类中获取用户定义的sql过程out参数

如何从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类逐个保存

我有一个sql过程,有3个IN和1个OUT参数。其中OUT参数具有用户定义的数据类型,这意味着它是表的一种类型, 所以我想从java类中得到这个表类型的输出。 我试图通过创建一个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吗????