Как получить пользовательский параметр sql процедуры из класса Java - PullRequest
1 голос
/ 07 апреля 2011

У меня есть одна процедура sql с параметрами 3 IN и 1 OUT. В котором параметр OUT имеет определенный пользователем тип данных, который означает, что это один тип таблицы, поэтому я хочу получить этот вывод типа таблицы из класса Java. Я попытался получить это, создав один класс Java, который реализован java.sql.Struct и использовал его в одном компоненте поддержки CallableStatement registerOutParameter как тип java.sql.Struct, но получил ошибки.

На самом деле ниже приведена ситуация, для которой я хочу найти решение.

В моем случае я хочу сохранить 500 или более записей, сохраняя одну за другой классом Java. Но вместо этого я хочу использовать процесс Oracle, в котором, если мы передадим какой-либо параметр для вставки данных в таблицу, то процедура вставит все данные по одному и, сделав это, если в любой позиции произойдет какая-либо ошибка, эта запись переместится в один определенный пользователем тип табличного типа, используя ряд труб (). Поэтому я хочу получить пользовательский объект табличного типа, используя класс Java.

Есть ли у вас какие-либо идеи для такого рода проблем?

Ответы [ 2 ]

1 голос
/ 02 мая 2011

Я разработчик jOOQ , и я создал jOOQ именно для этих целей.Помимо полной поддержки SQL в jOOQ, вы можете создавать классы Java как для хранимых процедур, так и для пользовательских типов.Ваш вызов хранимой процедуры будет выглядеть примерно так в Java.

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

В Oracle это в настоящее время относится к типам OBJECT и VARRAY.См. Руководство jOOQ для получения дополнительной информации

1 голос
/ 01 мая 2011

Вы можете определить несколько типов объектов оракула.В случае объектов оракула они отображаются на java.sql.Struct.В случае коллекций (например, типа таблиц, на которые вы ссылаетесь, насколько я понимаю) они сопоставляются с java.sql.Array.Просто зарегистрируйте свой выходной параметр как java.sql.Array.В случае более старых драйверов JDBC oracle (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();
}

В такомВ этом случае вам не нужно определять специальный тип коллекции оракулов для вывода, просто верните ref cursor в PL / SQL.

...