Моя проблема в том, что я хочу вызвать функцию 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");
}