procedura w pl/sql

0

Mam zadanie domowe:

W tabeli ORD w kolumnie TOTAL przechowywana jest całkowita wartość
zamówienia, powinna być ona równa sumie wszystkich zamówionych produktów
przechowywanych w tabeli ITEM (price*quantity) dla konkretnego zamówienia.
Napisz procedurę ORD_ITEM_CHECK, która będzie sprawdzała czy dane w obu
tabelach są równe. Jeśli wartości dla zamówienia będą się różniły, proszę wyświetlić
nr zamówienia, wartość zamówienia z tabeli ORD, wartości price * quantity dla
danego zamówienia oraz SUME dla danego zamówienia z tabeli ITEM. Proszę także
wyświetlić różnicę wartości z obydwu tabel

napisalem cos takiego, ale nie dziala. :( Gdzie mam blad i jak to naprawic ?

create or replace procedure ord_item_check is
cursor i_price is select price from item;
cursor i_quantity is select quantity from item;
cursor o_total is select total from ord;
uv_ilosc number;
uv_total o_total%ROWTYPE;
begin
open i_price;
open i_quantity;
loop 
fetch i_price*i_quantity into uv_ilosc; 
EXIT WHEN i_price%NOTFOUND;
EXIT WHEN i_quantity%NOTFOUND;
loop 
open o_total
fetch o_total into uv_total;
when uv_total!=uv_ilosc
DBMS_OUTPUT.PUT_LINE('rozne');
DBMS_OUTPUT.PUT_LINE('rozne');
end loop;
close o_total;
end loop;
close i_price;
close i_quantity;
end;
0

znaczy jak będą różne to gdzie się to ma wyświetlić? SP w oracle dopiero od wersji 10 może zwracać coś na kształt tabeli.

ten sql powinien Ci zwrócić wszystkie zamówienia, gdzie jest różnica

SELECT 
  o.id,
  MAX(o.total), 
  SUM(i.price * quantity) tot
FROM
  ord o,
  item i
WHERE
  o.id = i.id
GROUP BY
  o.id
HAVING
  MAX(o.total) <> SUM(i.price * quantity)
0

Hmm tylko ze to ma byc procedura ... a jesli wpisze to w 'cialo' procedury, to tez zadziala ?

0

Przepraszam za poprzednie glupie pytanie :P

Napisalem cos takiego - jednak nie wykonuje sie, a ja juz nie mam pojecia, gdzie szukac bledu :(

0

create or replace procedure ORD_ITEM_CHECK is
cursor c_ord is
select total from ord;
cursor c_item_p is
select price from item;
cursor c_item_q is
select quantity from item;

uv_total c_ord%rowtype;
uv_priceItem c_item_p%rowtype;
begin
open c_ord;
open c_item_p;
open c_item_q;
loop
fetch c_ord into uv_total;
fetch c_item_p*c_item_q into uv_priceItem;
if uv_price_item <> uv_total then
end loop;
close c_ord;
close c_item_p;
close c_item_q;
end;

0

po 1- co nie działa? chcesz, żeby wyświetlało dane? w którym miejscu Twoja procedura wyświetla dane? nie pisz, że masz błąd, tylko że nie wiesz jak się za to zabrać.

po 2-
Jeśli wartości dla zamówienia będą się różniły, proszę wyświetlić
nr zamówienia, wartość zamówienia z tabeli ORD, wartości price * quantity dla
danego zamówienia oraz SUME dla danego zamówienia z tabeli ITEM. Proszę także
wyświetlić różnicę wartości z obydwu tabel

na moje:
albo robiusz zapytanie grupujące ktore zwroci Ci wszystkie bledne zamowienia i dane o nich:
select tabela1.id,.... from tabela1, tabela2
group by tabela1.id
having tabela1.total<>sum(tabela2)

albo kursor po wszystkich zamowieniach, i dla każdego zamówienia w pętli zliczasz pozycje dla danego zamowienia
FOR R1 IN C1 LOOP
select sum(..) into suma_pozycji from ..
if(suma_pozycji<>R1.total) then
dbms_output.putline('blabla');
end if;
end loop;

1 użytkowników online, w tym zalogowanych: 0, gości: 1