검색어(특정문자열)가 저장되어 있는 테이블, 컬럼 찾기 4 7 7,281

by 마농 [2013.11.28 15:55:02]


-- 문자타입 컬럼중 검색어(특정문자열)가 저장되어 있는 테이블, 컬럼 찾기 --
SELECT tname, cname
  FROM col
 WHERE coltype LIKE '%CHAR%'
   AND TO_NUMBER(
       dbms_xmlgen.getxmltype(
       'SELECT 1 FROM '||tname||' WHERE '||cname||' LIKE ''%검색어%'' AND ROWNUM = 1'
       ).Extract('//text()')
       ) = 1
;
-- 단, 대용량 테이블에 바로 적용시 시스템이 뻗을 수도 있습니다.
by 통토리 [2013.11.28 16:24:00]
오류나오는데 어떻게해야되요?
ora-19202 error occurred in XML processing
ora-00932 inconsistent datatypes: expected NUMBER got LONG BINARY
ora-06512 at "SYS.DBMS_XMLGEN",line 288
ora-06512 at line 1

View program sources of error stack?

pl/sql 사용중입니다

by 농부지기 [2014.04.17 14:02:45]

저도 위 통토리님과 같은 오류가 나네요.


by 박민철 [2014.08.21 10:39:06]

저도 통토리님과 같은 오류가 납니다.

ORA-19202: XML 처리
ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다
 중 오류가 발생했습니다.
ORA-06512: "SYS.DBMS_XMLGEN",  288행
ORA-06512:  1행


by 마농 [2014.08.21 11:18:05]

Drop 된 테이블의 흔적이 남아 있어서 발생되는 에러인듯 합니다.

PURGE RECYCLEBIN; 명령으로 휴지통을 비워주시던가?

AND tname NOT LIKE 'BIN$%' 조건을 추가하여 제외시키시면 될 듯 합니다.


by 박민철 [2014.08.28 10:15:38]

마농님! 감사합니다. ^^

재 문의 드려요~

알려주신데로 실행하니... 다시 오류가 납니다.^^

 

PURGE RECYCLEBIN;      실행 했구요~~~~

 

-- 문자타입 컬럼중 검색어(특정문자열)가 저장되어 있는 테이블, 컬럼 찾기 --
SELECT tname, cname
  FROM col
 WHERE coltype LIKE '%CHAR%'   -- CHAR 타입 관련만 하도록 했는데~
   AND tname NOT LIKE 'BIN$%'    -- 요부분 추가
   AND TO_NUMBER(
       dbms_xmlgen.getxmltype(
       'SELECT 1 FROM '||tname||' WHERE '||cname||' LIKE ''%검색어%'' AND ROWNUM = 1'
       ).Extract('//text()')
       ) = 1
;

-- 오류결과

ORA-19202: XML 처리
ORA-00932: 일관성 없는 데이터 유형: NUMBER이(가) 필요하지만 BLOB임 중 오류가 발생했습니다.
ORA-06512: "SYS.DBMS_XMLGEN",  288행
ORA-06512:  1행

 

BLOB TYPE이 있으면 오류가 나는 걸까요??

 


by 마농 [2014.08.28 10:39:28]
WITH t AS
(
SELECT /*+ materialize */
       tname, cname
  FROM col
 WHERE tname NOT LIKE 'BIN$%'
   AND coltype LIKE '%CHAR%'
)
SELECT tname, cname
  FROM t
 WHERE TO_NUMBER(
       dbms_xmlgen.getxmltype(
       'SELECT 1 FROM "'||tname||'" WHERE "'||cname||'" LIKE ''%검색어%'' AND ROWNUM = 1'
       ).Extract('//text()')
       ) = 1
;

1. 우선 char 만 걸러서 처리하고자 했으나...
  - 조건절의 처리순서가 꼭 그렇게만 된다고 보장할 수 없네요.
  - WHERE tname NOT LIKE 'BIN$%' AND coltype LIKE '%CHAR%'
  - 이 조건들이 우선 처리되도록 /*+ materialize */ 힌트를 이용하면 됩니다.
2. 테이블명이 대문자만 있으리란 법은 없을 듯...
  - 테이블명과 컬럼명을 따옴표로 감싸도록 수정

 


by jkson [2017.02.06 19:01:27]

ordered_predicates 힌트를 통해 조건절 처리순서 제어가 가능하다고 합니다.

SELECT /*+ordered_predicates*/ TNAME, CNAME
  FROM COL
 WHERE TNAME NOT LIKE 'BIN$%'
   AND COLTYPE LIKE '%CHAR%'
   AND TO_NUMBER(
       DBMS_XMLGEN.GETXMLTYPE(
       'SELECT 1 FROM '||TNAME||' WHERE '||CNAME||' LIKE ''%검색어%'' AND ROWNUM = 1'
       ).EXTRACT('//text()')
       ) = 1

 

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