2013-06-17 2 views
1

У меня есть процедура Oracle, которая будет принимать несколько значений внутри параметра. В части процедуры будет выполняться оператор select, содержащий результаты параметра в предложении where и помещая объединенные CLOB в переменную. В настоящее время я использую следующий запрос в процедуре, но когда я его запускаю, я получаю ошибку ниже.concatenate multiple clobs with Oracle Procedure

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 типы данных: ожидалось - получил CLOB

Я также пытался писать это, используя функцию LISTAGG но LISTAGG не работает со значениями CLOB в MESSAGE_CLOB_TABLE

Любая помощь был бы очень признателен! Я использую Oracle 11g.

+0

Что такое тип CLOB_ID в примере запроса и типа поля CLOB_TEXT? – ThinkJet

+0

Кстати, это не ответ, но ... может быть, вам нужно добавить к вам запрос 'order by', потому что в текущем варианте нет гарантии получить строки из' message_clob_table' в любом разумном порядке. – ThinkJet

ответ

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.

Если вам нужно выбрать много сообщений вместе на основе списка его идентификаторов, функция станет немного более сложной, но принцип останется тем же.

+0

Спасибо ThinkJet! Это скомпилировано нормально, но по какой-то причине, когда я его запускаю, он будет заполнять v_MessageBody с каждым значением в столбце clob_text таблицы message_clob_table. Почему бы не отфильтровать только значения в параметре p_msg_id? Это связано с тем, как createtemporary ссылки v_messageBody? – AAA

+0

Кроме того, поскольку p_msg_id может быть разделенным запятыми в моем экземпляре, я сделал предложение where, где message_id в (p_msg_id) – AAA

+0

@Adam Вы не можете просто поместить строку в скобки 'message_id в (...)' для проверки поле против списка значений. SQL интерпретирует эту строку как строку и ничего не знает о ее содержимом. Будет ли это список разделенных запятыми или поздравление с днем ​​рождения. Для этого вы должны сначала проанализировать эту строку и извлечь все значения. И только после этого вы можете использовать набор извлеченных значений для теста. – ThinkJet