Как обновить записи строки таблицы базы данных указанного столбца с помощью plsql

Я пишу файл сценария SQL, который запускается, когда я обновляю свое программное обеспечение с более низкой версии до более высокой версии. В более поздней версии программного обеспечения будут некоторые изменения схемы базы данных (то есть один столбец удален и добавлен один новый столбец), а теперь об изменении столбца базы данных и удалении данного столбца я не сталкиваюсь с какими-либо проблемами, оба работают отлично.

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

Как только мои существующие данные сохранены в новом столбце, я отбрасываю столбец, который я хотел отбросить.

Eaxmple - Предположим, мои база данных более высокого уровня содержит имя_последовательности и Таблица базы данных более низкой версии содержит sequence_id.enter image description here

Как написать программу для сохранения данных, хранящихся в sequence_id, для обновления данных заполнения в имя_последовательности на основе некоторых проверок значений sequence_id.

Я написал для него программу SQL, но она не сработала, мой код -

BEGIN
FOR i IN SELECT sequence_id FROM v_live_view_screen_config LOOP    
IF i.sequence_id <> -1 THEN
  DECLARE @seqname VARCHAR(30);
  INSERT INTO @seqname SELECT sequence_name FROM v_sequence_details WHERE 
sequence_id = i.sequence_id;     
   UPDATE v_live_view_screen_config
     SET sequence_name = @seqname;
     WHERE sequence_id = i.sequence_id;
     END IF;        
 END LOOP;
END;

Я тоже пробовал это -

create procedure findsequenceId()
begin
Declare cSequenceID varchar(30);
Declare cConfigID INT;
Declare cSequenceName varchar(30);
Declare done int default false;
Declare curSeq cursor for select configID,seqID from liveview;
declare continue handler for not found set done = true;
open curSeq;
loop_seq: loop
fetch curSeq into cSequenceId, cConfigID;
if done then
        leave loop_seq;
end if;

select cSequenceName = seqName from seqDetails as m where m.seqID = 
cSequenceID;
update liveview set seqName = cSequenceName where seqID = cSequenceID;
end loop;
close curSeq;
end;

Пожалуйста, помогите, я немного запутался, мой сервер базы данных MySQl. Спасибо!

0
0
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я дам концептуальный ответ, но не буду кода. Вы можете создать новую таблицу с временным именем, которое соответствует новой структуре столбцов, которую вы хотите получить. Затем для каждой строки в старой таблице выполните свою логику и вставьте в новую таблицу. Как только вы закончите, у вас будут все ваши строки в новой таблице с логикой, выполненной для вашего столбца, который не был ПРОСТО вставлен (т. Е. Вы преобразовали все экземпляры значения 'Foo' в 'Bar', но напрямую вставлены все остальные значения). Затем отбросьте старую таблицу и переименуйте новую таблицу в имя старой таблицы. Возможно, есть более элегантный способ сделать это, но это простое решение методом грубой силы.

Ответ принят как подходящий

Попробуйте что-то вроде этого - ОБНОВЛЕНИЕ v_live_view_screen_config t2, (выберите sequence_id, sequence_name из v_sequence_details ) t1 SET t2.sequence_name = t1.sequence_name WHERE t1.sequence_id = t2.sequence_id;

Может быть, это сработает!

Другие вопросы по теме