Cześć wszystkim!
Napisałem procedurę w T-SQL i chcę ją przenieść na mój identyczny projekt w Oracle PL/SQL.
Tutaj kod T-SQL
ALTER PROCEDURE ObnizkaDla @kategoria_wybor Varchar(20)
AS
DECLARE Kursor_2 CURSOR FOR SELECT ID, Produkt_Nazwa, Cena, Kategoria_ID FROM Produkt
DECLARE @dane_id Int, @nazwa_produktu Varchar(20), @cena Int, @kategoria_id Int
DECLARE @id_kategorii_wybor Int = (SELECT ID FROM Kategoria Where Kategoria_Nazwa = @kategoria_wybor), @srednia_cena Int
OPEN Kursor_2;
IF NOT EXISTS (SELECT Kategoria_Nazwa FROM Kategoria WHERE Kategoria_Nazwa = @kategoria_wybor)
PRINT 'Nie Ma tekiej Kategorii!'
ELSE
FETCH NEXT FROM Kursor_2 INTO @dane_id, @nazwa_produktu, @cena, @kategoria_id;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @srednia_cena = (SELECT AVG(Cena) FROM Produkt WHERE Kategoria_ID = @id_kategorii_wybor)
IF @cena > @srednia_cena AND @kategoria_id LIKE @id_kategorii_wybor
BEGIN
SET @cena = @cena - (@cena * 0.1);
UPDATE Produkt SET Cena = @cena WHERE ID = @dane_id;
PRINT @nazwa_produktu + ' kosztuje po obniżce ' + Cast(@cena As Varchar);
END;
FETCH NEXT FROM Kursor_2 INTO @dane_id, @nazwa_produktu, @cena, @kategoria_id;
END;
CLOSE Kursor_2;
DEALLOCATE Kursor_2;
Tutaj (myślę że?) identyczny tylko w formie dla PL/SQL (póki co nie sprawdza czy nazwa kategorii istnieje w bazie).
SET serveroutput ON
create or replace PROCEDURE ObnizkaDla(v_kategoria_wybor VARCHAR)
IS
v_dane_id Int; v_nazwa_produktu Varchar(20); v_cena Int; v_kategoria_id Int;
CURSOR Kursor_2 IS SELECT ID, Produkt_Nazwa, Cena, Kategoria_ID FROM Produkt;
v_id_kategorii_wybor Int; v_srednia_cena Int;
BEGIN
SELECT ID INTO v_id_kategorii_wybor FROM Kategoria Where Kategoria_Nazwa = v_kategoria_wybor;
SELECT AVG(Cena) INTO v_srednia_cena FROM Produkt WHERE Kategoria_ID = v_id_kategorii_wybor;
OPEN Kursor_2;
loop
FETCH Kursor_2 INTO v_dane_id, v_nazwa_produktu, v_cena, v_kategoria_id;
exit WHEN Kursor_2%notfound;
IF (v_cena > v_srednia_cena AND v_kategoria_id = v_id_kategorii_wybor)
THEN
v_cena := v_cena - (v_cena * 0.1);
UPDATE Produkt SET Cena = v_cena WHERE Produkt.ID = v_dane_id;
dbms_output.put_line(v_nazwa_produktu || ' kosztuje po obnizce ' || v_cena);
END IF;
END loop;
CLOSE Kursor_2;
END;
Procedura przyjmuje jako parametr nazwę kategorii. Następnie sprawdza średnią cenę produktów z tej kategorii i daje 10% obniżki ceny dla produktów które kosztują powyżej średniej. W T-SQL działa elegancko, w PL/SQL nawet nie wyświetla komunikatów. Sqldeveloper nie zgłasza błędów, po wywołaniu CALL ObnizkaDla(v_kategoria_wybor => 'Buty'); wyświetla Call completed, lecz nic nie zmienia i nie wyświetla innego.
Ktoś wie czemu tak się dzieje?