使用Oracle过程连接多个clob

时间:2013-06-17 21:30:50

标签: 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 MESSAGE_ID in CLOB_ID;
End If;

错误:ORA-00932:incosistant数据类型:expected - 得到了CLOB

我也尝试使用LISTAGG函数编写它,但LISTAGG不能使用MESSAGE_CLOB_TABLE中的CLOB值

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

1 个答案:

答案 0 :(得分:2)

如果你需要在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列表一起选择许多消息,功能会变得有点复杂,但原则保持不变。