Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 2
  • 103

Zdefiniowano tabelę Produkt:

CREATE TABLE Produkt (Produkt_id number, Cena number, Ilosc number)

parallel 2

partition by range(Produkt_id)

(

partition p1 values less than (10),

partition p2 values less than (20),

partition p3 values less than (MAXVALUE)

);
Następnie dodano kilka wierszy

INSERT INTO Produkt VALUES (5, 100, 10);

INSERT INTO Produkt VALUES (10, 200, 10);

INSERT INTO Produkt VALUES (15, 300, 10);

INSERT INTO Produkt VALUES (20, 400, 10);

COMMIT;

Zadanie polega na zwiększeniu ceny o 10%, ale tylko w przypadku, gdy wartość wszystkich produktów po podwyżce nie przekroczy 1 mln.

Przykładowe rozwiązanie:

DECLARE

   Wartość number;

BEGIN

   UPDATE Produkt SET Cena = Cena * 1.10;

   SELECT SUM(Cena*Ilość) INTO Wartość FROM Produkt;

   If Wartość > 1000000 then

      ROLLBACK;

   ELSE

      COMMIT;

   END IF;

END;

/

może zakończyć się błędem "ORA - 12838: cannot read/modify an object after modifying it in parallel." Dlaczego? I od czego to zależy?

 

 

  • Zapytał
  • @ | 11.03.2015
  • TRENER ALTKOM AKADEMII

Odpowiedź (1)

  • 3

Oracle nie pozwala na odczyt danych nie zatwierdzonych, jeżeli operacja była wykonana równolegle. Jeżeli zabronimy wykonywania operacji równoległych:

ALTER SESSION DISABLE PARALLEL dml;

to powyższy kod zakończy się sukcesem.

Przy włączonej równoległości:

ALTER SESSION ENABLE PARALLEL dml;

pojawi się błąd ORA-12838 przy wykonywaniu instrukcji SELECT SUM(Cena*Ilosc) INTO Wartość FROM Produkt.

 

Konieczne jest zatwierdzenie/wycofanie transakcji przed odczytem danych. Należy więc przebudować warunek sprawdzania wartości.

 

 

  • Odpowiedział
  • @ | 11.03.2015
  • TRENER ALTKOM AKADEMII