#java #oracle #plsql
#java #Oracle #plsql
Вопрос:
Я новичок в Java и PLSQL. Я создал эту процедуру в PLSQL:
PROCEDURE getLogs (
p_idcontract IN NUMBER,
p_iduser IN NUMBER,
o_logs OUT VARCHAR2
)
IS
BEGIN
SELECT logData INTO o_logs
FROM SERVICELOG
WHERE IDCONTRACT= p_idcontract
AND IDUSER= p_iduser;
END getLogs;
Если скрипт обнаруживает несколько строк, вернитесь к классу Java, который запускает его, с этим сообщением:
ORA-01422: точная выборка возвращает больше запрошенного количества строк
Пожалуйста, как я могу вернуть hashmap или аналогичный, готовый для вывода на Java? Спасибо.
Комментарии:
1. Вам нужно
cursor
Ответ №1:
Я бы использовал курсор ссылки в качестве выходного параметра, а затем построил карту внутри программы Java. https://oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets Вы также можете определить тип пользователя в oracle, который будет чем-то вроде Java Array.
PROCEDURE getLogs (
p_idcontract IN NUMBER,
p_iduser IN NUMBER,
p_recordset OUT SYS_REFCURSOR
)
IS
BEGIN
OPEN p_recordset FOR
SELECT logData
FROM SERVICELOG
WHERE IDCONTRACT= p_idcontract
AND IDUSER= p_iduser;
END getLogs;
Java-код:
CallableStatement stmt = conn.prepareCall("BEGIN getLogs(?, ?, ?); END;");
stmt.setInt(1, 0);
stmt.setInt(2, 0);
stmt.registerOutParameter(3, OracleTypes.CURSOR);
stmt.execute();
ResultSet rs = ((OracleCallableStatement)stmt).getCursor(3);
while (rs.next()) {
;
//here build your Map, list or whatever you want
}
Комментарии:
1. Пожалуйста, не могли бы вы поделиться со мной примером?
2. Я отредактировал ответ, чтобы добавить ссылку на учебник, как использовать курсор ссылки.
3. Спасибо. Теперь я получил эту ошибку: «PLS-306: неправильный номер или типы аргументов при вызове GETLOGS». Может быть ошибка «на стороне Java» при определении p_recordset как МАССИВА?
4. Это не массив. В ссылке, которую я опубликовал, у вас есть пример кода Java, как считывать значения из ref cursor. Если вы вернули курсор ссылки, вам необходимо создать массив на стороне Java, пройдя через ResultSet.
5. Работает как шарм. Спасибо!!