create or replace procedure ueberweisen     -- lege Prozedur an
( x int,                                    -- Konto-Nr. zum Belasten
  y int,                                    -- Konto-Nr. fuer Gutschrift
  betrag int)                               -- Ueberweisungsbetrag
IS
s konto.stand%TYPE;                         -- lokale Variable vom Typ konto.stand
begin
  SELECT stand INTO s FROM konto            -- hole Kontostand nach s
  WHERE nr = x FOR UPDATE OF stand;         -- von Konto-Nr. x und sperre Konto
  IF s < betrag THEN                        -- falls Konto ueberzogen wuerde
    INSERT INTO abgelehnt                   -- notiere den Fehlschlag
    VALUES (SYSDATE, x, y, betrag);         -- in der Tabelle abgelehnt
  ELSE
    UPDATE konto                            -- setze in der Tabelle konto
    SET stand = stand-betrag WHERE nr = x;  -- neuen Kontostand bei Konto x ein
    UPDATE konto                            -- setze in der Tabelle konto
    SET stand = stand+betrag WHERE nr = y;  -- neuen Kontostand bei Konto y ein
    INSERT INTO gebucht                     -- notiere die Ueberweisung
    VALUES (SYSDATE, x, y, betrag);         -- in der Tabelle gebucht
  END IF;
  COMMIT;
end;