因此,当前我正在尝试将汇总(汇总)数据插入名为 Value 的表中。我试图在计算表中为我能够从其光标得出的每个唯一年份创建一条记录。然后,我尝试将这些关系插入 Value_Calculation_Rel 表中。如果group_level为'6',我将在 calculation_name 列中插入'YEAR_PEAK_COLOR'。如果group_level的值为“ 4”,我将在“ calculation_name ”列中插入“ YEAR_PEAK_SHAPE”。 因此,从本质上讲,我希望每年在 Calculation (计算)表中获得一条记录。然后,在 VALUE 表中,我希望为我计算出的每个值提供一个不同的记录(无论是颜色,形状的总和还是颜色的最大值,形状都是按 YEAR 分组的)。然后,我想要 Value_Calculation_Rel 表中的记录,以显示 Calculation 中的记录与 Value 中的记录之间的关系(按年份)。
我想要的最终结果如下:
计算表
CALCULATION_ID CALCULATION_DATE CALCULATION_NAME REPORT_PERIOD
1 sysdate 'YEAR PEAK COLOR' 1-1-2017
2 sysdate 'YEAR PEAK SHAPE' 1-1-2017
3 sysdate 'YEAR PEAK COLOR' 1-1-2018
4 sysdate 'YEAR PEAK COLOR' 1-1-2019
5 sysdate 'YEAR PEAK SHAPE' 1-1-2019
VALUE TABLE
VALUE_ID VALUE YR
1 55 1-1-2017
2 10 1-1-2017
3 18 1-1-2018
4 22 1-1-2019
5 77 1-1-2018
6 101 1-1-2019
7 33 1-1-2019
CALCULATON_VALUE关联表
CALCULATION_VALUE_ID CALCULATION_ID VALUE_ID SHAPE COLOR
1 1 1 null RED
2 2 2 CIRCLE null
3 3 3 null BLUE
4 4 4 null BLUE
5 3 5 SQUARE null
6 4 6 null RED
7 5 7 SQUARE null
下面是我的代码(当前正在为每个值创建一个新的“计算”记录,这是错误的):
create or replace procedure STORED_PROC
IS
CURSOR c1 is
select
trunc(hr, 'yyyy') yr,
shape,
sum(value) total,
max(value) maxval,
color,
grouping_id(trunc(hr, 'yyyy'), shape, color) AS group_level_nb
from value v
join calculation_value cv on v.value_id = cv.value_id
group by cube (trunc(hr, 'yyyy'), shape, color);
l_var c1%ROWTYPE;
v_value_id value.value_id%type;
v_calculation_id calculation.calculation_id%type;
--
BEGIN
IF l_var.group_level_nb = '6'
THEN
INSERT INTO CALCULATION(calculation_id, calculation_date, calculation_name, report_period_dt)
VALUES (null, sysdate, 'YEAR_PEAK_COLOR' || to_char(sysdate, 'hh24:mi:ss'), l_var.yr)
returning calculation_id into v_calculation_id;
INSERT INTO value(value_id, value, yr)
VALUES (null, l_var.total, l_var.yr)
returning value_id into v_value_id;
INSERT INTO calculation_value (calculation_value_id, calculation_id, value_id, color)
VALUES (null, v_calculation_id, v_value_id, l_var.color);
commit;
--
ELSIF l_var.group_level_nb = '4'
THEN
INSERT INTO CALCULATION(calculation_id, calculation_date, calculation_name, report_period_dt)
VALUES (null, sysdate, 'YEAR_PEAK_SHAPE ' || to_char(sysdate, 'hh24:mi:ss'), l_var.yr )
returning calculation_id into v_calculation_id;
--
INSERT INTO value (value_id, value, yr)
VALUES (null, l_var.maxval, l_var.yr) returning value_id into v_value_id;
INSERT INTO calculation_value (calculation_value_id, calculation_id, value_id, shape)
VALUES (null, v_calculation_id, v_value_id, l_var.shape);
END IF;
--
commit;
--
END STORED_PROC;
请让我知道是否还有其他需要我补充的信息。预先感谢。
答案 0 :(得分:1)
这里是一个解决方案,它首先检查记录在CALCULATION TABLE中是否已经存在,并仅在不存在时添加一行。在这两种情况下,您都可以将v_calculation_id用于下一步。我没有用光标和所有内容写出来,但是用INSERT INTO CALCULATION
替换select CALCULATION_ID [...] returning t.CALCULATION_ID into v_calculation_id
应该很容易。 HTH
create sequence seq;
create table tab (
CALCULATION_ID number default on null seq.nextval not null enable,
CALCULATION_DATE date,
CALCULATION_NAME varchar2(100),
REPORT_PERIOD varchar2(100));
declare
v_calculation_id number;
v_CALCULATION_NAME varchar2(100) := 'name';
v_REPORT_PERIOD varchar2(100) := 'period';
begin
begin
select CALCULATION_ID into v_calculation_id
from tab where CALCULATION_NAME = v_CALCULATION_NAME and REPORT_PERIOD = v_REPORT_PERIOD;
EXCEPTION WHEN NO_DATA_FOUND THEN
insert into tab t
(CALCULATION_ID, CALCULATION_DATE, CALCULATION_NAME , REPORT_PERIOD)
values (null, sysdate, v_CALCULATION_NAME , v_REPORT_PERIOD)
returning t.CALCULATION_ID into v_calculation_id;
end;
dbms_output.put_line(v_calculation_id);
end;
/
select * from tab;
由于评论而编辑:
您没有提供完整的过程,并且某些事情没有加在一起-例如一次将表CALCULATION
中的一列称为REPORT_PERIOD
,另一次称为
现在是called report_period_dt
。另一个示例:在示例数据中,CALCULATION_NAME
的值例如是'YEAR PEAK COLOR'
,但您在过程中按如下方式填写:'YEAR_PEAK_COLOR' || to_char(sysdate, 'hh24:mi:ss')
-如上所述,我决定为您提供一个技术示例,而不是更改过程。但鉴于上述不确定性,我的意思是您这样替换(l_var.group_level_nb = '4'
同样):
[...]
IF l_var.group_level_nb = '6'
THEN
INSERT INTO CALCULATION(calculation_id, calculation_date, calculation_name, report_period_dt)
VALUES (null, sysdate, 'YEAR_PEAK_COLOR' || to_char(sysdate, 'hh24:mi:ss'), l_var.yr)
returning calculation_id into v_calculation_id;
INSERT INTO value(value_id, value, yr)
[...]
成为
[...]
IF l_var.group_level_nb = '6'
THEN
begin
select CALCULATION_ID into v_calculation_id
from CALCULATION where CALCULATION_NAME = 'YEAR_PEAK_COLOR' and REPORT_PERIOD = l_var.yr;
EXCEPTION WHEN NO_DATA_FOUND THEN
insert into CALCULATION t
(CALCULATION_ID, CALCULATION_DATE, CALCULATION_NAME , report_period_dt)
values (null, sysdate, 'YEAR_PEAK_COLOR' , l_var.yr)
returning t.CALCULATION_ID into v_calculation_id;
end;
INSERT INTO value(value_id, value, yr)
[...]