2009-04-20 10 views
10

Estoy trabajando con una base de datos Oracle que almacena HTML como un tipo de datos Long. Me gustaría consultar la base de datos para buscar una cadena específica dentro de los datos HTML almacenados en Long.¿Cuál es la mejor forma de buscar el tipo de datos Long dentro de una base de datos Oracle?

Intenté, "seleccionar * de TABLE donde COLUMN me gusta '% form%'". Esto provoca el siguiente error de Oracle porque "me gusta" no es compatible con los tipos de datos Long.

ORA-00932: tipos de datos inconsistentes: número esperado queda mucho tiempo

Respuesta

9

No puede buscar directamente LONG. LONGs no pueden aparecer en la cláusula WHERE. Sin embargo, pueden aparecer en la lista SELECCIONAR para que pueda usar eso para reducir el número de filas que debería examinar.

Oracle ha recomendado convertir LONGs a CLOB para al menos las últimas 2 versiones. Hay menos restricciones en los CLOB.

+9

Sin embargo, un describir en ALL_TRIGGERS muestra el Cuerpo_Del_Trigger como una larga. Recomendar y luego no hacerlo por sí mismos? impar ... – xQbert

+0

Lo mismo con DBA_IND_EXPRESSIONS. Si lo describes, COLUMN_EXPRESSION sigue siendo un tipo largo en 11GR2. – pahariayogi

+0

Ojalá Oracle también arregle las columnas LONG del diccionario, pero dado el tamaño y la complejidad del diccionario de datos, sospecho que actualizar todas las LONGs a CLOB sería un gran ejercicio que correría el riesgo de corrupción durante las actualizaciones, por lo que Oracle decidió abandonar solo –

0

No utilice LONGs, use CLOB en su lugar. Puede indexar y buscar CLOB como VARCHAR2.

Además, consultar con un comodín principal (%) SIEMPRE dará como resultado una exploración de tabla completa. Mire en Oracle Text indexes en su lugar.

7

Ejemplo:

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! 

Pero tenga cuidado. Una función PL/SQL solo buscará los primeros 32K de LONG.

+0

Si desea eliminar las filas correspondientes, consulte esta respuesta: 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

qué significa rowid = r. Quiero decir aquí "seleccionar texto en temporary_varchar from longtable donde rowid = r;" – Yashu

0

La mejor manera es convertir su columna larga en clob mientras se desaprueba. O escribe un bloque pl/sql para leer esos datos. Vea el enlace a continuación para una explicación clara.

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

+1

¡Bienvenido a Stack Overflow! Tenga en cuenta que los enlaces desnudos a su propio sitio web/producto no son alentados aquí por dos razones; En primer lugar, una respuesta debe publicarse como una respuesta independiente, no como un simple enlace a un sitio externo. En segundo lugar, la autopromoción tiende a ser mal vista aquí, y a menudo se señala como correo no deseado (especialmente si no hay información que indique que está enlazando a su propio sitio/producto). –

9

Puede utilizar este ejemplo sin usar tabla temporal:

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; 

Por supuesto no es un problema si LARGO tiene más de 32 K caracteres.

1

primer convertido columna LONG tipo de CLOB tipo a continuación, utilizar LIKE condición, por ejemplo:

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

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