2013-07-15 20 views
13

Jak uzyskać konkretny ciąg z kolumny typu "clob"?Wyszukaj konkretny ciąg w kolumnie z rekordem Oracle

Mam danych jak poniżej, które są przechowywane w kolumnie Clob zwanego product_details

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

chciałbym szukać ciąg NEW.PRODUCT_NO z kolumny product_details

Próbowałem jak

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

Powyższe pobiera pełny tekst z mojego stołu.

Każda pomoc jest bardzo ważna.

Pozdrowienia

+0

chcesz na wyjściu tylko podciąg (linia) szczegółów produktu, takich jak "CALCULATION = [N] NEW.PRODUCT_NO = [T9856]"? –

+0

@FlorinGhita Tak, chciałbym tylko ciąg 'NEW.PRODUCT_NO =' jako wynik z kolumny clob. – user75ponic

Odpowiedz

13

Użyj dbms_lob.instr i dbms_lob.substr, podobnie jak zwykłe funkcje InStr i SubstStr.
Spójrz na prostym przykładzie:

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

Gdybym miał rację

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

Jeśli chcesz ciąg, który zawiera ciąg następnie:

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

Ps. Ten kod nie był testowany w Oracle SQL.

+1

Alker product_details jest kolumną typu clob, bezpośrednie wyszukiwanie sql nie zadziałałoby i dlatego musimy użyć funkcji 'dbms_lob'a – user75ponic

+0

Próbowaliśmy substr? – Alker

12

ok, można użyć substr w korelacji do instr znaleźć pozycję wyjściową swojego łańcucha

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; 
Powiązane problemy