2013-10-02 6 views
0

У меня есть CLOB, который я пытаюсь заменить символами перевода строки \r или \n, если это необходимо. Это связано с тем, что я использую SQL * Plus для экспорта данных, и он экспортирует строки в исходное значение, что означает, что мой парсер, рассматривающий форматирование пробела для определения значений полей, не работает.Oracle 8i Замените символы строки в CLOB

Я попробовал команду так:

SELECT REPLACE(DESCRIPTION, chr(10), '\n') FROM ORDESCRIPTION;

Но я получаю:

ORA-00932: inconsistent datatypes

данных:

SQL> select DESCRIPTION from ORDESCRIPTION where or_id = 'FOO/BAR/OR_000002'; 

DESCRIPTION                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
--------------------------------------------------------------------------------                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
1) Why don't you take this and shove it 


SQL> spool off 

Поле фактически содержит больше данных, как показали слегка бет er database browser GUI:

1) Why don't you take this and shove it 

2) This section is particularly crap 

3) Do something 
+0

Там вы идете @Polppan – deed02392

+0

Я не уверен, как заменить разрыв строки фиксированной строкой '\ n' (что SQL * Plus сделал бы; S Разработчик QL и, возможно, другие клиенты обрабатывают '\ n' как новый символ линии в любом случае). Может быть, включение значения с разделителем (например, двойные кавычки, но это должно быть то, что не существует ни в одном из значений) тоже будет работать? Также вы можете использовать ['set long'] (http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve040.htm#i2699121), чтобы увеличить количество значений, отображаемых SQL * Plus. –

+0

Кстати, то, что вы делаете, похоже [работает в 11g] (http://sqlfiddle.com/#!4/4d91b/2); У меня нет экземпляра 8i, чтобы попробовать его (возможно, не удивительно). [Заменить значения 'clob' теперь] (http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions153.htm), но я не удивлюсь, если это не произошло в 8i, хотя [это было в 9i] (http://docs.oracle.com/cd/B10501_01/server.920/a96540/functions102a.htm). –

ответ

0

REPLACE работает с VARCHAR2s не с CLOB. Представьте себе, что один файл CLOB имеет 177 ТБ (максимальный размер CLOB). Что сделал бы Oracle с этим? Где он сохранит результат?

Посмотрите на процедуру DBMS_LOB.FRAGMENT_REPLACE.

+1

'replace' работал с' clob' с 9i, ​​что не помогает OP; но в 8i, ['dbms_lob.fragment_replace' не существует] (http://docs.oracle.com/cd/A87860_01/doc/appdev.817/a76936/dbms_lo2.htm#998404). –

+0

@Alex Я не знал - thx для указания этого. Я думал, что происходит неявное преобразование из CLOB в VARCHAR2 - что опасно, поскольку оно, похоже, работает с образцами данных. – ibre5041

1

вы можете попробовать использовать пакет dbms_lob. вот пример из good old Ask Tom page

create table ORDESCRIPTION(
    or_id varchar2(255), 
    DESCRIPTION clob 
); 
/

create or replace function lob_replace(p_lob in clob, 
             p_what in varchar2, 
             p_with in varchar2) 
return clob 
as 
    n  number; 
    l_offset number := 1; 
    l_lob clob;   
    begin 
    dbms_lob.createtemporary(l_lob, TRUE, dbms_lob.session); 
    dbms_lob.copy(l_lob, p_lob, dbms_lob.getlength(p_lob), 1, 1); 
    loop 
     n := dbms_lob.instr(l_lob, p_what, l_offset); 
     if (nvl(n,0) > 0) 
     then 
      if ((n+length(p_what)) < dbms_lob.getlength(l_lob)) 
      then 
       dbms_lob.copy(l_lob, 
           l_lob, 
           dbms_lob.getlength(l_lob), 
           n+length(p_with), 
           n+length(p_what)); 
      end if; 

      dbms_lob.write(l_lob, length(p_with), n, p_with); 
      if (length(p_what) > length(p_with)) 
      then 
       dbms_lob.trim(l_lob, 
        dbms_lob.getlength(l_lob)-(length(p_what)-length(p_with))); 
      end if; 
      l_offset := l_offset + length(p_with); 
     else 
      exit; 
     end if; 
    end loop; 
    return l_lob; 
end; 
/

insert into ORDESCRIPTION (or_id, description) values 
('id001', 'hello'||chr(10)||chr(10)||'world'||chr(10)); 
/



declare 
l_clob clob; 
l_clob_replaced clob; 
begin 
    select DESCRIPTION into l_clob 
     from ORDESCRIPTION 
     where or_id = 'id001'; 
    dbms_output.put_line(dbms_lob.substr(l_clob, 255, 1)); 
    dbms_output.put_line('----------------'); 
    l_clob_replaced := lob_replace(l_clob, chr(10), '\n'); 
    dbms_output.put_line(dbms_lob.substr(l_clob_replaced, 255, 1)); 
end; 
/

select lob_replace(DESCRIPTION, chr(10), '\n') 
from ORDESCRIPTION; 

EDIT Устранена SELECT, в примере использования
EDIT2 добавленным FOR UPDATE в ЗЕЬЕСТ в примере использования
EDIT3 обновленный исходный код, создан SQLFiddle http://sqlfiddle.com/#!4/8a274/4

+0

После создания proceudre, когда я пытаюсь выполнить SELECT, я получаю ошибки ORA-06550. Вы уверены, что это правильный синтаксис? – deed02392

+0

Нет, я не. На самом деле я взглянул на SELECT, и в нем есть явная ошибка (отсутствует ключевое слово 'from'). С одной стороны, извините, я исправлю это. С другой стороны, я очень разочарован тем, что вы не исправили его сами, вместо этого прокомментировали здесь. Я бы посоветовал вам быть более независимым. – bpgergo

+0

Как оказалось, я сделал правильную попытку исправить его, но мне осталась другая ошибка: «ORA-22920: строка, содержащая значение LOB, не заблокирована», что заставило меня предположить, что я не исправил ее правильно. Это ошибка, с которой я столкнулся, после применения вашего рассмотренного запроса. Деталь: 'ОР-06512: в "SYS.DBMS_LOB", строка 381 ОР-06512: на "CCS.LOB_REPLACE", строка 14 ОР-06512: в строке 7' – deed02392

Смежные вопросы