2009-04-20 1 views
10

HTML을 Long 데이터 형식으로 저장하는 Oracle 데이터베이스로 작업하고 있습니다. Long에 저장된 HTML 데이터 내에서 특정 문자열을 검색하도록 데이터베이스를 쿼리하고 싶습니다.Oracle 데이터베이스 내에서 Long 데이터 유형을 검색하는 가장 좋은 방법은 무엇입니까?

나는 '% form %'와 (과) 같은 COLUMN TABLE에서 select *를 시도했다. "like"는 Long 데이터 유형에 지원되지 않으므로 이로 인해 다음 Oracle 오류가 발생합니다.

ORA-00932 : 일관성없는 데이터 유형 : 예상 번호는 직접 갈망을 검색 할 수 없습니다

답변

9

LONG 얻었다. LONG은 WHERE 절에 나타날 수 없습니다. SELECT 목록에 나타날 수 있으므로 조사해야 할 행 수를 줄이기 위해 사용할 수 있습니다.

오라클은 적어도 지난 2 릴리스에서 LONG을 CLOB로 변환 할 것을 권장합니다. CLOB에 대한 제한이 적습니다.

+9

아직, ALL_TRIGGERS 긴로서 TRIGGER_BODY를 도시에 설명한다. 추천하고 직접하지 않습니까? 홀수 ... – xQbert

+0

DBA_IND_EXPRESSIONS와 동일합니다. 설명하면 COLUMN_EXPRESSION은 여전히 ​​11GR2에서 긴 유형입니다. – pahariayogi

+0

오라클이 사전 LONG 컬럼을 고쳤 으면 좋지만 데이터 딕셔너리의 크기와 복잡성을 감안할 때 모든 LONG을 CLOB로 업그레이드하는 것은 업그레이드 중에 손상을 초래할 수있는 거대한 운동이 될 것이라고 생각합니다. 오라클은 지금까지 떠나기로했습니다. 그것만으로. –

0

LONG을 사용하지 말고 대신 CLOB를 사용하십시오. VARCHAR2와 같은 CLOB를 색인화하고 검색 할 수 있습니다.

또한 와일드 카드 (%)를 사용하여 쿼리하면 항상 전체 테이블 스캔이됩니다. 대신 Oracle Text indexes을 조사하십시오.

7

예 :

create table longtable(id number,text long); 

insert into longtable values(1,'hello world'); 
insert into longtable values(2,'say hello!'); 

commit; 

create or replace function search_long(r rowid) return varchar2 is 
temporary_varchar varchar2(4000); 
begin 
select text into temporary_varchar from longtable where rowid=r; 
return temporary_varchar; 
end; 
/


SQL> select text from longtable where search_long(rowid) like '%hello%';                    

TEXT 
-------------------------------------------------------------------------------- 
hello world 
say hello! 

하지만 조심해야 해. PL/SQL 함수는 LONG의 처음 32K 만 검색합니다.

+0

일치하는 행을 삭제하려면 다음 답변을 참조하십시오. http://stackoverflow.com/questions/2381203/oracle-delete-where-long-like/2381600#2381600 – Sam

+0

https://forums.oracle.com /forums/thread.jspa?threadID=413669#1418208 –

+0

rowid = r은 무엇을 의미합니까? 여기서 "longtable에서 temporary_varchar로 텍스트 선택 where rowid = r;" – Yashu

0

가장 좋은 방법은 긴 열이 더 이상 사용되지 않으므로 clob로 변환하는 것입니다. 또는 해당 데이터를 읽으려면 pl/sql 블록을 작성하십시오. 명확한 설명은 아래 링크를 참조하십시오.

참고 : http://www.oraclebin.com/2012/12/using-long-data-type-in-where-clause-in.html

+1

스택 오버플로에 오신 것을 환영합니다! 여기에는 두 가지 이유로 귀하의 웹 사이트/제품에 대한 베어 링크가 권장되지 않습니다. 첫째, 답변은 외부 사이트에 대한 단순한 링크가 아닌 자체 포함 답변으로 게시해야합니다. 둘째, 자기 홍보는 여기에서 눈살을 찌푸리게되는 경향이 있으며, 종종 스팸으로 신고됩니다 (특히 자신의 사이트/제품에 연결한다는 공개가없는 경우). –

9

당신은 임시 테이블을 사용하지 않고이 예제를 사용할 수 있습니다

LONG 이상 32 개 K 문자가있는 경우에 문제가있는 것입니다 물론
DECLARE 

    l_var VARCHAR2(32767); -- max length 

BEGIN 

FOR rec IN (SELECT ID, LONG_COLUMN FROM TABLE_WITH_LONG_COLUMN) LOOP 
    l_var := rec.LONG_COLUMN; 
    IF l_var LIKE '%350%' THEN -- is there '350' string? 
    dbms_output.put_line('ID:' || rec.ID || ' COLUMN:' || rec.LONG_COLUMN); 
    END IF; 
END LOOP; 

END; 

.

1

첫째는, 예를 들면, LIKE 조건을 사용 CLOB 유형 LONG 유형 열 변환 :

CREATE TABLE tbl_clob AS 
    SELECT to_lob(long_col) lob_col FROM tbl_long; 

SELECT * FROM tbl_clob WHERE lob_col LIKE '%form%';