введите описание изображения здесь Я хочу перенести данные из старой таблицы (table_old) в новую таблицу (table_new).
table_old имеет следующие столбцы.
- recordseq
- начальная дата
- конечная дата
- поле1
- поле2
- поле3
- recordnum
table_new имеет следующие столбцы.
- recordseq
- startdate
- enddate
- field1
- field2
- field3
- field4
- field5
- field6
- recordnum
- recordnum_old
Каждая recordseq
может иметь несколько записей, которые могут быть recordnum
например:
Если для определенного recordseq
имеется две записи, то в столбцах данных recordnum
будут присутствовать 1 и 2.
Требование при переносе данных, каждые две записи в старой таблице должны отображаться в 1 записи.
Здесь миграция данных означает field1
, field2
, field3
и recordnum
.
Например, если В конкретном seq есть 4 записи в старой таблице, тогда первая запись будет вставлена в 1-ю строку новой таблицы в field1
, field2
, field3
, а данные 2-й строки будут вставлены в field4
, field5
и field6
.
Аналогично для 3-й строки данные в старой таблице будут вставлены во 2-й ряд новой таблицы в field1
, field2
и field3
, а данные 4-й строки будут b Вставлен в field4
, field5
и field6
2-й строки в новой таблице.
Некоторые записи записей могут иметь только одну запись. У разных последовательностей могут быть разные номера записей.
В новой таблице recordnum _old будет содержать данные столбца recordnum старой таблицы, а recordnum будет содержать новый номер записи после миграции.
Поэтому при первой миграции мы вставили recordseq, startdate, enddate и recordnum _old data И recordnum будут постоянными числами, такими как 999, которые позже будут обновлены до фактического номера записи. После этого мы написали приведенный ниже код для переноса оставшихся данных: field1, field2, field3, как описано выше.
Do
Begin
DECLARE MAX_REC INT;
DECLARE REC_IDX INT;
Select max(recordnum) into MAX_REC FROM table _old;
MAX_REC := 0;
REC_IDX:=0;
while(REC_IDX<= MAX_REC)
Do
Begin
IF(mod(REC_IDX,2)=0)
Then
Update table_new a set (a. recordNum,a.field1,a.field2,a.field3)
= (select cast(REC_IDX/2 as int),b. field1,b.field2,b.field3 from table_old b Where
a.recordseq=b.recordseq and a.startdate=b.startdate and a.enddate = b.enddate and
b.recordnum=REC_IDX) from table_new a where a.recordnum_old= cast(REC_IDX/2 as int);
ELSEIF
THEN
Update table_new a set (a. recordNum,a.field4,a.field5,a.field6)
= (select cast(REC_IDX/2 as int),b. field1,b.field2,b.field3 from table_old b Where
a.recordseq=b.recordseq and a.startdate=b.startdate and a.enddate = b.enddate and
b.recordnum=REC_IDX) from table_new a where a.recordnum_old= cast(REC_IDX/2 as int);
END IF
после завершения выполнения новые записи могут быть отфильтрованы путем проверки записей, которые не имеют pagenum 999
Основная проблема с этим кодом заключается в том, что определенный seq имеет только одну запись, а максимальное количество записей в старой таблице равно 5. На первой итерации первая строка старой записи вставляется в первую строку новой таблицы с номером строки, равным 1, а затем нулевым значение переопределяется для recordnum во 2-й итерации, так как для этой записи больше нет записей seq.
Поэтому я не хочу обновлять новую таблицу для seq, у которого больше нет записей в старой таблице при итерации пока l oop.
Не могли бы вы помочь мне достичь этого.