2014-11-16 5 views
0

작은 전자 상거래를위한 데이터웨어 하우스를 설계하고 product 및 product_price_history의 두 테이블에서 제품에 대한 차원 테이블을 채워야합니다.Oracle - 다중 테이블에서 차원 테이블에 삽입하는 프로 시저 만들기

제품 (prod_id, 브랜드) product_price_history (prod_id, 가격, min_pirce, 시작일, 종료일) product_dim (prod_key, prod_id, 브랜드, 가격, min_pirce, 시작일 : 간단하게하기 위해의 각 테이블의 열은 다음과 같습니다 가정 해 봅시다 , end_date)

그리고 product_dimension 테이블에 대한 키를 생성하기 위해 prod_seq라는 시퀀스가 ​​이미 있습니다. 이것은 내가 지금까지 내 절차 가지고있는,하지만 난 점점 오류 ':

create or replace 
procedure populate_product_dimension AS 
BEGIN 
INSERT into product_dim (prod_key, prod_id, brand, price, min_pirce, start_date, end_date) 
SELECT seq_prod.nextval FROM DUAL 
SELECT prod_id, brand 
FROM product 
SELECT price, min_pirce, start_date, end_date 
FROM product_price_history 
WHERE prod_id.product_pric_history = prod_id.product & 
prod_id not in(select prod_id from product_dim); 
Commit; 
End populate_product_dimension; 

나는 문제가있을 수 있습니다 생각 때문에 내가 prod_key을 추가 해요 방법을. 어떤 사람이 이것을하는 더 좋은 방법을 알고 있습니까?

답변

1

SELECT 쿼리는 INSERT에 사용합니다. JOIN이어야하며 구문이 잘못되었습니다. 컬럼을 참조하는 동안 table_name/alias.column_name이어야합니다.

create or replace 
procedure populate_product_dimension AS 
BEGIN 
INSERT into product_dim (prod_key, prod_id, brand, price, min_pirce, start_date, end_date) 
SELECT 
     seq_prod.nextval, 
     p.prod_id, 
     p.brand, 
     ph.price, 
     ph.min_pirce, 
     ph.start_date, 
     ph.end_date 
FROM 
     product_price_history ph, 
     product p 
WHERE 
     ph.prod_id = p.prod_id 
    AND ph.prod_id not in(select prod_id from product_dim); 

Commit; 
End populate_product_dimension; 
+0

감사합니다. 그랬어! 이제 차원 테이블에 상태 열을 추가하고 product_history_table의 end_date가 설정되지 않으면 (null) Availble에 값을 채 웁니다. 사용 가능하지 않으면 사용할 수 없습니다. 위의 코드에서 가능합니까? – seemvision

+1

'NVL2 (ph.end_date, '사용 가능', '사용할 수 없음')'그럴 것입니다. –

+0

멋진! 감사. – seemvision