2016-12-21 3 views
0

다음은 Callabe Statement.Statement를 사용하여 호출하는 함수입니다. java.awt에서 rowtype을 사용할 수 없으므로 순서가 잘못되었습니다. 은 java.sql.SQLException은 : ORA-01002은 : 커서가 한 행을 반환하기 때문에 당신은 오류가Callabe 문 Oracle Update 잠겨있는 반입 순서 오류 오류 건너 뛰기

session.connection().setAutoCommit(false); 
    cs = session.connection().prepareCall("{?=call dequeue}"); 
    cs.registerOutParameter(1, OracleTypes.CURSOR); 
    cs.executeUpdate(); 
    session.connection().commit(); 
    ResultSet rs = (ResultSet) cs.getObject(1); 
    while(rs.next()) 
+0

해당 기능을 이해하려고 할 때 몇 가지 문제점이 있습니다. 그 기능이 원하는 것은 무엇입니까? – Rene

+0

이 함수는 단일 행을 반환하고 행의 한 열을 'Working'으로 업데이트하고 같은 행을 반환해야합니다 (커서가 반환 될 수 있도록 Rowtype이 호출 가능으로 반환되지 않음) –

답변

1

다음 그 행이 이미되었습니다로

create or replace FUNCTION DEQUEUE 
RETURN SYS_REFCURSOR 
IS 
    c_Result SYS_REFCURSOR; 
BEGIN 
    OPEN c_Result FOR SELECT * FROM QUEUE_SKIP_LOCKED WHERE ROWNUM=1 FOR UPDATE SKIP LOCKED; 
declare 
    c_fdbQueuerow sys_refcursor; 
    l_queueRow QUEUE_SKIP_LOCKED%rowtype; 
    begin 
    c_fdbQueuerow := c_Result; 
loop 
    fetch c_fdbQueuerow into l_queueRow; 
    IF l_queueRow.key IS NOT NULL THEN 
     UPDATE QUEUE_SKIP_LOCKED SET STATUS='WORKING' WHERE KEY=l_queueRow.key; 
    END IF; 
    exit when c_fdbQueuerow%notfound; 
    end loop; 
    RETURN c_fdbQueuerow; 
end; 
    EXCEPTION 
    WHEN OTHERS THEN 
    RAISE; 
END dequeue; 

Callabe 문은 순서가 가져 가져 왔습니다.

마지막 행을 검색 한 후 fetch 문을 실행하지 마십시오. 가져올 행이 더 이상 없습니다.

1 업데이트되어야하는 행의 ID를 반환하는 함수 :

낫다에 기능을 분할.

2 ID를 이용하여 업데이트를

3 추가 처리를 수행하는 방법.

+0

이 작업은 가능하지만 추가 오버 헤드가 발생합니다 레코드를 가져오고 자바 측에서 어떤 액션을 수행하기 위해 리턴 된 ID를 사용하는 것은 동일한 이유 때문에 이것이 가능할 수있는 곳에서 가능한 모든 수정을 rowtype하고 싶었 기 때문입니다. –