【发布时间】:2016-09-02 08:59:47
【问题描述】:
我对 PL/SQL 很陌生。我在一个名为“FLEX_PANEL_INSPECTIONS”的初始表中有数据,我试图使用 PL/SQL 过程在名为“PANEL_STATUS_2”的第二个表中进行汇总。然而,由于数据的性质,我不得不写一个case语句来正确地总结来自FLEX_PANEL_INSPECTIONS的数据。因此,我创建了第三个中间表来连接两者(名为“PANEL_STATUS_1”),因为 case 语句不允许 group by 子句中专门对数据进行排序的列(据我所知 - 当我尝试这样做)。我不想将数据存储在中间表中 - 有什么方法可以使其成为临时表(即仅在过程运行时存在,以便不保留来自“PANEL_STATUS_1”的数据);在过程中创建视图,还是完全不需要中间表?
对我对 PL/SQL 的错误/误解的任何帮助或批评将不胜感激。这是我写的代码:
create or replace procedure PANEL_STATUS_PROCEDURE (panel_lot_id in number) as
begin
--Populate intermediate table with information about the status of the panels.
insert into PANEL_STATUS_1 (FLEX_LOT_ID, FLEX_PANEL_DMX, FLEX_PANEL_STATUS)
select FLEX_LOT_ID, FLEX_PANEL_DMX,
--Sum the status values of the 4 panel inspections. A panel passes if and only if this sum = 4.
case sum (FLEX_PANEL_STATUS)
when 4 then 1
else 0
end as new_panel_status
from FLEX_PANEL_INSPECTIONS
where FLEX_LOT_ID = panel_lot_id
group by FLEX_LOT_ID, FLEX_PANEL_DMX;
--Add information about the machine ID and the upload time to this table.
insert into PANEL_STATUS_2 (FLEX_LOT_ID, FLEX_PANEL_DMX, FLEX_PANEL_STATUS, MACHINE_ID, UPLOAD_TIME)
select distinct PANEL_STATUS_1.*, MACHINE_ID, UPLOAD_TIME
from PANEL_STATUS_1, FLEX_PANEL_INSPECTIONS
where (FLEX_PANEL_INSPECTIONS.FLEX_LOT_ID = PANEL_STATUS_1.FLEX_LOT_ID
and FLEX_PANEL_INSPECTIONS.FLEX_PANEL_DMX = PANEL_STATUS_1.FLEX_PANEL_DMX)
and FLEX_PANEL_INSPECTIONS.FLEX_LOT_ID = panel_lot_id;
end PANEL_STATUS_PROCEDURE;
/
【问题讨论】:
标签: sql oracle plsql temporary