在Oracle clob列中搜索特定字符串

时间:2013-07-15 07:37:50

标签: sql oracle oracle10g clob

如何从clob列中获取特定字符串?

我的数据如下,存储在名为product_details

的clob列中
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

以上从我的表中提取全文。

任何帮助都非常值得赞赏。

此致

6 个答案:

答案 0 :(得分:18)

使用dbms_lob.instrdbms_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

答案 1 :(得分:13)

好的,你可以使用与strtr相关的substr来找到你的字符串的起始位置

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;

答案 2 :(得分:5)

select *  
from TABLE_NAME
where dbms_lob.instr(COLUMNNAME,'searchtext') > 0;

答案 3 :(得分:0)

以下代码可用于在Oracle Clob列中搜索特定字符串

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

其中RLOS_BINARY_BP是表名,DED_ENQ_XML是Oracle数据库的列名(数据类型为CLOB)。

答案 4 :(得分:0)

您可以使用@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

答案 5 :(得分:-2)

您只需将CLOB值转换为VARCHAR值,并使查询成为