2013-07-15 12 views
13

Come ottenere una stringa particolare da una colonna di clob?Cerca una stringa particolare nella colonna Oracle clob

Ho dati, come di seguito che è memorizzato nella colonna clob chiamato product_details

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

vorrei cercare stringhe NEW.PRODUCT_NO dalla colonna product_details

Ho cercato come

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

Quanto sopra recupera il testo completo dal mio tavolo.

Qualsiasi aiuto è molto apprezzabile.

saluti

+0

si desidera nell'output solo una sottostringa (una linea) di product_details come "CALCULATION = [N] NEW.PRODUCT_NO = [T9856]"? –

+0

@FlorinGhita Sì, desidero solo la stringa 'NEW.PRODUCT_NO =' come output dalla colonna di clob. – user75ponic

risposta

13

Utilizzare dbms_lob.instr e dbms_lob.substr, proprio come le normali funzioni InStr e SubstStr.
Guardate semplice esempio:

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

Se ho capito bene

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

Se vuoi stringa che include la stringa allora:

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

Ps. Questo codice non è stato testato in Oracle SQL.

+1

Alker product_details è una colonna di clob, la ricerca diretta di sql non funzionerebbe e quindi dobbiamo usare la funzione 'dbms_lob' – user75ponic

+0

Provato il substr? – Alker

12

ok, si può utilizzare substr in correlazione per InStr per trovare la posizione iniziale della stringa

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;