Problema con istruzione UPDATE in immagazzinata-procedure in Oracle Database
-
04-10-2019 - |
Domanda
ho immagazzinato-procedure nel database Oracle in questo modo:
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;
dove przelozony e pensja sono colonne nella tabella Pracownik.
E ho problema che durante l'esecuzione di procedure con parametri che forniscono quella linea contrassegnati con "(1)" (c'è lo stesso problema con la linea contrassegnata con "(4)") dovrebbe essere eseguito questa affermazione aggiornamento non hanno alcun effetto. Cosa c'è di più istruzioni in linee contrassegnate con "(2)" e "(3)" funziona bene.
Non ho idee su come risolvere il problema. Grazie in anticipo per il vostro aiuto.
Soluzione
E 'difficile leggere il codice con i nomi di tabella estera e di colonna, quindi spero ho capito bene (senza offesa) -. Assicurarsi di leggere attentamente anche se
Per quanto ho capito il tuo codice, si dovrebbe essere in grado di rimuovere le variabili temporanee e fare tutto in tre successive istruzioni di aggiornamento (aggiornamento righe diverse). Non so che cosa non fa esattamente il lavoro, ma se non lo fa ancora lavoro dopo, provo ad eseguire le istruzioni SQL singoli manualmente e controllare i risultati.
Aggiornamento pracownik
, ridurre pensja da 150
ma non al di sotto 1000
dove id = przelozony (prac_id)
UPDATE pracownik
SET pensja = LEAST( pensja-150, 1000 )
WHERE id = ( SELECT przelozony FROM pracownik where id = PRAC_ID );
Aggiornamento pracownik
, impostare alcuni valori, e przelozony
.
UPDATE pracownik
SET imie = PR_IMIE,
nazwisko = PR_NAZWISKO,
pensja = PR_PENSJA,
przelozony = CASE WHEN PR_PRZELOZONY > 0 THEN PR_PRZELOZONY ELSE NULL END,
oddzial = PR_ODDZIAL
WHERE id = PRAC_ID;
Aggiornamento pracownik
se PR_PRZELOZONY > 0
, aumento pensja
da 15
, ma non al di sopra 5000
.
IF(PR_PRZELOZONY > 0) THEN
UPDATE pracownik
SET pensja = GREATEST( pensja + 150, 5000 )
WHERE id = pr_przelozony;
END IF;
Altri suggerimenti
Quasi certamente i valori si pensa di avere non sono i valori che effettivamente hanno. Per esempio, se questa dichiarazione restituisce un NULL
select przelozony into tmpPrzel from pracownik where id = PRAC_ID;
economico (4) non verrà mai eseguita. Allo stesso modo, se questo restituisce un null
select pensja into tmpPensja from pracownik where id = PR_PRZELOZONY;
dichiarazione (1) non verrà mai eseguita. Per controllare questo è necessario mettere un po 'istruzioni trace nel codice, o eseguirlo tramite un debugger.
Il modo più veloce di mettere traccia in un programma è quello di utilizzare DBMS_OUTPUT.PUT_LINE ed eseguire la stored procedure in un client come SQL * Plus (o usare un IDE).
select przelozony into tmpPrzel from pracownik where id = PRAC_ID;
dbms_output.put_line('PRAC_ID ='|| PRAC_ID ||':: tmpPrze='|| tmpPrze );
IF(tmpPrzel IS NOT NULL) THEN
select pensja into tmpPensja from pracownik where id = tmpPrzel;
dbms_output.put_line('tmpPrzel IS NOT NULL:: tmpPensja='|| tmpPensja );
...
ecc.
Tutti i più popolari IDE PL / SQL - Ouest ROSPO, Allround Automazione PL / SQL Developer e Oracle SQL Developer offerta di debug. È possibile trovare le istruzioni per il debug in SQL Developer qui su OTN .