如何使用Java JDBC从Oracle存储过程中检索数组

时间:2018-08-01 09:22:27

标签: java oracle stored-procedures

在我的Oracle数据库中,我输入

CREATE OR REPLACE TYPE DOSSIER_RESULT AS OBJECT
(
  id           number,
  user_id      number
)

此对象的集合

CREATE OR REPLACE TYPE DOSSIER_RESULTS_ARRAY AS TABLE OF DOSSIER_RESULT

还有一个具有最后一个类型的OUT参数的过程

 procedure get_dossier(i_search_mode           in number,
                        i_person_id             in number,
                        i_case_num              in varchar2,
                        i_auto_num              in varchar2,
                        o_dossier_results_array out dossier_results_array)

在Java代码中,我有

public static void getDossierTest(Dossier obj) {

        LOGGER.info("------obj: " + obj);

        Connection conn = null;
        CallableStatement callableStatement = null;
        ResultSet rs = null;
        try {
            conn = DbConnection.getConnection(DbConnection.CONN_SU);
            Map map = conn.getTypeMap();
            map.put("DOSSIER_RESULT", Class.forName("data.DossierSearchResultsModel"));
            conn.setTypeMap(map);

            callableStatement = conn.prepareCall("{call pkg_1av_test.get_dossier(?,?,?,?,?)}");

            callableStatement.setInt(1, 1);
            callableStatement.setLong(2, obj.getId() == null ? 0 : obj.getId());
            callableStatement.setString(3, obj.getNum() == null ? "" : obj.getNum());
            callableStatement.setString(4, obj.getGrnz() == null ? "" : obj.getGrnz());
            callableStatement.registerOutParameter(5, java.sql.Types.ARRAY);

            callableStatement.execute();

            Array array = callableStatement.getArray(5);

            for (Object item : (Object[]) array.getArray()) {
                if (item instanceof DossierSearchResultsModel) {
                    LOGGER.info("------------Got that: " + item.toString());
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        } 

    }

但是在

callableStatement.registerOutParameter(5, java.sql.Types.ARRAY);

我收到以下错误:

ORA-03115: An unsupported network data type or data representation

请帮忙!我究竟做错了什么? 我需要使用Java代码从Oracle存储过程中获取该数组(或collection)

和模型类

package data;

import java.sql.SQLData;
import java.sql.SQLException;
import java.sql.SQLInput;
import java.sql.SQLOutput;

public class DossierSearchResultsModel implements SQLData {

    private Long id;
    private Long original_id;
    private Long parent_id;
    private Integer av_system_id;
    private Integer is_active;
    private String title;
    private Integer org_id;
    private String org_code;
    private Integer card_type;
    private Long user_id;


    @Override
    public String getSQLTypeName() throws SQLException {
        System.out.println("--------getSQLTypeName");
        return "DOSSIER_RESULT";
    }

    @Override
    public void readSQL(SQLInput stream, String typeName) throws SQLException {

    }

    @Override
    public void writeSQL(SQLOutput stream) throws SQLException {

        System.out.println("-----writeSQL");
        stream.writeLong(getId());
        stream.writeLong(getOriginal_id());
        stream.writeLong(getParent_id());
        stream.writeInt(getAv_system_id());
        stream.writeInt(getIs_active());
        stream.writeString(getTitle());
        stream.writeInt(getOrg_id());
        stream.writeString(getOrg_code());
        stream.writeInt(getCard_type());
        stream.writeLong(getUser_id());
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getOriginal_id() {
        return original_id;
    }

    public void setOriginal_id(Long original_id) {
        this.original_id = original_id;
    }

    public Long getParent_id() {
        return parent_id;
    }

    public void setParent_id(Long parent_id) {
        this.parent_id = parent_id;
    }

    public Integer getAv_system_id() {
        return av_system_id;
    }

    public void setAv_system_id(Integer av_system_id) {
        this.av_system_id = av_system_id;
    }

    public Integer getIs_active() {
        return is_active;
    }

    public void setIs_active(Integer is_active) {
        this.is_active = is_active;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Integer getOrg_id() {
        return org_id;
    }

    public void setOrg_id(Integer org_id) {
        this.org_id = org_id;
    }

    public String getOrg_code() {
        return org_code;
    }

    public void setOrg_code(String org_code) {
        this.org_code = org_code;
    }

    public Integer getCard_type() {
        return card_type;
    }

    public void setCard_type(Integer card_type) {
        this.card_type = card_type;
    }

    public Long getUser_id() {
        return user_id;
    }

    public void setUser_id(Long user_id) {
        this.user_id = user_id;
    }


    @Override
    public String toString() {
        return "DossierSearchResultsModel{" +
                "id=" + id +
                ", original_id=" + original_id +
                ", parent_id=" + parent_id +
                ", av_system_id=" + av_system_id +
                ", is_active=" + is_active +
                ", title='" + title + '\'' +
                ", org_id=" + org_id +
                ", org_code='" + org_code + '\'' +
                ", card_type=" + card_type +
                ", user_id=" + user_id +
                '}';
    }
}

0 个答案:

没有答案