java - 如何从java类获取用户定义的sql过程输出参数

标签 java sql stored-procedures callable-statement

我有一个 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/

相关文章:

java - 解码时出现意外的元素错误

Mysql大数据表查询

PHP zend left join 转换查询中的日期

mysql - 在where子句中使用case语句更好还是构建动态查询更好

mysql存储过程声明在执行时抛出错误

delphi - Oracle - 存储过程不是比应用程序内查询更受青睐吗?

java - java中带参数的jFrame表单调用jpanel表单

java - 如何使用 pom.xml 插件添加 VM 参数

java - 使用 ArrayList 比 Java 中的简单数组贵得多吗?

sql - 参数化 SQL IN 子句