쿼리이력의 결과를 뽑아오고 바인드값을 가져와서 REPLACE처리하고 싶은데요 2 4 675

by 메로나 [2021.03.05 17:52:34]


어떤 쿼리문자열을 조회하는 쿼리가 있습니다.
    
쿼리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를 합쳐서 어떻게 처리할 방법이 있을까요?

by 마농 [2021.03.08 16:17:12]
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
;

 


by 동동동 [2021.03.08 17:33:51]

마농님 항상 배우고 갑니다..

 

해당 쿼리의 내용이 한줄로 표시되고, 4000 이상은 표시가 안되는것 같은데요..

줄바꿈등 원래 쿼리의 내용으로는 표시가 안되는 건가요?

 


by 마농 [2021.03.08 17:48:09]
-- 변경전 : 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
;

 


by 동동동 [2021.03.09 08:53:24]

마농님 감사합니다...

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입