我正在编写一个简单的过程,它应该在表中插入一行,然后使用相同的外键更新所有其他行。我的问题是什么时候有其他声明。 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;
为什么会这样?
另外 - 为了回滚,我是否必须提出此错误,否则当代码到达其他时间时,这将自动完成?提前谢谢。
答案 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;