Oracle SQL:从CLOB字段中选择特定字符串

时间:2017-02-02 20:35:25

标签: sql oracle

我有一个表,其中一个字段是CLOB,它存储错误消息信息。

字段CLOB如下:

oracle.retail.sim.common.core.SimServerException: Error processing message! [Inbound: true, MessageType: ItemLocCre, BusinessId: 1101505002]
    at oracle.retail.sim.service.mps.SimMessageCommand.buildException(Unknown Source)
    at oracle.retail.sim.service.mps.SimMessageProcessCommand.doExecute(Unknown Source)
    at oracle.retail.sim.common.core.Command.execute(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor273.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
Caused by: oracle.retail.sim.common.core.SimServerException: Item not found for Id: 1101505002
    at oracle.retail.sim.server.integration.consumer.itemloc.ItemLocConsumer.buildItemNotFoundException(Unknown Source)
    at oracle.retail.sim.server.integration.consumer.itemloc.ItemLocCreateConsumer.handleMessage(Unknown Source)
    at oracle.retail.sim.server.integration.consumer.itemloc.ItemLocCreateConsumer.handleMessage(Unknown Source)
    at oracle.retail.sim.server.integration.consumer.SimMessageConsumerFactory.consume(Unknown Source)
    ... 56 more

我试图直接在PL / SQL输出中显示clob的结果,所以我使用以下查询:

select id, dbms_lob.substr(message_error, 4000, 1) AS ERROR_MESSAGE
  from THE_TABLE;

我假装只选择包含'由...引起的行。串。我需要的是只提取以下错误信息:

Item not found for Id: 1101505002

只有选择语句可以这样做吗?

提前致谢, 最好的问候,

1 个答案:

答案 0 :(得分:0)

以下查询(替换您的实际表名和列名)将提取一行文本,从单词Caused by到该行的结尾。如果文本行以Caused by开头并不重要 - 您只能获得从这些单词到行尾的所有内容。

如果你需要一个较短的子串,你需要更详细地解释它是如何被识别的" - 你如何决定可以遗漏什么以及必须返回什么。怎么划分?

select regexp_substr(message, 'Caused by:.*) as caused_line
from   test_data;

(请注意,默认情况下,通配符. 匹配Oracle中正则表达式的行尾。)