Мы пытаемся реализовать решение, которое требует от нас,
Частый опрос контрольной таблицы для запроса необработанных транзакций
Как только мы извлекаем идентификаторы транзакций из шага 1, мы должны запросить детали.Этот шаг является существующей функциональностью, только мы выполняем полное сканирование, объединяя его с контрольной таблицей на первом шаге.
Существующее решение начинает замедлять обработку при наличии тома.Поэтому мы решили извлечь транзакции, которые не были обработаны, из таблицы состояния и выполнить поиск PK для запроса деталей.
Я понимаю, что это не идеальное решение, такое как адаптеры, CDC или полное представление деталей в виде.Мы ограничены из-за контракта на продукт, который запрещает нам создавать объекты любого типа в исходной схеме или в любом месте исходного экземпляра Oracle, что оставляет нам опрос таблиц, и это решение должно быть масштабируемым и практически в реальном времени (задержка 5 секунд).
DDL:
CREATE TABLE "CONTROL_TABLE"
(
"REF_NO" VARCHAR2(16 CHAR),
"BRANCH" VARCHAR2(3 CHAR),
"INIT_DATE" DATE,
"STATUS" VARCHAR2(1 CHAR),
CONSTRAINT "CONST_CONTROL_TABLE" PRIMARY KEY ("REF_NO")
)
Ниже приведено то, что я пробовал в качестве POC, выполняя приведенный ниже блок,
1. Создал блок для запуска SELECT для UPDATE следующим образом.В приведенном ниже блоке я выбираю для обновления «SKIP LOCKED» и обновлять записи в области видимости курсора.
DECLARE
CURSOR tCURSOR IS
SELECT REF_NO FROM CONTROL_TABLE
WHERE STATUS = 'U' FOR UPDATE OF STATUS SKIP LOCKED;
BEGIN
FOR tCURSORREC IN tCURSOR LOOP
UPDATE CONTROL_TABLE SET STATUS='W' WHERE STATUS='U';
END LOOP;
COMMIT;
END;
Приведенный выше блок работает просто отлично, и я проверил, вставив новые записи случайным образом и обновив статус из разных сеансов клиента.Моя проблема в том, что я хотел бы вернуть курсор клиенту Java для последующей обработки.Обратился к предыдущему посту, где только запрос SELECT возвращает Java привязки курсора.Любой полезный указатель высоко ценится. Выполнить анонимный блок pl / sql и получить набор результатов в java
Фрагмент Java, который запускает блок,
public static void main(String args[]) throws Exception
{
final Connection c = DriverManager.getConnection("jdbc:oracle:thin:<<service_name>>:8888:<<schema>>", "user", "passwd");
String plsql = "declare\r\n" +
" cursor tCursor is\r\n" +
" select ref_no from CONTROL_TABLE \r\n" +
" where status = 'U' for update of REF_NO,STATUS skip locked;\r\n" +
"begin\r\n" +
" for tCursorRec in tCursor loop\r\n" +
" update CONTROL_TABLE set status='W' where status ='U'; \r\n" +
" end loop;\r\n" +
" commit; \r\n" +
"? := tCursor" +
"end;";
CallableStatement cs = c.prepareCall(plsql);
cs.registerOutParameter(1, OracleTypes.CURSOR);
cs.execute();
ResultSet cursorResultSet = (ResultSet) cs.getObject(1);
while (cursorResultSet.next ())
{
System.out.println (cursorResultSet.getString(1));
}
cs.close();
c.close();
Exception:Exception in thread "main" java.sql.SQLException: ORA-06550:
line 10, column 8:
PLS-00382: expression is of wrong type
ORA-06550: line 10, column 1: