[英]Procedure for generating monthly business report
我正在嘗試編寫一個生成月度業務報告的程序。 我需要顯示當月有商業租賃的商業租賃總數和CarRentalSites。 應該顯示僅有幾個月的商業租賃,並且月份的順序應該從最早到最晚,CarRentalSites的順序應該是CarRentalSiteName屬性。
我寫了以下內容來做到這一點
create or replace procedure MonthlyBusinessRentalsReport as
CURSOR d_cursor is
Select Extract(year from Rentals.RentalDate) as oYear, Extract(month from Rentals.RentalDate) as oMonth, Count(*) as t
from Rentals where Rentals.Status = 'BUSINESS'
Group By Extract(year from Rentals.RentalDate), Extract(month from Rentals.RentalDate)
Order By Extract(year from Rentals.RentalDate), Extract(month from Rentals.RentalDate);
d_res d_cursor%ROWTYPE;
CURSOR d_retail is
Select Extract(year from Rentals.RentalDate) as oYear, Extract(month from Rentals.RentalDate) as oMonth, CarRentalSite.CarRentalSiteName, numOfDays
from Rentals INNER JOIN CarRentalSite on Rentals.CarRentalSiteId=CarRentalSite.CarRentalSiteId where Rentals.Status='BUSINESS'
Group By Extract(year from Rentals.RentalDate), Extract(month from Rentals.RentalDate), CarRentalSite.CarRentalSiteName, numOfDays
Order By Extract(year from Rentals.RentalDate), Extract(month from Rentals.RentalDate), CarRentalSite.CarRentalSiteName, numOfDays;
d_res2 d_retail%ROWTYPE;
BEGIN
OPEN d_retail;
Fetch d_retail into d_res2;
for d_res in d_cursor loop
dbms_output.put_line('Total Business Rentals in ' || d_res.oYear || '-' || d_res.oMonth || ': ' || d_res.t);
dbms_output.put_line('In Car Rental Sites:');
loop
dbms_output.put_line('- ' || d_res2.CarRentalSiteName || ': ' || d_res2.numOfDays || ' days');
Fetch d_retail into d_res2;
exit when d_retail%NOTFOUND or d_res2.oYear != d_res.oYear or d_res2.oMonth != d_res.oMonth;
end loop;
end loop;
Close d_retail;
END MonthlyBusinessRentalsReport;
/
show errors;
BEGIN
MonthlyBusinessRentalsReport;
End;
/
它給了我一個輸出,但不是預期我需要幫助修復它。 我的輸出與預期是這個
---- Result of Procedure 2:
Total Business Rentals in 2018-1: 2
In Car Rental Sites:
- Hertz: 15 days
Expected:
Total Business Rentals in 2018-1: 2
In Car Rental Sites:
- Hertz: 36 days
---- Result of Procedure 2:
- Hertz: 21 days
Total Business Rentals in 2018-2: 2
In Car Rental Sites:
- Alamo: 10 days
Expected:
Total Business Rentals in 2018-2: 2
In Car Rental Sites:
- Alamo: 10 days
- Hertz: 14 days
---- Result of Procedure 2:
- Hertz: 14 days
Total Business Rentals in 2018-4: 1
In Car Rental Sites:
Expected:
Total Business Rentals in 2018-4: 1
In Car Rental Sites:
- Enterprise: 2 days
---- Result of Procedure 2:
- Enterprise: 2 days
Total Business Rentals in 2018-5: 3
In Car Rental Sites:
- Avis: 2 days
- Budget: 3 days
Expected:
Total Business Rentals in 2018-5: 3
In Car Rental Sites:
- Avis: 2 days
- Budget: 3 days
- Hertz: 25 days
---- Result of Procedure 2:
- Hertz: 25 days
Total Business Rentals in 2018-6: 1
In Car Rental Sites:
Expected:
Total Business Rentals in 2018-6: 1
In Car Rental Sites:
- Alamo: 10 days
這些是要使用的表和數據文件
在我看來,問題是你對fetch循環的手動控制意味着你正在丟失數據。 讓Oracle控制它更簡單,更安全:
create or replace procedure MonthlyBusinessRentalsReport as
BEGIN
for d_res in
(Select Extract(year from Rentals.RentalDate) as oYear
, Extract(month from Rentals.RentalDate) as oMonth
, Count(*) as t
from Rentals
where Rentals.Status = 'BUSINESS'
Group By Extract(year from Rentals.RentalDate), Extract(month from Rentals.RentalDate)
Order By Extract(year from Rentals.RentalDate), Extract(month from Rentals.RentalDate)
)
loop
dbms_output.put_line('Total Business Rentals in ' || d_res.oYear || '-' || d_res.oMonth || ': ' || d_res.t);
dbms_output.put_line('In Car Rental Sites:');
for d_res2 in (
Select CarRentalSite.CarRentalSiteName
, sum(numOfDays) as numOfDays
from Rentals
INNER JOIN CarRentalSite on Rentals.CarRentalSiteId=CarRentalSite.CarRentalSiteId
where Rentals.Status='BUSINESS'
and Extract(year from Rentals.RentalDate) = d_res.oYear
and Extract(month from Rentals.RentalDate) = d_res.oMonth
group by CarRentalSite.CarRentalSiteName
Order By CarRentalSite.CarRentalSiteName
)
loop
dbms_output.put_line('- ' || d_res2.CarRentalSiteName || ': ' || d_res2.numOfDays || ' days');
end loop;
end loop;
END MonthlyBusinessRentalsReport;
/
關於你的代碼有些事我會做不同的事情,但我試圖只改變那些負責產生錯誤結果的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.