Ваша проблема может быть решена с помощью блока PLSQL
, как показано ниже. Попробуйте реализовать логику, указанную в строке, и проверьте, работает ли это.
Код:
declare
---getting each message of length 4000 characters
cursor cur is
select message
from log;
var number;
var1 varchar2(2000);
cntr number:=0;
begin
--Loop for each message
for i in cur
loop
--getting length of message
var:= length(i.message);
for len in 1..(var/2000)
loop
--setting the offset to pick 2000 chracters
if cntr = 0 then
cntr := cntr +1;
else
cntr := cntr + 2000;
end if;
--selecting 2000 characters from message
var1:=substr(i.message,cntr,2000);
---inserting 2000 charcters to table
insert into table_log(col1)
values(var1);
commit;
end loop;
end loop;
end;
Демо:
SQL> create table log(message varchar2(4000));
SQL> select message from log ;
MESSAGE
--------------------------------------------------------------------------------
KHAGDKAGDHAGDKHAGD
ADSJHA:DAH:DHHAHDH
.
.
.
SQL> select length(message) from log ;
LENGTH(MESSAGE)
---------------
3989
SQL> create table table_log(col1 varchar2(2000));
SQL> select col1 from table_log ;
COL1
--------------------------------------------------------------------------------
SQL>/
PL/SQL procedure successfully completed.
--- Two rows created to destination table with size approx 2000 characters each
SQL> select length(col1) from table_log ;
LENGTH(COL1)
------------
2000
1989
В простом SQL вы можете сделать это, как
insert into table_log(col1)
select SUBSTR(l.MESSAGE, 1, 2000) AS MESSAGE
FROM LOG l
UNION ALL
select SUBSTR(l.MESSAGE, 2001, 2000) AS MESSAGE
FROM LOG l
WHERE length(l.MESSAGE) > 2000;
Предположим, вы это сделали. В новой базе данных, как вы узнаете, какая строка содержит первые 2000 символов, а какая строка содержит оставшуюся часть 'MESSAGE'? Вам нужна дополнительная колонка, чтобы показать «часть 1» и «часть 2»? Кажется, было бы намного проще изменить столбец в таблице «получение» на «VARCHAR2 (4000)», это опция? (Если нет, почему бы и нет?) – mathguy
Существует также идентификатор сегмента, поэтому это не проблема. Я не могу изменить его на VARCHAR2 (4000) из-за кодировки символов. – Javiator
Разве это не одна «вставка» и «обновление»? Я не вижу осложнений. –