블로그 이미지
신비마마

태그목록

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

calendar

1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

AUTONOMOUS_TRANSACTION 처리

2011. 1. 3. 19:49 | Posted by 신비마마

Function 사용도중 아래와 같은 에러를 만나게 되는경우가 있다.

 

ORA-14551: 질의 안에 DML 작업을 수행할 수 없습니다.

 

이메세지는 Function 문에서 DML(Insert, Update, Delete)문을 사용하지 못하는 경우에 발생하는 오류인데

이 오류를 제거하려면

DML을 처리하는 문법은 Procedure에서 값을 리턴하는 문법은 Function에서 각각 처리하도록 변경해준다.

 

Procedure

CREATE OR REPLACE PROCEDURE P_GET_FILEINFO(I_FILE_NAME IN VARCHAR2, O_MSG OUT VARCHAR2)
IS

BEGIN
  --DML 수행
  COMMIT;
  
  EXCEPTION 
  WHEN NO_DATA_FOUND THEN
   --오류처리
   ROLLBACK;
  WHEN OTHERS THEN
    --오류처리
   ROLLBACK;
  END;
END

 

Function

CREATE OR REPLACE FUNCTION F_GET_FILEINFO( I_FILE_NAME in VARCHAR2)  RETURN VARCHAR2 IS
O_MSG VARCHAR2(2000);
BEGIN
            
        P_GET_FILEINFO(I_FILE_NAME, O_MSG);
        RETURN O_MSG;

END F_GET_FILEINFO ;

 

이렇게 처리해도 마찬가지로

ORA-14551: 질의 안에 DML 작업을 수행할 수 없습니다.

에러가 발생하는데, 이럴경우에는 트랜잭션을 Procedure / Function을 분리해 준다.

Procedure에 아래 문법을 추가해준다.

CREATE OR REPLACE PROCEDURE P_GET_FILEINFO(I_FILE_NAME IN VARCHAR2, O_MSG OUT VARCHAR2)
IS

/**************************************************
    Main Transaction에 영향없이 Commit/Rollback 처리
***************************************************/
PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

 

이상은 Oracle 10g에서 테스트 되었습니다.

참고

http://blog.naver.com/yooysj?Redirect=Log&logNo=120065898810

http://blog.naver.com/supernam?Redirect=Log&logNo=24012181

http://blog.naver.com/jjaemani?Redirect=Log&logNo=50001741324



[출처] 승제만세 By Chostar : http://manseya.blog.me/50081264080