2013-07-15 21 views
13

Belirli bir dize bir clob sütundan nasıl alınır? product_detailsOracle clob sütununda belirli bir dizgeyi ara

CALCULATION=[N]NEW.PRODUCT_NO=[T9856] 
OLD.PRODUCT_NO=[T9852].... -- with other text 

denilen clob sütunda depolandığı aşağıdaki gibi

ben sütundan dize NEW.PRODUCT_NO aramak istiyorum verilere sahip product_details

ben

select * from my_table 
where dbms_lob.instr(product_details,'NEW.PRODUCT_NO')>=1 

olarak çalıştık

Yukarıdaki tablodan tam metni getiriyor.

Her türlü yardım büyük önem taşır.

Selamlar

+0

çıktıda istediğiniz dize başlangıç ​​konumunu bulmak için instr bağıntılı olarak bir substr kullanabilir sadece bir alt dize (bir çizgi) "CALCULATION = [N] NEW.PRODUCT_NO = [T9856]" gibi ürün detaylarının "? –

+0

@FlorinGhita Evet Sadece dize 'NEW.PRODUCT_NO =' clob sütunundan çıktı olarak istiyorum. – user75ponic

cevap

13

Düzenli InStr ve SubstStr işlevleri gibi, dbms_lob.instr ve dbms_lob.substr'u kullanın. Basit bir örneği
Görünüş:

SQL> create table t_clob(
    2 id number, 
    3 cl clob 
    4 ); 

Tabela zosta│a utworzona. 

SQL> insert into t_clob values (1, ' xxxx abcd xyz qwerty 354657 [] '); 

1 wiersz zosta│ utworzony. 

SQL> declare 
    2 i number; 
    3 begin 
    4 for i in 1..400 loop 
    5  update t_clob set cl = cl || ' xxxx abcd xyz qwerty 354657 [] '; 
    6 end loop; 
    7 update t_clob set cl = cl || ' CALCULATION=[N]NEW.PRODUCT_NO=[T9856] OLD.PRODUCT_NO=[T9852].... -- with other text '; 
    8 for i in 1..400 loop 
    9  update t_clob set cl = cl || ' xxxx abcd xyz qwerty 354657 [] '; 
10 end loop; 
11 end; 
12/

Procedura PL/SQL zosta│a zako˝czona pomyťlnie. 

SQL> commit; 

Zatwierdzanie zosta│o uko˝czone. 
SQL> select length(cl) from t_clob; 

LENGTH(CL) 
---------- 
    25717 

SQL> select dbms_lob.instr(cl, 'NEW.PRODUCT_NO=[') from t_clob; 

DBMS_LOB.INSTR(CL,'NEW.PRODUCT_NO=[') 
------------------------------------- 
           12849 

SQL> select dbms_lob.substr(cl, 5,dbms_lob.instr(cl, 'NEW.PRODUCT_NO=[') + length('NEW.PRODUCT_NO=[')) new_product 
    2 from t_clob; 

NEW_PRODUCT 
-------------------------------------------------------------------------------- 
T9856 
-10

Ben bunu doğru

select * from my_table where product_details = 'NEW.PRODUCT_NO' 

var ise o zaman dizesini içerir istediğin dize:

SELECT * FROM MY_TABLE WHERE product_details = '%NEW.PRODUCT_NO%'; 

Ps. Bu kod Oracle SQL'de test edilmedi.

+1

Alker product_details bir clob sütunu, doğrudan sql arama işe yaramazdı ve bu nedenle 'dbms_lob' işlevini kullanmak zorundayız – user75ponic

+0

Substr denediniz mi? – Alker

12

Tamam, sen

select 
    dbms_lob.substr(
     product_details, 
     length('NEW.PRODUCT_NO'), --amount 
     dbms_lob.instr(product_details,'NEW.PRODUCT_NO') --offset 
     ) 
from my_table 
where dbms_lob.instr(product_details,'NEW.PRODUCT_NO')>=1;