2013-06-27 4 views
1

Я использую oracle verion 10. В PL/SQL хранится процедура с использованием переменной varchar2. Код постоянно добавляет переменную varchar2. Когда переменный размер varchar2 превышает 32767, он не может добавить больше значения. Теперь я хочу изменить тип данных на long или clob (чтобы разместить больше символов), он не работает. Как изменить код здесь, чтобы иметь те же функции добавления с помощью clob или long?Замена varchar2 с большим типом данных в oracle SP

пример прилагается x: = x || 'мои данные';

+1

'long' устарел для длительного (не предназначенного для каламбур) времени и имеет ограничения. Придерживайтесь 'clob'. –

+0

@AlexPoole, я проверил, изменив тип данных на clob, это не сработало. – user215005

+0

Я просто хотел, чтобы вы искали решения 'clob' и не должны были рассматривать' long' вообще. Я не имел в виду, что вы можете объединиться, как вы можете, с помощью varchar2. Возможно, вы захотите ['dbms_lob.writeappend()'] (http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lob.htm#i999705), но я в настоящее время не могу опубликовать больше чем ответ только для ссылок ... –

ответ

1

long datatype устарел; если вы можете серьезно подумать, migrating your long column to a clob.

Если вы работали с clob вы могли бы добавить мимо 32k varchar2 предела, как это:

declare 
    l_clob clob; 
begin 
    dbms_lob.createtemporary(l_clob, true); 
    dbms_lob.open(l_clob, dbms_lob.lob_readwrite); 
    dbms_lob.writeappend(l_clob, 4, '1234'); 
    for i in 1..10000 loop 
    dbms_lob.writeappend(l_clob, 5, '.5678'); 
    end loop; 
    dbms_output.put_line('CLOB length: ' || length(l_clob)); 
    dbms_lob.close(l_clob); 
    dbms_lob.freetemporary(l_clob); end; 
/

CLOB length: 50004 

Вы можете добавить к long с оператором конкатенации ||, но, как вы уже видели, только до 32 тыс. Нет простого способа обработки значений long выше, чем в PL/SQL. Возможно, вы сможете сделать все с dbms_sql, но это действительно не будет стоить усилий, если есть возможность переключить столбец таблицы на clob.


Если вы хотите передать CLOB обратно к абоненту, и это временный CLOB, он должен быть определен абонентом и передать его после того, как он создан:

create or replace procedure proc1 as 
    l_clob clob; 
begin 
    dbms_lob.createtemporary(l_clob, true); 

    proc2(l_clob); 
    dbms_output.put_line('proc1 CLOB length: ' || length(l_clob)); 

    dbms_lob.freetemporary(l_clob); 
end; 
/

create or replace procedure proc2(p_clob in out clob) as 
begin 
    dbms_lob.open(p_clob, dbms_lob.lob_readwrite); 
    dbms_lob.writeappend(p_clob, 5, '12345'); 
    for i in 1..9999 loop 
    dbms_lob.writeappend(p_clob, 5, '.56789'); 
    end loop; 
    dbms_output.put_line('proc2 CLOB length: ' || length(p_clob)); 
    dbms_lob.close(p_clob); 
end; 
/

exec procs; 

proc2 CLOB length: 50000 
proc1 CLOB length: 50000 

В противном случае объект не будет существовать в отношении вызывающего абонента.

Если clob существует - выбирается из таблицы, скажем, так что вам не нужен createtemporary вызов - то вы можете просто назначить его в out параметра, но я не думаю, что это дело за то, что» описал.

+0

Спасибо @Alex, очень полезно, я просто хочу знать, как вернуть значение из этого клоба. – user215005

+0

@ user215005 - вернитесь туда, где и как? Вы пытаетесь вставить/обновить столбец 'long' из proc или передать значение обратно клиенту, который будет делать вставку/обновление? –

+0

Это SP, вызванный из другого SP с параметром out. Таким образом, значение var var clob должно быть возвращено вызванному SP – user215005