Есть процедура в БД 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);
Как правильно ее вызвать?
Oracle он и в Африке Oracle - у них все по своему через одно место :)
Попробуйте так:
cstmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);
Только надо использовать родной JDBC драйвер Oracle
Виртуальный выделенный сервер (VDS) становится отличным выбором
Программа на Java вытаскивает magnet ссылки со страницы определенного торрент-трекера
Есть интерес в создании откомпилированного класс-файла прямо из кода