2012-06-21 2 views
2

나는 고정되지 않은 여러 행을 반환하는 동안 오라클은 ROWNUMSELECT ... FOR UPDATE SKIP LOCKED을 처리하는 방법의 문제를 해결하기 위해 노력 해왔다. 나는 다음과 같은 많은 해결책을 시도했다 : Force Oracle to return TOP N rows with SKIP LOCKED뿐만 아니라 그 질문에서 발견 된 것들과 매우 유사한 몇 가지 다른 예들. 필자는 Oracle AQ가이 문제를 해결하는 가장 좋은 솔루션이라는 것을 알고 있지만 데이터베이스에 대한 제어권은 거의 가지고 있지 않으며 아이디어에 대한 상당한 저항을 경험했습니다. Oracle 함수에서 여러 행을 잠그고 반환하려면 어떻게해야합니까?

내가으로 실행하고 문제

는 JDBC를 사용하여 Java로 다시 결과를 얻기 위해 노력하고있다. 나는 setFetchSize(20)을 시도했지만, 상위 20 개의 행만 클라이언트에 배포되는 문제에 직면합니다. 나는 일반적으로 하나의 처리 에이전트가 20 개의 행을 얻거나 몇 개의 프로세서가 일부 행을 가져 오는 것을 봅니다. 모두 20 개를 더합니다. 이것은 ROWNUMSELECT ... 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로 가져 오려면 어떻게해야합니까?

+3

ref 커서 출력 매개 변수가있는 프로 시저를 사용할 수 있습니까? 또는 참조 커서를 반환하는 함수입니다. 그렇다면 쿼리에서 함수를 사용하는 대신 proc/함수를 직접 호출해야합니다. 문제를 피할 수 있을지는 모르겠지만 문제가 될 수 있습니다. –

+0

@AlexPoole 귀하의 제안에 따라, 적어도 하나의 행을 가져 와서이를 프로 시저로 변경하고 OUT 매개 변수를 사용하는 방법을 파악할 수 있었고 잠금을 유지합니다. 몇 가지 PEBKAC 오류도 발견했으며 대체 솔루션을 사용할 수 있습니다. 감사. – atreides322

답변

-1

이것은 효과가 없을 것입니다. select 문에서 pl/sql 함수를 호출하고 해당 함수에서 트랜잭션을 시작하려고합니다. 나는 그 오류가 꽤 분명하다고 생각한다.

+0

나는 어디서 오류인지 알기 때문에 클라이언트 잠금을 갖고 현재 잠겨져 있지 않은 처음 20 개의 행을 검색하는 작업을 수행하는 방법을 알지 못했습니다. 그러나 나는 내가해야 할 일을하는 완전히 다른 해결책을 찾았다 고 생각한다. 현재 테스트 중입니다. – atreides322

관련 문제