2009-04-20 24 views
10

HTML'yi bir Uzun veri türü olarak depolayan bir Oracle veritabanıyla çalışıyorum. Veritabanını, Long'da depolanan HTML verileri içinde belirli bir dizeyi aramak için sorgulamak istiyorum.Uzun veri türünü bir Oracle veritabanında araştırmanın en iyi yolu nedir?

Denemeyi denedim, "COLUMN '% form%' gibi bir yerde TABLE 'den * seçin. Bu, "Oracle" uzun veri türleri için desteklenmediğinden, aşağıdaki Oracle hatasına neden olur.

ORA-00932: tutarsız veri türleri: beklenen SAYISI doğrudan Longs arama yapamazsınız

cevap

9

UZUN var. LONG'lar WHERE maddesinde görünemez. Bununla birlikte, SELECT listesinde görünebilir, böylece bunu incelemek zorunda olduğunuz satır sayısını daraltmak için kullanabilirsiniz.

Oracle, en az son 2 sürümleri için LONG'leri CLOB'lere dönüştürmenizi tavsiye ederiz. CLOB'larda daha az kısıtlama var.

+9

Yine, ALL_TRIGGERS uzun olarak TRIGGER_BODY gösteren bir açıklar. Tavsiye et ve sonra kendin yapma garip ... – xQbert

+0

DBA_IND_EXPRESSIONS ile aynı. Bunu açıklarsanız, COLUMN_EXPRESSION hala 11GR2 uzun bir türüdür. – pahariayogi

+0

Oracle'ın sözlükleri LONG sütunlarını da düzeltmesini isterdim, ancak veri sözlüğünün büyüklüğü ve karmaşıklığı göz önüne alındığında, CLONG'a tüm LONG'ların yükseltilmesinin yükseltmeler sırasında yolsuzluk riskine yol açacak büyük bir egzersiz olacağından şüpheleniyorum ve Oracle şu ana kadar ayrılmaya karar verdi Yalnız. –

0

UZUNLAR kullanmayın, bunun yerine CLOB'u kullanın. VARCHAR2 gibi CLOB'leri dizine ekleyebilir ve arayabilirsiniz. Ayrıca, önde gelen bir joker karakterle sorgulama (%), DAİMA tam tablo taramasıyla sonuçlanacaktır. Bunun yerine Oracle Text indexes'a bakın.

7

Örnek:

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! 

Ancak dikkatli olun. Bir PL/SQL işlevi sadece ilk UON'un 32K'sını arar.

+0

Eşleşen satırları silmek isterseniz, bu cevaba bakın: 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'nin anlamı nedir? Yani burada "longid'den rowid = r; – Yashu

0

Uzun yol kullanımdan kaldırıldıkça, uzun sütununuzu clob'a dönüştürmenin en iyi yolu. Veya bu verileri okumak için bir pl/sql bloğu yazın. Net açıklama için aşağıya bakın.

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

+1

Yığın Taşmasına Hoş Geldiniz! Kendi web sitenize/ürününüze ait çıplak bağlantıların burada iki nedenden dolayı teşvik edilmediğini lütfen unutmayın; Birincisi, bir cevap, harici bir sitenin sadece bir bağlantısı değil, bağımsız bir cevap olarak gönderilmelidir. İkincisi, kendi kendini tanıtmak, burada kaşınmaya eğilimlidir ve çoğu zaman spam olarak işaretlenir (özellikle kendi sitenize/ürününüze bağlandığınızı açıklamıyorsa). –

9

Sen geçici tablo kullanmadan bu örneği kullanabilirsiniz:

UZUN fazla 32K karakterler varsa bir sorun olduğunda Tabii
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

İlk önce, örneğin, LIKE koşulunu kullanmak CLOB türüne LONG tipi bir sütun:

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

SELECT * FROM tbl_clob WHERE lob_col LIKE '%form%'; 
İlgili konular