PL / SQL等等其他错误

时间:2017-01-16 20:44:23

标签: oracle stored-procedures plsql exception-handling oracle12c

我正在编写一个简单的过程,它应该在表中插入一行,然后使用相同的外键更新所有其他行。我的问题是什么时候有其他声明。 SQL Developer给了我这个错误:

  

错误(26,3):PLS-00103:遇到符号" WHEN"什么时候期待   以下之一:(开始案例声明结束异常退出   goto if loop mod null pragma raise返回选择更新时使用         <<继续关闭当前删除获取锁定插入打开   rollback savepoint set sql execute commit forall merge pipe purge   符号"例外"取而代之的是" WHEN"继续。

我的程序如下:

CREATE OR REPLACE PROCEDURE INS_RETUR 
(
  P_BRDOKUMENTA IN RETUR.BrDokumenta%TYPE, 
  P_DATKREIRANJA IN RETUR.DatKreiranja%TYPE,
  P_DATSTAMPANJA IN RETUR.DatStampanja%TYPE,
  P_SIFRJ IN RETUR.SifRJ%TYPE,
  P_BRRADKNJIZ IN RETUR.BrRadKnjiz%TYPE,
  P_PRIJEMNIBR IN RETUR.PrijemniBr%TYPE,
  P_BRPORUDZBENICE IN RETUR.BrPorudzbenice%TYPE,

  P_REZULTAT OUT NUMBER
)
AS 
BEGIN
  P_REZULTAT := 0;
  P_PORUKA := 'Ok';

  INSERT INTO Retur
  VALUES (P_BRDOKUMENTA, P_DATKREIRANJA, P_DATSTAMPANJA, P_SIFRJ, P_BRRADKNJIZ, P_PRIJEMNIBR, P_BRPORUDZBENICE, 'A');

  UPDATE Retur
  SET Status = 'N'
  WHERE BrPorudzbenice = P_BRPORUDZBENICE
  AND BrDokumenta != P_BRDOKUMENTA;

  WHEN OTHERS THEN
    P_REZULTAT := 1;
    P_PORUKA := (-10001,'Doslo je do greske - '||SQLCODE||' -GRESKA- '||SQLERRM);
END INS_RETUR;

为什么会这样?

另外 - 为了回滚,我是否必须提出此错误,否则当代码到达其他时间时,这将自动完成?提前谢谢。

2 个答案:

答案 0 :(得分:3)

您错过了EXCEPTION

BEGIN
...
EXCEPTION
  WHEN OTHERS THEN
    P_REZULTAT := 1;
    ...
END;

在这种情况下,错误消息很有用:

  

错误(26,3):PLS-00103:在期待时遇到符号“WHEN”   以下之一:(开始案例声明结束异常退出goto   如果循环...

答案 1 :(得分:2)

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::p11_question_id:1155066278457

http://stevenfeuersteinonplsql.blogspot.com/2017/02/now-not-to-handle-exceptions.html

在这种情况下你根本不应该使用其他人 - 至少不是出于明显的目的。

这是多年来似乎已经流行的病毒行为。

pl / sql中可能发生的非数据相关错误太多,导致程序崩溃以防止参照完整性破坏。

CREATE OR REPLACE PROCEDURE INS_RETUR 
(
  P_BRDOKUMENTA IN RETUR.BrDokumenta%TYPE, 
  P_DATKREIRANJA IN RETUR.DatKreiranja%TYPE,
  P_DATSTAMPANJA IN RETUR.DatStampanja%TYPE,
  P_SIFRJ IN RETUR.SifRJ%TYPE,
  P_BRRADKNJIZ IN RETUR.BrRadKnjiz%TYPE,
  P_PRIJEMNIBR IN RETUR.PrijemniBr%TYPE,
  P_BRPORUDZBENICE IN RETUR.BrPorudzbenice%TYPE,

  P_REZULTAT OUT NUMBER
)
AS 
BEGIN
  P_REZULTAT := 0;
  P_PORUKA := 'Ok';

  INSERT INTO Retur
  VALUES (P_BRDOKUMENTA, P_DATKREIRANJA, P_DATSTAMPANJA, P_SIFRJ, P_BRRADKNJIZ, P_PRIJEMNIBR, P_BRPORUDZBENICE, 'A');

  IF SQL%ROWCOUNT <= 0 THEN
     [DO SOMETHING, MAYBE SOME MESSAGING, MAYBE SKIP THE UPDATE?]
  END IF;

  UPDATE Retur
  SET Status = 'N'
  WHERE BrPorudzbenice = P_BRPORUDZBENICE
  AND BrDokumenta != P_BRDOKUMENTA;

  IF SQL%ROWCOUNT <= 0 THEN
     [DO SOMETHING, MAYBE SOME MESSAGING]
  END IF;

EXCEPTION
  WHEN OTHERS THEN
    P_REZULTAT := 1;
    P_PORUKA := (-10001,'Doslo je do greske - '||SQLCODE||' -GRESKA- '||SQLERRM);
    DBMS_OUTPUT.PUT_LINE(FORMAT_ERROR_STACK);
    DBMS_OUTPUT.PUT_LINE(FORMAT_ERROR_BACKTRACE);
    RAISE;
END INS_RETUR;