PL/SQL - procedura przepisana ręcznie z T-SQL nie działa.

0

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?

0

masakra - cztery zapytania i kursor do zrobienia czegoś co można jednym update załatwić.
I co ci mamy powiedzieć bez danych i ddla? Sprawdź poszczególne zapytania czy zwracają to co powinny

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