어떤 쿼리문자열을 조회하는 쿼리가 있습니다.
쿼리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를 합쳐서 어떻게 처리할 방법이 있을까요?
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
;
마농님 항상 배우고 갑니다..
해당 쿼리의 내용이 한줄로 표시되고, 4000 이상은 표시가 안되는것 같은데요..
줄바꿈등 원래 쿼리의 내용으로는 표시가 안되는 건가요?
-- 변경전 : 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
;
마농님 감사합니다...