나는 고정되지 않은 여러 행을 반환하는 동안 오라클은 ROWNUM
및 SELECT ... FOR UPDATE SKIP LOCKED
을 처리하는 방법의 문제를 해결하기 위해 노력 해왔다. 나는 다음과 같은 많은 해결책을 시도했다 : Force Oracle to return TOP N rows with SKIP LOCKED뿐만 아니라 그 질문에서 발견 된 것들과 매우 유사한 몇 가지 다른 예들. 필자는 Oracle AQ가이 문제를 해결하는 가장 좋은 솔루션이라는 것을 알고 있지만 데이터베이스에 대한 제어권은 거의 가지고 있지 않으며 아이디어에 대한 상당한 저항을 경험했습니다. Oracle 함수에서 여러 행을 잠그고 반환하려면 어떻게해야합니까?
내가으로 실행하고 문제
는 JDBC를 사용하여 Java로 다시 결과를 얻기 위해 노력하고있다. 나는setFetchSize(20)
을 시도했지만, 상위 20 개의 행만 클라이언트에 배포되는 문제에 직면합니다. 나는 일반적으로 하나의 처리 에이전트가 20 개의 행을 얻거나 몇 개의 프로세서가 일부 행을 가져 오는 것을 봅니다. 모두 20 개를 더합니다. 이것은
ROWNUM
을
SELECT ... FOR UPDATE SKIP LOCKED
과 함께 사용하는 것과 매우 비슷합니다.
내가 시도 가장 유망한 솔루션은 다음과 같은 기능입니다 : 내가 지금처럼 호출하려고 할 때, 그러나
create type IND_ID as object
(
ID varchar2(200)
);
create type IND_ID_TABLE as table of IND_ID;
create or replace function SELECTIDS return IND_ID_TABLE
pipelined is
ST_CURSOR SYS_REFCURSOR;
ID_REC IND_ID := IND_ID(null);
begin
open ST_CURSOR for
select ID
from TABLE
/* where clause */
for update SKIP LOCKED;
loop
fetch ST_CURSOR
into ID_REC.ID;
exit when ST_CURSOR%rowcount > 20 or ST_CURSOR%notfound;
pipe row(ID_REC);
end loop;
close ST_CURSOR;
return;
end;
:
select * from table(SELECTIDS)
은 내가
ORA-14551: cannot perform a DML operation inside a query
오류가 발생, 지금은 이해하는 거래와 관련된 문제입니다. 잠금을 제거하면 함수가 행을 반환합니다.
잠금 기능을 유지하면서이 기능에서 여러 행을 JDBC로 가져 오려면 어떻게해야합니까?
ref 커서 출력 매개 변수가있는 프로 시저를 사용할 수 있습니까? 또는 참조 커서를 반환하는 함수입니다. 그렇다면 쿼리에서 함수를 사용하는 대신 proc/함수를 직접 호출해야합니다. 문제를 피할 수 있을지는 모르겠지만 문제가 될 수 있습니다. –
@AlexPoole 귀하의 제안에 따라, 적어도 하나의 행을 가져 와서이를 프로 시저로 변경하고 OUT 매개 변수를 사용하는 방법을 파악할 수 있었고 잠금을 유지합니다. 몇 가지 PEBKAC 오류도 발견했으며 대체 솔루션을 사용할 수 있습니다. 감사. – atreides322