Открытие курсора для извлечения и обновления значений столбцов таблицы на основе других значений столбцов той же таблицы в Oracle - PullRequest
0 голосов
/ 25 июня 2018

Мне нужно обновить последние 2 столбца в таблице на основе приведенной ниже логики, которая содержит 42 столбца.

  • Значение поля C42 (которое заменяется на N в приведенном ниже уравнении) = ("ПервыйПоложение столбца с нулевым значением / без значения "- 1)
  • Значение поля C41 = Значение поля столбца C (N), где N = (значение столбца« C42 »минус 1)

Примечание. Табличные значения настраиваются таким образом, чтобы при появлении первого нулевого значения в столбце;Следующие столбцы в любой конкретной записи точно равны нулю. Таблица содержит около 100 тыс. записей, и это промежуточная таблица, в которой приведенный выше расчет повторяется каждую неделю, а новые значения заполняются в таблице, а последние два столбца должны рассчитываться каждую неделю.

например:

C42 = C19   ( 20 - 1) 

C41 = C(20) when 20 columns have some value and 21st column is null

Попытка создания хранимой процедуры и открытие курсора для извлечения значений для расчета, но возникли проблемы с созданием логики и обновлением каждой строки на основе логики.Может кто-нибудь предложить эффективный способ выполнения вышеуказанной логики расчета и обновления каждой записи.Заранее спасибо

1 Ответ

0 голосов
/ 25 июня 2018

Если я понимаю, что вы делаете, вам не нужен 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

Если это то, что вы собираетесьчтобы делать это регулярно, вы могли бы вместо этого создавать виртуальные столбцы, чтобы они вычислялись автоматически и всегда были актуальными.

...