2017-02-02 70 views
0

我有一个表,其中一个字段是CLOB,它存储错误消息信息。Oracle SQL:从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的结果,因此,使用下面的查询IM:

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

我假装只选择包含'Caused by ..'字符串的行。我需要的是提取只有以下错误信息:

Item not found for Id: 1101505002 

这是可能的,只有一个选择语句?

由于提前, 最好的问候,

+0

向我们展示您的存储过程 –

+0

喂,是不是程序,只是一个将用于报告提议的简单查询。 –

+0

那么如果你没有存储过程,“PL/SQL输出”来自哪里呢? –

回答

0

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

如果您需要更短的子字符串,您需要更详细地解释它如何被“识别” - 您如何确定可以省略什么以及必须返回哪些内容。这是如何划定的?

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

(注意,默认情况通配符.匹配在甲骨文正则表达式的结束行。)

+0

你好, 这样做的工作,我用以下为了使clob直接在输出中可见,而不需要打开所有的clob文件: 'dbms_lob.substr(regexp_substr(message_error,'引起:。* '),4000,1)AS error_message' 谢谢,我不会试图找到一种方法来从输出中删除**引起的:**。 –

相关问题