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

오라클(Oracle) CLOB 데이터형식 저장(Insert/Update) 프로시저 샘플

by 우림 2017. 10. 17.

CLOB은 저장하는 방식이 달라서 insert/update 할 때 좀 쿼리가 복잡합니다.


기본적으로...insert할 때,
Clob인 컬럼은 빈값(empty_clob)을 넣은 후에 다시 업데이트하는 형식으로 쿼리를 작성해야 하기 때문에 번거롭죠.


그래서, 저는 Clob이 들어간 테이블에 insert/update 할 때는
Insert/Update 프로시저를 만들어서 사용합니다.

아래는 Insert 프로시저 예제입니다.


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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
CREATE OR REPLACE PROCEDURE P_YSAPH_INSERT
(
    p_SAPSEQ        IN NUMBER,
    p_WAREKY        IN VARCHAR2,
    p_SAPPROCESS    IN VARCHAR2,
    p_DOCCAT        IN VARCHAR2,
    p_DOCUTY        IN VARCHAR2,
    p_KEYCOL        IN VARCHAR2,
    p_KEY1          IN VARCHAR2,
    p_KEY2s_CLOB    IN CLOB,
    p_USERID        IN VARCHAR2
)
AS 
 
    V_CLOB_SELECTED CLOB;
    V_CLOB_LENGTH   NUMBER;
    V_BUFFER CLOB;
 
    V_AMOUNT BINARY_INTEGER := 1024;
    V_POS    PLS_INTEGER := 1;
 
BEGIN
 
 
    -- YSAPH 테이블에 저장
    INSERT INTO YSAPH
    (
        sapseq,
        wareky,
        sapprocess,
        doccat,
        docuty,
        docnm,
        keycol,
        key1,
        key2s,
        successyn,
        credat,
        cretim,
        creusr
    )
    VALUES
    (
          p_SAPSEQ
        , nvl(p_WAREKY, ' ')
        , nvl(p_SAPPROCESS, ' ')
        , nvl(p_DOCCAT, ' ')
        , nvl(p_DOCUTY, ' ')
        , zbf_get_doc('NAME', p_DOCCAT, p_DOCUTY)
        , nvl(p_KEYCOL, ' ')
        , nvl(p_KEY1, ' ')
        , empty_clob()
        , 'Y'
        , TO_CHAR(SYSDATE, 'YYYYMMDD')
        , TO_CHAR(SYSDATE, 'HH24MISS')
        , p_USERID
    )
    RETURNING key2s INTO V_CLOB_SELECTED
    ;
 
 
    -- CLOB 삽입
    IF p_KEY2s_CLOB IS NOT NULL THEN
        V_CLOB_LENGTH := DBMS_LOB.GETLENGTH(p_KEY2s_CLOB);
 
        -- 대용량 CLOB 데이터를 쪼개어 입력한다.
        WHILE (V_POS < V_CLOB_LENGTH) LOOP
            DBMS_LOB.READ(p_KEY2s_CLOB, V_AMOUNT, V_POS, V_BUFFER);
            IF V_BUFFER IS NOT NULL THEN
                DBMS_LOB.WRITEAPPEND(V_CLOB_SELECTED, LENGTH(V_BUFFER), V_BUFFER);
            END IF;
            V_POS := V_POS + V_AMOUNT;
        END LOOP;
 
    END IF;
    
 
    COMMIT;
 
END;
cs


위 예제 샘플에서 YSAPH 테이블의 key2s 컬럼이 Clob으로 돼 있습니다.

위 소스에서 녹색으로 된 부분을 잘 보시고 각자 필요에 맞게 수정해서 사용하시면 됩니다.

댓글