31

如何从 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

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

任何帮助都是非常可观的。

问候

4

6 回答 6

23

使用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
于 2013-07-15T07:57:31.010 回答
17
select *  
from TABLE_NAME
where dbms_lob.instr(COLUMNNAME,'searchtext') > 0;
于 2018-05-03T14:31:26.613 回答
15

好的,您可以使用与 instr 相关的 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;
于 2013-07-15T07:58:27.627 回答
1

下面的代码可用于在 Oracle clob 列中搜索特定字符串

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

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

于 2020-10-13T14:55:47.820 回答
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

于 2021-02-17T07:10:58.950 回答
-2

您可以将您的 CLOB 值转换为 VARCHAR 值并使您的查询像

于 2020-04-17T17:39:09.273 回答