Вызов хранимой процедуры в Java

139
28 мая 2019, 22:00

Есть процедура в БД Oracle:

PROCEDURE report_uslugi(p_dat1 in DATE ,p_dat2 in DATE ,rc1 IN OUT pkg_global.ref_cursor_type) AS
p_dat_from DATE;
p_dat_to DATE;
BEGIN
p_dat_from := p_dat1;
p_dat_to := p_dat2;
OPEN rc1 FOR SELECT *** FROM (SELECT * FROM (SELECT *** FROM *** WHERE ***) ***);
END report_uslugi;

Я ее сильно сократил, заменив столбцы, таблицы, условия на ***, но дело не в этом. Процедура рабочая и при ее вызове выгружается список услуг

Как вызвать такую процедуру в Java? Я так пытаюсь сделать

try (Connection connection = DBConnection.getConnection()) {
    CallableStatement cstmt = connection.prepareCall("{call pkg_report_usl.report_uslugi(?, ?, ?)}");
    cstmt.setDate(1, sqlDate1);
    cstmt.setDate(2, sqlDate2);
    cstmt.registerOutParameter(3, Types.REF_CURSOR);
    cstmt.execute();
}
catch (Exception e) {
    e.printStackTrace();
}

Получаю ошибку

java.sql.SQLException: Недопустимый тип столбца: 2012 at oracle.jdbc.driver.OracleStatement.getInternalType(OracleStatement.java:4369) at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:137) at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:335) at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:583) at oracle.jdbc.driver.OracleCallableStatementWrapper.registerOutParameter(OracleCallableStatementWrapper.java:1603) at myapp.start.Main.start(Main.java:63) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428) at java.base/java.security.AccessController.doPrivileged(Native Method) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174) at java.base/java.lang.Thread.run(Thread.java:834)

В строке cstmt.registerOutParameter(3, Types.REF_CURSOR);

Как правильно ее вызвать?

Answer 1

Oracle он и в Африке Oracle - у них все по своему через одно место :)

Попробуйте так:

cstmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);

Только надо использовать родной JDBC драйвер Oracle

READ ALSO
O jsoup и magnet-ссылках

O jsoup и magnet-ссылках

Программа на Java вытаскивает magnet ссылки со страницы определенного торрент-трекера

100
Создание валидных файлов .class из Java кода

Создание валидных файлов .class из Java кода

Есть интерес в создании откомпилированного класс-файла прямо из кода

131
Java HashSet Points

Java HashSet Points

Всем приветТакой вопрос связанный по Jav'е, я ее пока еще изучаю

101