clob 타입으로 동적쿼리 실행시킬수 있는방법이 있을까요? 0 0 3,976

by 분석함수 [2012.06.07 15:31:56]


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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
밑에 작성한 프로시저는 늘어나는 동적쿼리를 테스트 해보기위한 프로시저입니다.
장문의 sql문을 clob 에 담아
4000바이트씩 잘라서 varchar배열에 넣은후에
배열을 합쳐서 커서 오픈 했는데요
이경우에 배열을 합쳤을때 용량이 65535 바이트를 넘기면
커서오픈이 실행되지 않습니다.
clob 는 65535 이상으로 더 들어갈 수 있는데 말이죠
65535가 최대라고 한다면
바로 clob 으로 오픈할수 있는 방법이 있을까요?
 
PROCEDURE PC_SELECT1(
    vi_CorpCd   In VarChar2,
    vo_RefCur   OUT RefCur,
    vo_IsError   OUT VARCHAR2,
    vo_Msg    OUT VARCHAR2
    )
 IS
  
 WRITE_CLOB CLOB;
 WRITE_STATEMENT VARCHAR2(4000);
 vm_Clob CLOB;
 AMOUNT BINARY_INTEGER;
  
 vm_Sql VARCHAR2(4000);
  
 vm_Cnt number;
 vm_i number;
 TYPE VAR_ARR IS TABLE OF varchar2(4000) INDEX BY VARCHAR2(4000);
 
 
 vm_arr VAR_ARR;
  
 READ_CLOB CLOB;
 CHARS_READ BINARY_INTEGER;
 OFFSET NUMBER DEFAULT 1;
  
 BEGIN
  
 DELETE FROM LOB_TAB;
  
 INSERT INTO LOB_TAB(ID,CHAR_LOB) VALUES(1,EMPTY_CLOB());
  
 --쓰기시작
  
 SELECT CHAR_LOB INTO WRITE_CLOB
  FROM LOB_TAB
  WHERE ID = 1;
  
 DBMS_LOB.OPEN(WRITE_CLOB,DBMS_LOB.LOB_READWRITE);
  
  
 WRITE_STATEMENT := 'SELECT ';
  
 AMOUNT := LENGTH(WRITE_STATEMENT);
 DBMS_LOB.WRITE(WRITE_CLOB,AMOUNT,OFFSET,WRITE_STATEMENT);
  
 FOR BASE IN
   (
   SELECT GDS_NO
    FROM NT017
    WHERE GDS_NO BETWEEN '10000' AND '14453' --이부분에서 용량을 조절했습니다.
   )
  LOOP
  
 WRITE_STATEMENT := BASE.GDS_NO||' AS "'||BASE.GDS_NO||'" ,';
 AMOUNT := LENGTH(WRITE_STATEMENT);
 DBMS_LOB.WRITEAPPEND(WRITE_CLOB,AMOUNT,WRITE_STATEMENT);
  
  
 END LOOP;
  
 WRITE_STATEMENT := ' ''1'' as aaa FROM NT017 WHERE GDS_NO BETWEEN ''10000'' AND ''10010''';
 AMOUNT := LENGTH(WRITE_STATEMENT);
 DBMS_LOB.WRITEAPPEND(WRITE_CLOB,AMOUNT,WRITE_STATEMENT);
  
 DBMS_LOB.CLOSE(WRITE_CLOB);
 --쓰기끝
  
 --읽기--
 CHARS_READ:=4000;
  
 vm_i := 0;
 while (vm_i<30)loop
   
 vm_i := vm_i + 1;
 vm_arr(vm_i) := ' ';
  
 end loop;
 
 select ceil(length(char_lob)/4000) into vm_Cnt
  from lob_tab
  WHERE ID = 1;
  
 SELECT CHAR_LOB INTO READ_CLOB
  FROM LOB_TAB
  WHERE ID = 1;
 
 vm_i := 0;
 while (vm_Cnt >0)loop
  
 DBMS_LOB.READ(READ_CLOB,CHARS_READ,OFFSET+vm_i*4000,vm_Sql);
 vm_arr(vm_i) := vm_Sql;
  
 vm_i := vm_i + 1;
 vm_Cnt:=vm_Cnt-1;
  
 end loop;
   
  
  
-- vm_arr(0) := 'select * from pt015 union all ';
-- vm_arr(1) := 'select * from pt015';
-- OPEN vo_RefCur FOR vm_arr(0)||
--      vm_arr(1);
  
-- vm_Sql := vm_Sql||' ''1'' as aaa FROM NT017 WHERE GDS_NO BETWEEN ''10000'' AND ''10010''';
-- raise_application_error(-20001,vm_arr(18));
 OPEN vo_RefCur FOR vm_arr(0)||
      vm_arr(1)||
      vm_arr(2)||
      vm_arr(3)||
      vm_arr(4)||
      vm_arr(5)||
      vm_arr(6)||
      vm_arr(7)||
      vm_arr(8)||
      vm_arr(9)||
      vm_arr(10)||
      vm_arr(11)||
      vm_arr(12)||
      vm_arr(13)||
      vm_arr(14)||
      vm_arr(15)||
      vm_arr(16)||
      vm_arr(17)||
      vm_arr(18)||
    
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입