오라클 함수(Function)에서는 기본적으로 DML(Insert/update/delete)문을 사용할 수 없습니다.
하지만, 기본적으로 그렇다는 것이지 사용할 방법이 없다는 건 아니랍니다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | CREATE OR REPLACE FUNCTION ZBF_GET_BARNUM ( p_bartyp in NUMBER, p_bardat in varchar2, p_gubun in varchar2 -- CUR/NEW ) RETURN VARCHAR IS v_returnValue VARCHAR2(60); v_curnum NUMBER(10); v_cnt NUMBER(1); /******************************************************************************/ pragma autonomous_transaction; BEGIN BEGIN SELECT NVL((SELECT CURNUM FROM YBARN WHERE BARTYP = p_bartyp AND BARDAT = p_bardat), 0) INTO v_curnum FROM DUAL ; -- p_bartyp의 값에 따라 자릿수가 바뀐다. IF p_bartyp = 1 OR p_bartyp = 3 OR p_bartyp = 4 THEN v_cnt := 3; ELSE v_cnt := 4; END IF; -- NEW일 경우, 현재 번호에 +1을 하고, YBARN에 insert한다. IF p_gubun = 'NEW' THEN v_curnum := v_curnum + 1; INSERT INTO YBARN( BARDAT, BARTYP, CURNUM ) VALUES( p_bardat, p_bartyp, v_curnum ); COMMIT; END IF; -- 자릿수만큼 0으로 값을 채운다. v_returnValue := LPAD(v_curnum, v_cnt, '0'); EXCEPTION WHEN NO_DATA_FOUND THEN v_returnValue := ' '; WHEN OTHERS THEN v_returnValue := ' '; END; RETURN v_returnValue; END; / | cs |
BEGIN 위쪽에 'pragma autonomous_transaction;'이라고 한줄 넣어주면 됩니다.
pragma autonomous_transaction;
-- 자율 트랜잭션
-- 부모 트랜잭션의 승인/롤백 여부에 상관없이 자신의 작업을 승인하거나 롤백할 수 있다.
'프로그래밍 언어 > 쿼리문 + Oracle + MySQL' 카테고리의 다른 글
[Oracle] 오라클 락(lock) 걸렸을 때 사용할 유용한 쿼리들 (0) | 2017.06.08 |
---|---|
[Oracle] 날마다 시퀀스가 초기화되는 오라클 날짜 시퀀스(Sequence) 만들기 (0) | 2017.05.30 |
[Oracle] 오라클 export 배치 스크립트 만들어 윈도우 스케쥴러에 등록하여 자동 백업하고 삭제하는 방법 (0) | 2017.05.25 |
[ErWin] Subject Area(주제영역) 만들기 (0) | 2017.05.22 |
[ERWin] Reverse Engineer 기능으로 오라클(Oracle)에 연결해서 자동으로 ERD 생성하기 (2) | 2017.05.22 |
댓글