2016-09-02 11 views
0

私はPL/SQLの新機能です。 PL/SQLプロシージャを使用して 'PANEL_STATUS_2'という名前の2番目の表に要約しようとしている、初期表のデータが 'FLEX_PANEL_INSPECTIONS'という名前になっています。しかし、データの性質上、FLEX_PANEL_INSPECTIONSのデータを正しく要約するためにcase文を記述しなければなりませんでした。 I case文は私の知識の範囲内で(特にデータを注文したGROUP BY句に列を許可しませんので、したがって、2(名前は「PANEL_STATUS_1」)を埋めるために第三、中間テーブルを作成している - 私は時にエラーが出ます私はこれをしようとする)。私は中間テーブルにデータを格納したくないのです - それを一時的にする(すなわち、プロシージャが実行されている間だけ存在して、 'PANEL_STATUS_1'のデータが保持されないようにする)方法はありますか?プロシージャ内でビューを作成するか、中間テーブルの必要性を完全に取り除きますか?PL/SQLプロシージャ内にデータを一時的に格納する方法はありますか。

私のミスの任意のヘルプや批判/ 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; 
/

答えて

3

create global temporary table gtt_panel_status 
(column datatype ...) 
on commit [delete|preserve] rows; 

on commit句でdeletepreserveのいずれかを指定する)として、あなたはあなたの一時テーブルを作成することができます。あなたは通常、一時テーブルを必要としないしかし

with句(CTE)を試してみるか、またはselect x, y, z from (select your subquery here)の行に沿ってインラインビューを試してみてください。

編集:実際にいくつかのより多くのクエリを見て、私はあなた実際に必要なものだと思うが、分析sum、集約せずに、すなわち合計です。たとえば、次のようなものです:

create or replace procedure panel_status_procedure 
    (panel_lot_id in number) 
as 
begin 
    -- 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 
      flex_lot_id 
     , flex_panel_dmx 
     , case sum(flex_panel_status) over (partition by flex_lot_id, flex_panel_dmx) 
       when 4 then 1 
       else 0 
      end 
     , machine_id 
     , upload_time 
    from flex_panel_inspections pi 
    where pi.flex_lot_id = panel_lot_id; 

end panel_status_procedure; 
+0

ありがとう、これは私の質問に答えます。どの時点でコミット節が行を削除しますか? –

+1

テーブルが 'コミット削除行'として定義されている場合、データはコミットによってクリアされます。すなわち、それはトランザクションの期間だけ持続する。それが 'on delete preserve rows'の場合、それはセッションの持続時間の間続きます。 –

+0

あなたの編集 - 私はあなたがコードのポイントを誤解していると思う - 私はブールのパスまたは失敗(1または0)をもたらすパネルのいくつかの検査を持っています。すべての検査が値1で合格した場合にのみ、パネルのステータスに値1が割り当てられます。それ以外の場合はステータスに値0が割り当てられます。したがって、コードブロックにcase文が必要です:) –

関連する問題