어떤 쿼리문자열을 조회하는 쿼리가 있습니다.
쿼리1: SELECT sqltext FROM ~~~~ WHERE ~~~~;
조회되는 쿼리의 결과값이 문자열이
SELECT a, b, c FROM TBL WHERE id = :B2 AND size = :B3 AND product = :B2 .....
이런 값이 조회가 되구요
BIND_CAPTURE 를 조회해서 나오는 값은
쿼리2: SELECT ~~~ FROM V$SQL_BIND_CAPTURE
결과 값은 행으로
name position datatype_string value_string
:B3 1 VARHCHAR2(32) 325
:B2 2 VARHCHAR2(32) DB5C8980-F02LVR
:B1 3 VARHCHAR2(32) NULL
이렇게 나오는데요
쿼리1로 조회한 쿼리값과 쿼리2로 조회한 파라미터 값을 가지고
맞는 name에 대해서 쿼리1의 결과값에 REPLACE처리를 해버리고 싶은데요
저 두 쿼리1과 쿼리2를 합쳐서 어떻게 처리할 방법이 있을까요?
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 | WITH t1 AS ( SELECT a.sql_id , a.sql_text , a.sql_text sql , b.position pos , b. name nam , b.value_string val , CASE WHEN value_anydata IS NULL THEN 'NULL' ELSE '' '' ||b.value_string|| '' '' END || '\2' v , COUNT (*) OVER(PARTITION BY a.sql_id) cnt FROM v$sql a , v$sql_bind_capture b WHERE a.sql_id = b.sql_id AND a.sql_id = '6b704mwwjmngt' ) , t2 (sql_id, sql_text, sql, pos, cnt) AS ( SELECT sql_id , sql_text , REGEXP_REPLACE(sql, '(' || nam || ')([^_A-Z0-9]|$)' , v, 1, 0, 'i' ) sql , pos , cnt FROM t1 WHERE pos = 1 UNION ALL SELECT c.sql_id , c.sql_text , REGEXP_REPLACE(p.sql, '(' || c.nam || ')([^_A-Z0-9]|$)' , c.v, 1, 0, 'i' ) sql , c.pos , c.cnt FROM t2 p , t1 c WHERE p.sql_id = c.sql_id AND c.pos = p.pos + 1 ) SELECT * FROM t2 WHERE pos = cnt ; |
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 | -- 변경전 : sql_text VARCHAR2(1000) -- 변경후 : sql_fulltext CLOB WITH t1 AS ( SELECT a.sql_id , a.sql_fulltext , a.sql_fulltext sql , b.position pos , b. name nam , b.value_string val , '(' || b. name || ')([^_A-Z0-9]|$)' v1 , CASE WHEN value_anydata IS NULL THEN 'NULL' ELSE '' '' ||b.value_string|| '' '' END || '\2' v2 , COUNT (*) OVER(PARTITION BY a.sql_id) cnt FROM v$sql a , v$sql_bind_capture b WHERE a.sql_id = b.sql_id AND a.sql_id = '3u5xus0wmg7zm' ) , t2 (sql_id, sql_fulltext, sql, pos, cnt) AS ( SELECT sql_id , sql_fulltext , REGEXP_REPLACE(sql, v1, v2, 1, 0, 'i' ) sql , pos , cnt FROM t1 WHERE pos = 1 UNION ALL SELECT c.sql_id , c.sql_fulltext , REGEXP_REPLACE(p.sql, c.v1, c.v2, 1, 0, 'i' ) sql , c.pos , c.cnt FROM t2 p , t1 c WHERE p.sql_id = c.sql_id AND c.pos = p.pos + 1 ) SELECT * FROM t2 WHERE pos = cnt ; |