Как использовать JPA или JDB C для вызова функции Speci c PL / SQL с помощью REF CURSOR - PullRequest
1 голос
/ 18 января 2020

Моя проблема в том, что я хочу вызвать функцию PL / SQL в методе @PostConstruct в Spring Boot.

Эта функция возвращает информацию о таблицах в базе данных, как показано выше:

CREATE OR REPLACE FUNCTION dbINFO
return sys_refcursor AS 
table_info sys_refcursor;
begin
    open table_info
        for select table_name from all_tables where owner = 'HOMEUSER';

        return table_info;
end;

Я пытался использовать аннотацию @NamedStoreProcedureQuery, но у меня нет сущности, с которой ее можно использовать. Поэтому я решил попробовать сделать это с JDB C, и пока у меня есть что-то вроде этого.

    private EntityManager entityManager;

    public HospitalApplication(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

@PostConstruct
    private void init() throws SQLException {
        System.out.println("\n\n\n\n\n\n");
        EntityManagerFactoryInfo info = (EntityManagerFactoryInfo) entityManager.getEntityManagerFactory();
        Connection connection = info.getDataSource().getConnection();

        CallableStatement stmt = connection.prepareCall("BEGIN dbINFO(); END;");
        stmt.registerOutParameter(1, OracleTypes.CURSOR);
        stmt.execute();
        ResultSet rs = ((OracleCallableStatement)stmt).getCursor(1);
        while (rs.next()){
            System.out.println(rs.getString(1));
        }
        rs.close();
        stmt.close();

        System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    }

Проблема в том, что моя программа выдает java .sqlException о столбце с неверным индексом.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hospitalApplication': Invocation of init method failed; nested exception is java.sql.SQLException: Incorrect column index

*** РЕДАКТИРОВАТЬ ****

Я пытался что-то подобное, и я получаю сообщение об ошибке:

PLS-00905: obiekt HOMEUSER.DBINFO is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
@PostConstruct
    private void init() throws SQLException {
        System.out.println("\n\n\n\n\n\n");
        EntityManagerFactoryInfo info = (EntityManagerFactoryInfo) entityManager.getEntityManagerFactory();
        Connection connection = Objects.requireNonNull(info.getDataSource()).getConnection();

        CallableStatement stmt = connection.prepareCall("{ ? = call dbINFO()}");
        stmt.registerOutParameter(1, OracleTypes.CURSOR);
        stmt.execute();
        ResultSet rs = (ResultSet) stmt.getObject(1);
    while (rs.next()){
        System.out.println(rs.getCursorName());
        }
        rs.close();
        stmt.close();

        System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...