Oracle数据库中存储过程中的UPDATE语句出现问题

Oracle数据库中存储过程中的UPDATE语句出现问题,oracle,stored-procedures,plsql,procedure,Oracle,Stored Procedures,Plsql,Procedure,我在Oracle数据库中有如下存储过程: 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;

我在Oracle数据库中有如下存储过程:

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;
创建或替换
程序EDYTUJ_PRACOWNIKA
(VARCHAR2的普雷米,VARCHAR2的普雷纳兹维斯科,浮动的普雷彭斯卡,
编号为PRZELOZONY,编号为PR_ODDZIAL,编号为PRAC_ID)
作为
tmpPensja浮点:=0;
tmpPrzel编号:=0;
开始
从pracownik中将przelozony选择为tmpPrzel,其中id=PRAC_id;
如果(tmpPrzel不为NULL),则
从pracownik中选择pensja进入tmpPensja,其中id=tmpPrzel;
如果(tmpPensja<1150),则
更新PRACOWNIK集合pensja=1000,其中id=tmpPrzel;
其他的
更新PRACOWNIK集合pensja=pensja-150,其中id=tmpPrzel;(4)
如果结束;
如果结束;
如果(PR_PRZELOZONY>0),则
更新PRACOWNIK集合imie=PR_imie,nazwisko=PR_-nazwisko,pensja=PR_-pensja,przelozony=PR_-przelozony,
oddzial=PR_oddzial,其中id=PRAC_id;(2)
从pracownik选择pensja进入tmpPensja,其中id=PR_PRZELOZONY;
如果(tmpPensja>4850),则
更新PRACOWNIK集合pensja=5000,其中id=PR_PRZELOZONY;
其他的
更新PRACOWNIK集合pensja=pensja+150,其中id=PR_PRZELOZONY;(1)
如果结束;
其他的
更新PRACOWNIK SET imie=PR_imie,nazwisko=PR_-nazwisko,pensja=PR_-pensja,przelozony=NULL,
oddzial=PR_oddzial,其中ID=PRAC_ID;(3)
如果结束;
结束;
其中,przelozony和pensja是pracownik表中的列

我的问题是,当运行带有参数的过程时,应该执行标记为“(1)”的行(标记为“(4)”的行也有同样的问题),update语句没有任何效果。更重要的是,在标有“(2)”和“(3)”的行中的语句可以正常工作


我不知道如何修理它。提前感谢您的帮助。

很难阅读带有外来表名和列名的代码,因此我希望我的理解正确(无意冒犯)-但请务必仔细阅读

就我对代码的理解而言,您应该能够删除临时变量,并在随后的三条update语句中完成所有操作(更新不同的行)。我不知道到底是什么不起作用,但如果之后仍然不起作用,请尝试手动执行单个SQL语句并检查结果


更新
pracownik
,将pensja减少
150
,但不低于
1000
,其中id=przelozony(prac_id)

更新
pracownik
,设置一些值,并
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;
更新
pracownik
如果
PR_PRZELOZONY>0
,则将
pensja
增加
15
,但不得超过
5000

IF(PR_PRZELOZONY > 0) THEN 
    UPDATE pracownik
    SET pensja = GREATEST( pensja + 150, 5000 )
    WHERE id = pr_przelozony;
END IF;

几乎可以肯定的是,你认为你拥有的价值观并不是你实际拥有的价值观。例如,如果此语句返回NULL

select przelozony into tmpPrzel from pracownik where id = PRAC_ID;
语句(4)将永远不会执行。同样,如果返回空值

select pensja into tmpPensja from pracownik where id = PR_PRZELOZONY;
语句(1)将永远不会执行。要检查这一点,您需要在代码中放入一些跟踪语句,或者通过调试器运行它

将跟踪放入程序的最快方法是使用DBMS_OUTPUT.PUT_行,并在SQL*Plus之类的客户机中运行存储过程(或使用IDE)

等等

所有最流行的PL/SQL IDE—最常见的TOAD、全能自动化PL/SQL开发人员和Oracle SQL开发人员都提供调试。您可以在SQL Developer中找到调试说明

select pensja into tmpPensja from pracownik where id = PR_PRZELOZONY;
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 );
    ...