2014-02-22 52 views
0

我在我的數據庫3個表:這個PL/SQL塊代碼有什麼問題?

manufacturer: IDm int primary key, manufacturerName varchar.

car: IDc int primary key, manufacturer foreign key references manufacturer(IDm).

rent: IDr int primary key, car foreign key references car(IDc).

我想創建一個打印出每個製造商的程序:被製造的汽車的數量製造商以及製造商製造的租賃車輛的數量。

這是我的代碼:

create or replace procedure Q8 as 
cursor c is select distinct manufacturername, IDm from manufacturer; 
cursor c2 is select * from car; 
rents int:=0; 
cars int; 
allrents int; 
p1 number(38,2); 
p2 number(38, 2); 
id int; 
begin 
    select count(IDr) into allrents from rent; 
    dbms_output.put_line('manufacturer cars rented cars % rents %'); 
    for k in c loop 
    select count(IDc) into cars from car c where c.manufacturer=k.IDm; 
    for k2 in c2 loop 
     select IDc into id from car where car.manufacturer=k.IDm; 
     select count(car) into rents from rent r where r.car=id; 
    end loop; 
    p1:=(rents/cars)*100; 
    p2:=(rents/allrents)*100; 
    dbms_output.put_line(k.manufacturerName||' '||cars||' '||p1||' '||p2); 
    end loop; 
end; 

所以,這裏是我的代碼錯了嗎?

+1

你這是什麼是什麼意思?它是否運行,但給出錯誤的結果?你有錯誤信息嗎? – Sparky

+0

@Sparky,是的,我得到了這個結果'ORA-01403:找不到數據。 –

+2

那麼,錯誤信息不能更具體。您的「select into」語句之一是沒有返回任何數據。逐句通過調試器中的代碼,或打印出約束值。 – OldProgrammer

回答

2

你真的不需要光標來實現這一

select manufacturername, IDm, count(cars.IDC) as CarsMade, 
           count(rent.car) as Rental, 
           count(rent.car)/count(cars.IDC) as p1, 
           count(rent.car)/xx.Tot as p2 
from manufacturer m 
join cars on cars.manufacturer=m.IDm; 
join rent on rent.car=car.id 
join (select count(*) as Tot from Rent) xx 

看看是否能查詢爲您提供您正在尋找的東西,它會運行速度遠比嵌套的遊標

+0

我想通過使用遊標,它的學習目的。 –

+0

@ user3194430,您仍然可以將光標移出此答案。 – Ronnis

0

聽OldProgrammer - 在第二個循環之前放置一個if。
如果cars!= 0,則執行第二個循環
其他租金也將爲0,並將其設置爲如此。
你也將不得不改變你的P1語句(0/0)* 100將零點錯誤
P2也將和(0/allrents)拋出一個鴻溝* 100將始終爲0