Если я понимаю, что вы делаете, вам не нужен PL / SQL, вам просто нужно простое обновление с использованием coalesce и выражения case - по общему признанию, оба с множеством терминов, так что это немного громоздко.
Использование значительно упрощенной таблицы с четырьмя столбцами, о которых нужно беспокоиться, плюс 41-й и 42-й, которые вы хотите обновить:
create table your_table (c1 number, c2 number, c3 number, c4 number, c41 number, c42 number);
insert into your_table (c1, c2) values (11, 12);
insert into your_table (c1, c2, c3) values (23, 24, 25);
Вы можете получить значение c42
, объединив все остальные столбцыв обратном порядке:
coalesce(c4, c3, c2, c1)
или в вашем случае:
coalesce(c40, c39, c38, c37, ..., c4, c3, c2, c1)
И вы можете получить позицию этого столбца с помощью выражения регистра, например:
case
when c40 is not null then 40
when c39 is not null then 39
...
when c4 is not null then 4
when c3 is not null then 3
when c2 is not null then 2
when c1 is not null then 1
end;
Вы можете запросить только для просмотра значений с помощью (используя мою упрощенную таблицу):
select c1, c2, c3, c4,
coalesce(c4, c3, c2, c1) as c41,
case
when c4 is not null then 4
when c3 is not null then 3
when c2 is not null then 2
when c1 is not null then 1
end as c42
from your_table;
C1 C2 C3 C4 C41 C42
---------- ---------- ---------- ---------- ---------- ----------
11 12 12 2
23 24 25 25 3
И вы можете обновить с помощью просто:
update your_table
set c41 = coalesce(c4, c3, c2, c1),
c42 =
case
when c4 is not null then 4
when c3 is not null then 3
when c2 is not null then 2
when c1 is not null then 1
end;
2 rows updated.
select * from your_table;
C1 C2 C3 C4 C41 C42
---------- ---------- ---------- ---------- ---------- ----------
11 12 12 2
23 24 25 25 3
Если это то, что вы собираетесьчтобы делать это регулярно, вы могли бы вместо этого создавать виртуальные столбцы, чтобы они вычислялись автоматически и всегда были актуальными.