【问题标题】:concatenate multiple clobs withing Oracle Procedure使用 Oracle 过程连接多个 clob
【发布时间】:2013-06-13 23:29:24
【问题描述】:

我有一个 Oracle 过程将在一个参数中接受多个值。该过程的一部分将运行一个 select 语句,将参数的结果放在 where 子句中,并将连接的 CLOB 放入一个变量中。我目前在程序中使用下面的查询,但是当我运行它时,我得到了下面的错误。

If CLOB_ID is not null then
    SELECT cast((collect(CLOB_TEXT) )as CLOB )
    into v_MessageBody 
    FROM MESSAGE_CLOB_TABLE 
    WHERE MESSAGE_ID in CLOB_ID;
End If;

错误:ORA-00932:不一致的数据类型:预期 - 得到 CLOB

我也尝试使用 LISTAGG 函数编写此代码,但 LISTAGG 不适用于 MESSAGE_CLOB_TABLE 中的 CLOB 值

任何帮助将不胜感激!我正在使用 Oracle 11g。

【问题讨论】:

  • 示例查询中 CLOB_ID 的类型和 CLOB_TEXT 字段的类型是什么?
  • 顺便说一下(这不是答案,但是...)您可能需要在查询中添加order by 子句,因为在当前变体中,不能保证从@987654323 中获取行@以任何合理的顺序。

标签: oracle oracle11g clob


【解决方案1】:

如果您需要在 PL/SQL 中进行连接,最简单的变体是遍历所有选定的记录并将所有找到的记录附加到结果中:

create or replace function get_message(p_msg_id in number) return CLOB
is
  v_MessageBody CLOB;
begin
  -- create new instance of temporary CLOB
  dbms_lob.createtemporary(v_MessageBody, true);

  -- Fill instance with lines
  for cMessages in (
    select clob_text 
    from message_clob_table 
    where message_id = p_msg_id
    order by message_row
  )
  loop
    -- add line
    dbms_lob.append(v_MessageBody, cMessages.clob_text);
  end loop;

  -- return collected lines as single CLOB
  return v_MessageBody;
end;

如果CLOB_TEXT 字段的类型是CLOB 并且您只需要收集一条消息,则上述示例有效。您可以在this SQLFiddle中测试功能。

如果你需要根据他的ID列表选择多条消息,功能会稍微复杂一些,但原理是一样的。

【讨论】:

  • 感谢 ThinkJet!这编译好,但由于某种原因,当我运行它时,它会用 message_clob_table 表的 clob_text 列中的每个值填充 v_MessageBody。为什么不只过滤掉 p_msg_id 参数中的值?是不是跟createtemporary引用v_messageBody的方式有关系?
  • 另外,由于 p_msg_id 在我的实例中可以是逗号分隔的列表,所以我在 where 子句中说明了 where message_id in (p_msg_id)
  • @Adam 您不能只将字符串放入message_id in (...) 的括号中来针对值列表测试字段。 SQL 将此字符串解释为字符串,并且对其内容一无所知。是逗号分隔的列表还是祝贺生日。为此,您必须首先解析此字符串并提取所有值。只有在那之后,您才能使用一组提取的值进行测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多