使用Oracle过程连接多个CLOB

使用Oracle过程连接多个CLOB,oracle,oracle11g,clob,Oracle,Oracle11g,Clob,我有一个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

我有一个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

我还尝试使用listag函数编写此函数,但listag不能处理MESSAGE_CLOB_表中的CLOB值


任何帮助都将不胜感激!我使用的是Oracle 11g。

如果需要在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
,并且您只需要收集一条消息,则上述示例有效。您可以在中测试函数


如果您需要根据他的ID列表一起选择多条消息,函数会变得有点复杂,但原理不变。

示例查询中的CLOB_ID类型和CLOB_文本字段类型是什么?顺便问一下(这不是答案,但…)可能您需要在查询中添加
order by
子句,因为在当前变体中,无法保证以任何合理的顺序从
消息\u clob\u表
中获取行。谢谢ThinkJet!这可以,但由于某种原因,当我运行它时,它将用message_clob_表的clob_文本列中的每个值填充v_MessageBody。为什么不只过滤p_msg_id参数中的值?这与createtemporary引用v_messageBody的方式有关吗?另外,由于p_msg_id在我的实例中可以是逗号分隔的列表,我让where子句在(p_msg_id)@Adam中表示where message_id,您不能只将字符串放在(…)中的
的括号中,以根据值列表测试字段。SQL将此字符串解释为字符串,对其内容一无所知。是用逗号分隔的单子还是用生日祝贺。为此,必须首先解析此字符串并提取所有值。只有在这之后,您才能使用提取的值集进行测试。SF的相关问题: