如何从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
以上从我的表中提取全文。
任何帮助都非常值得赞赏。
此致
答案 0 :(得分:18)
使用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
答案 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值,并使查询成为