Итак, я вычисляю / собираю кучу данных, используя GROUPING_ID, и пытаюсь
1) получить запись в таблице CALCULATION , созданной для каждого отдельного ГОДА и
2) вставить вычисленное значение VALUE, соотнесенное с этим годом, как связанное в таблице отношений CALCULATION_REL и
3) вставить вычисленное значение в таблицу VALUE (эта часть довольнопросто)
Итак, по сути, ниже мой курсор, который я использую для получения данных:
CURSOR a1 is
select
to_char(hr, 'yyyy') yyyy,
sum(value_nb) total,
max(value_nb) maxval,
color
form_field form_field,
grouping_id(to_char(hr, 'yyyy'), form_field, color) AS group_level_nb
from
value v
left outer join submission_value_rel sv on v.value_id = sv.value_id
left outer join submission s on sv.submission_id = s.submission_id
group by cube (to_char(hr, 'yyyy'), form_field_tx, color);
Я хочу что-то вроде этого:
Расчет (таблица)
Calculation_ID Year
1 2016
2 2017
3 2018
Значение (таблица)
Value_ID Value Date Color Shape GROUPING_ID
1 7 2016 Blue NULL 2
2 3 2016 Red NULL 2
3 99 2016 Green Circle 3
4 1 2017 Blue Square 3
5 2 2017 Purple Square 3
6 5 2018 Green Circle 3
7 4 2018 White Square 3
Calculation_Rel (таблица)
Calculation_ID Value_Id
1 1
1 2
1 3
2 4
2 5
3 6
3 7
Лучшее, что я могу придумать, - это создать два отдельных курсора, открыть один для вставки в таблицу CALCULATION и затем закрыть его.Открываем второй курсор для вставки в VALUE и Calculation_Rel и затем каким-то образом связываем его вместе.Или циклически проходя по одному курсору и создавая для каждого отношения вычисления / значения значение calc_id (не оптимально, но я полагаю, что это мое последнее средство. Я не могу найти способ сделать то, что я показал выше. Ниже приведена моя попытка использовать 'циклический подход », который я описал в моем предыдущем предложении:
BEGIN
Open a1;
LOOP
FETCH a1 into a_var;
EXIT WHEN a1%NOTFOUND;
IF grouping_id = 2
THEN
insert into calculation(calculation_id, year)
values (null, a_var.yyyy)
returning calculation_id into v_calculation_id;
-- Calculation_id is auto-generated via a trigger / sequence
insert into value(value_id, value, date, color)
values(null, a_var.sum, a_var.color)
returning value_id into v_value_id;
-- Value_id is auto-generated via a trigger / sequence
insert into calculation_Rel(Calculation_id, Value_Id)
values (v_calculation_id, v_value_id);
ELSIF grouping_id = 3
THEN
insert into calculation(calculation_id, year)
values (null, a_var.yyyy)
returning calculation_id into v_calculation_id;
-- Calculation_id is auto-generated via a trigger / sequence
insert into value(value_id, value, date, color)
values(null, a_var.max, a_var.color)
returning value_id into v_value_id;
-- Value_id is auto-generated via a trigger / sequence
insert into calculation_Rel(Calculation_id, Value_Id)
values (v_calculation_id, v_value_id);
END IF;
commit;
END LOOP;
Close C1;
END;