2

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

4

1 回答 1

3

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

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

于 2013-06-17T22:19:48.060 回答