2014-11-11 2 views
1

oracle 데이터베이스의 temp_table 테이블에 100 개의 DMLS가 있습니다. 해당 테이블 seq_no, DMLS, Status에는 세 개의 열이 있습니다. 아래 표는 아래와 같습니다. 데이터베이스의 테이블에서 dmls를 실행하는 방법은 무엇입니까?

NULL

이 NULL SEQNO, dmls, 상태

1, ...에 삽입, 업데이트, 테이블 ......

.

100

, 삭제 테이블 ...,

NULL은 내가 SEQNO에 따라 행함으로써 테이블 행을 읽고 데이터베이스에 해당 행에 DML을 실행하고 싶습니다. 성공적으로 실행 된 후이 테이블의 상태 열은 완료로 업데이트되어야합니다. DML이 실행에 실패하면 FAILED로 업데이트되고 다음 행을 처리하지 않고 중지됩니다. 나는 아래의 절차를 썼지 만 그것은 필요하지 않았다. 아무도 내가 여기에없는 것을 말해 줄 수 있습니까?

CREATE or REPLACE PROCEDURE DML_PROC is 

CURSOR dml_cur is SELECT SEQ_NO,DMLS,STATUS FROM DMLS_TBL where STATUS=NULL order by SEQ_NO; 

BEGIN 
FOR I IN dml_cur 
LOOP 

EXECUTE IMMEDIATE 'I.DMLS'; 

UPDATE DMLS_TBL SET STATUS='SUCCESS' 
WHERE SEQ_NO=I.SEQ_NO; 
END LOOP; 

COMMIT; 

EXCEPTION 

WHEN OTHERS THEN NULL; 

END DML_PROC; 

답변

0

2 문제;

1)는 실제로 문자열 'I.DMLS' 자체가 아닌 값을 실행 .. STATUS IS NULL
2) EXECUTE IMMEDIATE 'I.DMLS'이어야한다.

변경된 코드는 다음과 같을 수 있습니다. 모든 DML이 실행되고 상태를 캡처 할 수 있도록 BEGIN 블록을 추가했습니다.

CREATE or REPLACE PROCEDURE DML_PROC is 
CURSOR dml_cur is 
    SELECT SEQ_NO,DMLS,STATUS 
    FROM DMLS_TBL 
    where STATUS IS NULL 
    order by SEQ_NO; 
V_STATUS VARCHAR2(10); 
BEGIN 
FOR I IN dml_cur 
LOOP 
    V_STATUS := 'SUCCESS'; 
    <<execute_ddl>> 
    BEGIN 
      EXECUTE IMMEDIATE I.DMLS; 
    EXCEPTION 
     WHEN OTHERS THEN 
     V_STATUS := 'FAILURE'; 
     DBMS_OUTPUT.PUT_LINE(I.DMLS ||' Error : ' ||SQLERRM); 
    END execute_ddl; 

    UPDATE DMLS_TBL SET STATUS = V_STATUS 
    WHERE SEQ_NO = I.SEQ_NO; 

END LOOP; 

COMMIT; 

EXCEPTION 
WHEN OTHERS THEN 
NULL; 
END DML_PROC; 
/
+0

답장을 보내 주셔서 감사합니다. 나는 변화를 만들어 냈고 효과가 있었다. 하지만 테이블이 status = failure로 업데이트 될 때 프로 시저를 실행할 때 문이 실패했습니다. DMLS_TBL 테이블의 동일한 명령문을 복사하여 편집기에 붙여 넣으면 성공적으로 실행됩니다. 삽입 문에서 구문 오류가 있는지 확인했지만 찾지 못했습니다. 내가 무엇을 놓치고 있는지 확실하지 않다. – Sean

+0

마지막 문장의 세미콜론은 무엇입니까? –

+0

@Sean DBMS_OUTPUT.PUT_LINE (I.DMLS || '오류 :'|| SQLERRM);을 내부 예외 블록에 추가하면 실패한 이유가 표시됩니다! –

관련 문제