Хранимая процедура PL/SQL для заполнения таблицы фактов

Мне нужно заполнить эту таблицу фактов с помощью хранимой процедуры PL/SQL:

CREATE TABLE SALES_FACTS
(saleDay        DATE,
vehicleCode         INT,
planID          INT,
dealerID        INT,
vehiclesSold        INT,
grossSalesAmt   NUMBER(10),
CONSTRAINT SALE_DAY_FK FOREIGN KEY (saleDay) REFERENCES TIMES(saleDay) ON DELETE CASCADE,
CONSTRAINT VEHICLE_CODE_FK FOREIGN KEY (vehicleCode) REFERENCES VEHICLES(vehicleCode) ON DELETE CASCADE,
CONSTRAINT PLAN_ID_FK FOREIGN KEY (planID) REFERENCES FINANCING_PLANS(planID) ON DELETE CASCADE,
CONSTRAINT DEALER_FK FOREIGN KEY (dealerID) REFERENCES DEALERSHIPS(dealerID) ON DELETE CASCADE,
CONSTRAINT SALES_FACTS_PK PRIMARY KEY (saleDay, vehicleCode, planID, dealerID));

Меня попросили сделать это с помощью четырех вложенных циклов курсора, чтобы получить каждую возможную комбинацию первичных клавиш таблиц измерений, а также общее количество проданных автомобилей и общий объем продаж для каждой комбинации.

Кроме того, если значения для vehiclesSold а также grossSalesAmount равны нулю, то строка НЕ ДОЛЖНА быть вставлена ​​в SALES_FACTS Таблица.

Следует вставлять только строки для комбинаций четырех столбцов внешнего ключа, где было продано несколько автомобилей.

Я создал следующий код, который, как я надеялся, достиг бы этого:

CURSOR factData IS

SELECT vehicleVin,saleDate,sf.planID,sp.dealerID
    COUNT (*) AS vehiclesSold
    SUM (s.grossSalePrice) AS grossSalesAmount
FROM SALES s, SALES_FINANCINGS sf, SALESPERSONS sp
WHERE s.saleID = sf.saleID
AND s.salespersonID = sp.salespersonID
GROUP BY vehicleVIN, saleDate, sf.planID, sp.dealerID
HAVING COUNT(*) > 0;
BEGIN
FOR record IN factData
LOOP
    INSERT INTO SALES_FACTS (saleDay,vehicleCode,planID,dealerID,vehiclesSold, grossSalesAmount
    VALUES (record.saleDate,record.vehicleVin,record.planID,record.dealerID,record.vehiclesSold,record.grossSalesAmount);
END LOOP;
END;
/

Тем не менее код выполняется нормально, но я не получаю никаких результатов при запуске

SELECT COUNT(*) FROM SALES_FACTS;

Я создал ссылку SQL Fiddle здесь http://sqlfiddle.com/, так как код для таблиц и таблицы заполнены слишком много, чтобы оставлять сообщения по этому вопросу. Имейте в виду, что я только INSERTотредактировало около 2-3 строк данных для каждой таблицы, чтобы код был несколько коротким, однако вставленных данных должно хватить, чтобы это работало.

Пожалуйста, дайте мне знать, где я иду не так и как это лучше всего исправить! Заранее спасибо!

1 ответ

Решение

Это закончилось, делая трюк. Спасибо за всю помощь тем, кто прокомментировал.

DECLARE
CURSOR sales_data
IS
 SELECT vehicleVIN, saleDate, SF.planID, SP.dealerID, 
 COUNT(*) AS vehiclesSold, SUM(S.grossSalePrice) AS grossSalesAmt
 FROM SALES S, SALES_FINANCINGS SF, SALESPERSONS SP, VEHICLES V
 WHERE S.saleID = SF.saleID AND S.vehicleVIN = V.vehicleCode AND S.salespersonID = SP.salespersonID
 GROUP BY vehicleVIN, saleDate, SF.planID, SP.dealerID
 HAVING COUNT(*) > 0;

BEGIN
FOR record IN sales_data
LOOP
    INSERT INTO SALES_FACTS (saleDay,vehicleCode,planID,dealerID,vehiclesSold, grossSalesAmt)
    VALUES (record.saleDate,record.vehicleVIN,record.planID,record.dealerID,record.vehiclesSold,record.grossSalesAmt);
END LOOP;
END;
/
Другие вопросы по тегам