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;

其中 przelozony 和 pensja 是 pracownik 表中的列。

而且我有一个问题,当使用提供标有“(1)”的行的参数运行程序时(标有“(4)”的行也有同样的问题)应该执行更新语句没有任何效果。标有“(2)”和“(3)”的行中的更多语句可以正常工作。

我不知道如何解决它。预先感谢您的帮助。

4

2 回答 2

1

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

select przelozony into tmpPrzel from pracownik where id = PRAC_ID;

语句 (4) 永远不会被执行。同样,如果这返回 null

select pensja into tmpPensja from pracownik where id = PR_PRZELOZONY;

语句 (1) 永远不会被执行。要检查这一点,您需要在代码中添加一些跟踪语句,或者通过调试器运行它。

将跟踪放入程序的最快方法是使用 DBMS_OUTPUT.PUT_LINE 并在 SQL*Plus 等客户端(或使用 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 );
    ...

等等

所有最流行的 PL/SQL IDE - Ouest TOAD、Allround Automation PL/SQL Developer 和 Oracle SQL Developer 都提供调试功能。您可以在 OTN 上的此处找到在 SQL Developer 中进行调试的说明。

于 2010-05-20T22:41:10.677 回答
0

使用外部表名和列名很难阅读代码,所以我希望我做对了(无意冒犯) - 但请务必仔细查看。

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


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

UPDATE pracownik
SET pensja = LEAST( pensja-150, 1000 )
WHERE id = ( SELECT przelozony FROM pracownik where id = 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;

更新pracownikif PR_PRZELOZONY > 0,增加pensja15但不超过5000

IF(PR_PRZELOZONY > 0) THEN 
    UPDATE pracownik
    SET pensja = GREATEST( pensja + 150, 5000 )
    WHERE id = pr_przelozony;
END IF;
于 2010-05-20T20:57:26.137 回答