我有一个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。
答案 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列表一起选择许多消息,功能会变得有点复杂,但原则保持不变。