2011-04-07 37 views
1

我有一个SQL过程有3个IN和1个OUT参数。其中OUT参数具有用户定义的数据类型,这意味着它是一种类型的表, 所以我想从java类获取此表类型输出。 我试图通过使一个java类实现java.sql.Struct,并使用它在CallableStatement registerOutParameter作为java.sql.Struct类型的一个支持bean中,但有错误。如何从java类获取用户定义的SQL过程参数

其实下面是我想要的解决方案的情况。

在我的情况下,我想要保存500个或更多的记录由Java类逐一保存。但是我想要的是Oracle过程,如果我们传递一些参数用于将数据插入到表中,那么过程会逐个插入所有数据,如果在任何位置出现任何错误,则该记录将使用一个用户定义的表类型对象管排()。所以我想用java类获取用户定义的表类型对象。

你对这类问题有什么想法吗?

+0

您正在使用哪个数据库? – 2011-04-07 12:23:02

+1

显示您的代码和错误,否则没有人能够帮助 – 2011-04-07 12:23:15

+0

即时通讯工作与Oracle 11g。 – Annu 2011-04-07 12:33:00

回答

1

您可以定义多个oracle对象类型。在oracle对象的情况下,它们映射到java.sql.Struct。在集合的情况下(就像我所了解的那样,引用的表类型)它们映射到java.sql.Array。只需注册您的输出参数为java.sql.Array。在较早的预言的情况下,JDBC驱动程序(10G)记得使用完整引用类型(包括模式),否则你可能会喜欢“无效型”或类似的错误:

例子:

stmt.registerOutParameter(4, Types.ARRAY, "SCHEMA.TABLE_TYPE"); 
stmt.execute(); 
Array array = stmt.getArray(4); 

如果你有很多的这样的代码,你可以从的EclipseLink的方法中获益:

@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(); 
} 

@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使用这样的实体

在这种情况下,您不必为输出定义特殊的oracle集合类型,只需在PL/SQL中返回ref cursor即可。

1

我是jOOQ的开发者,我为这些目的准确创建了jOOQ。除了jOOQ的完整SQL支持外,您还可以为存储过程和用户​​定义类型生成Java类。您的存储过程调用将在Java中看起来像这样。

MyUserType result = Procedures.myProcedure(1, 2, 3); 

在Oracle中,这个目前适用于OBJECTVARRAY类型。请参阅jOOQ manual以获取更多信息

相关问题