Problem mit UPDATE-Anweisung in der gespeicherten Prozedur in Oracle-Datenbank
Habe ich gespeichert-Prozedur in einer Oracle-Datenbank wie diese:
create or replace
PROCEDURE EDYTUJ_PRACOWNIKA
(PR_IMIE IN VARCHAR2, PR_NAZWISKO IN VARCHAR2, PR_PENSJA IN FLOAT,
PR_PRZELOZONY IN NUMBER, PR_ODDZIAL IN NUMBER, PRAC_ID IN NUMBER)
AS
tmpPensja FLOAT := 0;
tmpPrzel NUMBER := 0;
BEGIN
select przelozony into tmpPrzel from pracownik where id = PRAC_ID;
IF(tmpPrzel IS NOT NULL) THEN
select pensja into tmpPensja from pracownik where id = tmpPrzel;
IF(tmpPensja < 1150) THEN
UPDATE PRACOWNIK SET pensja = 1000 WHERE id = tmpPrzel;
ELSE
UPDATE PRACOWNIK SET pensja = pensja - 150 WHERE id = tmpPrzel; (4)
END IF;
END IF;
IF(PR_PRZELOZONY > 0) THEN
UPDATE PRACOWNIK SET imie = PR_IMIE, nazwisko = PR_NAZWISKO, pensja = PR_PENSJA, przelozony = PR_PRZELOZONY,
oddzial = PR_ODDZIAL WHERE id = PRAC_ID; (2)
select pensja into tmpPensja from pracownik where id = PR_PRZELOZONY;
IF(tmpPensja > 4850) THEN
UPDATE PRACOWNIK SET pensja = 5000 WHERE id = PR_PRZELOZONY;
ELSE
UPDATE PRACOWNIK SET pensja = pensja + 150 WHERE id = PR_PRZELOZONY; (1)
END IF;
ELSE
UPDATE PRACOWNIK SET imie = PR_IMIE, nazwisko = PR_NAZWISKO, pensja = PR_PENSJA, przelozony = NULL,
oddzial = PR_ODDZIAL WHERE ID = PRAC_ID; (3)
END IF;
END;
wo przelozony und pensja sind Spalten in pracownik Tabelle.
Und ich habe ein problem, dass bei der Ausführung Prozedur mit Parametern, die vorsehen, dass die Linie, markiert mit "(1)" (es ist das gleiche problem mit der Zeile, gekennzeichnet mit "(4)") ausgeführt werden soll, dass der update-Anweisung haben keine Wirkung. Was mehr Anweisungen in den Zeilen, markiert mit "(2)" und "(3)" funktioniert einwandfrei.
Habe ich keine Ideen wie man es beheben. Vielen Dank im Voraus für Eure Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist schwer zu Lesen code, mit fremden Tabellen-und Spaltennamen, also ich hoffe ich habe es richtig gemacht (nichts für ungut) - achten Sie darauf, überprüfen Sie sorgfältig, though.
Soweit ich das verstanden habe den code, Sie sollten in der Lage sein entfernen Sie temporäre Variablen und alles tun, was in drei aufeinander folgenden update-Anweisungen (Update mehrere Zeilen). Ich weiß nicht, was genau funktioniert nicht, aber wenn es funktioniert immer noch nicht nach, versuchen Sie, die Ausführung der einzelnen SQL-Anweisungen manuell ein, und überprüfen Sie die Ergebnisse.
Update
pracownik
reduzieren pensja von150
aber nicht unter1000
where id = przelozony (prac_id)Update
pracownik
, einige Werte, und dieprzelozony
.Update
pracownik
wennPR_PRZELOZONY > 0
erhöhenpensja
durch15
, aber nicht über5000
.Fast sicher die Werte, die Sie denken, Sie haben nicht die Werte, die Sie tatsächlich haben. Zum Beispiel, wenn diese Anweisung gibt den Wert NULL
Anweisung (4) wird niemals ausgeführt. Ebenso, wenn diese eine null zurück
Anweisung (1) wird niemals ausgeführt. Um dies zu überprüfen, müssen Sie einige trace-Anweisungen im code, oder führen Sie es durch einen debugger.
Die Schnellste Art und Weise des Stellens von trace in einem Programm zu verwenden DBMS_OUTPUT.PUT_LINE und führen Sie die gespeicherte Prozedur in einem client wie SQL*Plus (oder verwenden Sie eine IDE).
etc.
Alle der beliebtesten PL/SQL IDEs - Ouest KRÖTE, Allround Automations PL/SQL Developer und Oracle SQL-Developer bieten Debuggen. Sie finden Anweisungen für die Fehlersuche in SQL-Developer hier auf OTN.