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.

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top