[질문]함수내 UPDATE문 사용 0 4 3,683

by 박동원 [PL/SQL] [2010.07.18 17:13:25]


안녕 하세요? 함수 내에서 UPDATE문 사용 질문 드립니다.

함수 내에서 일반적인 형태로는 오류가 발생하는데

맞는 것인지 궁금합니다.

그래서 이것을 해결 할려면 아래와 같은 옵션을 사용해야 하는것 같은데 답변 부탁 드립니다.

감사합니다.

옵션 내용: PRAGMA AUTONOMOUS_TRANSACTION;
에러 메시지: cannot perform a DML operation inside a query
(에러 내용은 update문을 사용 못하는것 같음)


/*
 * 테스트 테이블 생성 및 데이터 입력
 */
CREATE TABLE TBL_USER(
   USER_SEQ    NUMBER,
   USER_NAME   VARCHAR2(50),
   CONSTRAINT PK_TBL_USER PRIMARY KEY(USER_SEQ)
)
/

INSERT INTO TBL_USER(USER_SEQ, USER_NAME)
VALUES(1, '홍길동')
/

INSERT INTO TBL_USER(USER_SEQ, USER_NAME)
VALUES(2, '이순신')
/

/*
 * 함수 생성
 */
CREATE OR REPLACE FUNCTION GET_ROWCNT(L_USER_SEQ NUMBER, L_USER_NAME VARCHAR2) RETURN NUMBER
AS
    PRAGMA AUTONOMOUS_TRANSACTION;
    L_CNT NUMBER;
BEGIN
    --DBMS_OUTPUT.PUT_LINE('SEQ_NEXTVAL.L_GUBUN==>'||L_GUBUN);
    --
    UPDATE  TBL_USER
    SET USER_NAME = L_USER_NAME
    WHERE   USER_SEQ  = L_USER_SEQ;

    --
    L_CNT := SQL%ROWCOUNT;

    COMMIT;
    RETURN L_CNT;
END;



/*
 * 함수 확인
 */
SELECT GET_ROWCNT(1, '박문수') FROM DUAL

by 마농 [2010.07.19 08:40:32]
Select절에서 함수를 사용하신다면 함수내 업데이트는 안될거에요.
Select절에서 호출하지 마시고 함수를 그냥 실행하세요.
http://www.gurubee.net/lecture/1042

by 꼬랑지 [2010.07.19 10:00:30]
맞게 하신거 같은데요? 함수내에서 DML문을 사용할 경우 ORA-14551 에러가 발생하며 이를 피하기 위해선 PRAGMA AUTONOMOUS_TRANSACTION; 옵션으로 자율 트랜잭션을 부여해야 한다고 하네요.

by madcat [2010.07.19 10:39:57]
단지 ORA-14551에러를 피하기 위해서 AUTONOMOUS_TRANSACTION Pragma를 사용하는 것은 권장할 만한 방법은 아니라고 생각합니다. 트랜잭션이 분리되어도 괜찮은 건지 고려해봐야 할 것이고, 또한 쿼리 내에서 호출 되었을 때 원치 않는 결과가 나올 가능성이 높다고 봅니다.

by 마농 [2010.07.19 11:25:25]
저도 같은 생각입니다.
Select 안에서 Dml을 수행한다는 것 자체가 잘못이라 생각됩니다.
위의 예문은 dual을 통한 Select문이므로 별 문제는 없어보이고
또한 dual을 이용한 Select로 하지 않더라도 바로 호출하도록 변경도 가능합니다.
하지만 위 함수가 함수에 사용된 테이블을 대상으로 한 Select문장에 사용된다면?
어떤 엄청난 결과를 초래하게 될지 알수가 없죠.
그래서 미리부터 사용하지 못하도록 막아놓은 것입니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입