Поиск определенной строки в столбце Oracle clob

Как получить определенную строку из столбца clob?

У меня есть данные, как показано ниже, которые хранятся в столбце clob с именем product_details

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

Я хотел бы найти строку NEW.PRODUCT_NO из столбца product_details

я пробовал как

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

Приведенное выше извлекает полный текст из моей таблицы.

Любая помощь очень ценна.

С Уважением


person Jacob    schedule 15.07.2013    source источник
comment
вы хотите, чтобы на выходе была только подстрока (строка) product_details, например CALCULATION=[N]NEW.PRODUCT_NO=[T9856]?   -  person Florin Ghita    schedule 15.07.2013
comment
@FlorinGhita Да, я бы хотел, чтобы в столбце clob выводилась только строка NEW.PRODUCT_NO=.   -  person Jacob    schedule 15.07.2013


Ответы (5)


Используйте dbms_lob.instr и dbms_lob.substr, как обычные функции InStr и SubstStr.
Посмотрите на простой пример:

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
person krokodilko    schedule 15.07.2013

хорошо, вы можете использовать substr в корреляции с instr, чтобы найти начальную позицию вашей строки

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;
person Florin Ghita    schedule 15.07.2013

Код ниже можно использовать для поиска определенной строки в столбце Oracle clob.

select *  
from RLOS_BINARY_BP
where dbms_lob.instr(DED_ENQ_XML,'2003960067') > 0;

где RLOS_BINARY_BP — имя таблицы, а DED_ENQ_XML — имя столбца (с типом данных CLOB) базы данных Oracle.

person Yoshita Mahajan    schedule 13.10.2020

Вы можете использовать способ, предложенный @Florin Ghita. Но помните, что dbms_lob.substr имеет ограничение в 4000 символов в функции. Например:

dbms_lob.substr(clob_value_column,4000,1)

В противном случае вы найдете ORA-22835 (слишком маленький буфер)

Вы также можете использовать другой способ sql:

SELECT * FROM   your_table WHERE  clob_value_column LIKE '%your string%';

Примечание. Существуют проблемы с производительностью, связанные с обоими вышеперечисленными способами, такими как полное сканирование таблицы, поэтому, пожалуйста, обратите внимание и на текстовые индексы Oracle:

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/ccapp/indexing-with-oracle-text.html

person Nikunj Trivedi    schedule 17.02.2021

Вы можете просто преобразовать значение CLOB в значение VARCHAR и сделать свой запрос похожим на

person Luiz Guilherme Rodrigues Silva    schedule 17.04.2020