Oracle中的存储过程包含Case和When

时间:2012-09-11 09:53:04

标签: stored-procedures oracle11g

我有一个场景,我有5个不同的表:

Table 1 - Product, Columns - ProductId, BatchNummer, Status, GroupId, OrderNummer

Table 2 - ProductGrop, Columns - GropId, ProductType, Description

Table 3 - Electronics, Columns - EId, Description, BatchNummer, OrderNummer, OrderData

Table 4 - Manual, Columns - MId, Description, Status, OrderNummer, ProcessStep

Table 5 - ProcessedProduct, columns same as Product with one extra column of datetime

现在,根据业务流程,我需要填充Product表中的所有数据,并且必须检查基础表(Electronics或Manual,它取决于ProductGoup的ProductType列)是否具有ordernuumer值,然后插入记录在表5“ProcessedProduct”中,否则跳过记录。

对于此要求,我想创建一个过程。但我仍然坚持如何检查哪些基础表(电子/手册)我必须参考以及如何实现。

此外,我应该如何编写用于插入记录的循环。

注意:我无法更改表架构。

1 个答案:

答案 0 :(得分:0)

使用PL / SQL程序,您只需在LOOP内切换,但如果只需要检查OrderNummer是电子版还是手册,则不需要必要的算法。

假设详细信息表由ProductType值选择“电子”或“手册”,您可以:

INSERT INTO ProcessedProduct (ProductId, BatchNummer, Status, GroupId, OrderNummer, TS)
SELECT ProductId, BatchNummer, Status, GroupId, OrderNummer, SYSDATE
FROM Product p 
INNER JOIN ProductGroup pg USING (GroupId)
WHERE EXISTS (
  SELECT NULL FROM Electronics e
  WHERE p.OrderNummer = e.OrderNummer
  AND pg.ProductType = 'Electronics'
  UNION
  SELECT NULL FROM Manuals m
  WHERE m.OrderNummer = m.OrderNummer 
  AND pg.ProductType = 'Manuals')

纯SQL始终是最快的方式,“WHERE EXISTS”通常是最快的条件。