2012-09-11 2 views
2

가 나는 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 

이제 비즈니스의 흐름에 따라, 나는 제품 테이블의 모든 데이터를 채울 필요 ProductGoup의 ProductType 열에 의존하는 전자 또는 수동 테이블에 ordernuumer 값이 있는지 확인한 다음 테이블 5 "ProcessedProduct"에 레코드를 삽입하고 레코드를 건너 뜁니다.

이 요구 사항에 대해서는 절차를 만들고 싶습니다. 그러나 나는 어떤 기본 테이블 (전자/수동)을 참조해야하는지, 어떻게 달성 할 수 있는지를 확인하는 방법에 집착하고있다.

또한 레코드를 삽입하기 위해 루프를 작성해야합니다.

참고 : 테이블 스키마를 변경할 수 없습니다.

+0

우선 무엇을 게시 할 수 있습니까? –

답변

0

PL/SQL 프로 시저를 사용하면 LOOP 내에서 전환 만 할 수 있지만 OrderNummer가 Electronics 또는 Manual 중 하나인지 확인해야하는 경우 명령형 알고리즘이 필요하지 않습니다. 세부 테이블을 가정 할

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"일반적으로 가장 빠른 조건이 항상 가장 빠른 방법이며, .