본문 바로가기
프로그래밍 언어/쿼리문 + Oracle + MySQL

[Oracle] 오라클 함수(Function)에서 DML(Insert/update/delete)문 사용하기

by 우림 2017. 5. 26.

오라클 함수(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), 0INTO 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;

-- 자율 트랜잭션
-- 부모 트랜잭션의 승인/롤백 여부에 상관없이 자신의 작업을 승인하거나 롤백할 수 있다.

댓글