![](/img/trans.png)
[英]Catch is not working in my Stored Procedure - What is wrong with my code?
[英]Stored Procedure (rookie programmer), What's wrong with my code?
我正在嘗試創建一個存儲過程,該過程將在給定費用報告編號ErepNo
和費用類別編號EXNo
更新BugIt
表中的相關行。
該過程必須包含 3 個輸入參數EXNo
、 ErepNo
和'rUpAm'
以及一個布爾輸出參數aRes
。
如果ErepStatus
等於“ Approved
”,則將存儲的值rUpAm
添加到BIAct
,輸出參數設置為TRUE
並更新行。
否則ErepStatus
等於 ' Denied
' 或 ' Pending
' 引發應用程序錯誤並且輸出參數設置為FALSE
。
這是我迄今為止嘗試過的
CREATE OR REPLACE PROCEDURE StoredProcedure1
(tEXNo IN BugIt.EXNo%TYPE,
tErepNo IN ER.ErepNo%TYPE,
rUpAm IN INTEGER,
aRes OUT BOOLEAN ) IS
FOUND BOOLEAN := False;
tErepStatus ER.ErepStatus%TYPE;
tBIAct BugIt.BIAct%TYPE;
CURSOR ERCur(TmpErepNo ExpI.ErepNo%TYPE)is
SELECT ExpI.EXNo, ER.ErepStatus
FROM ER, BugIt, ExpI
WHERE ER.ErepNo = tErepNo
AND BugIt.EXNo = ExpI.EXNo
AND ER.ErepNo = ExpI.ErepNo
ORDER BY ErepStatus DESC;
BEGIN
OPEN ERCur(tErepNo);
LOOP
FETCH ERCur INTO tErepStatus, tBIAct;
EXIT WHEN ERCur%NOTFOUND;
IF tErepStatus = 'APPROVED' THEN
FOUND := TRUE;
END IF;
IF tErepStatus = 'PENDING' OR tErepStatus = 'DENIED' THEN
FOUND := False;
EXIT;
END IF;
END LOOP;
CLOSE ERCur;
IF FOUND THEN
tBIAct := tBIAct + rUpAm;
aRes := TRUE;
UPDATE BugIt
Set BIAct = tBIAct
WHere EXNo = tEXNo;
ElSE
tBIAct := tBIAct;
aRes := False;
END IF;
EXCEPTION
WHEN OTHERS THEN aRes := False;
raise_application_error(-20001, 'Database error');
END;
/
這是我的測試用例來實現我擁有的代碼,它不斷出現錯誤(如下)
---test--
SET Serveroutput on;
SELECT ExpI.EXNo, ER.ErepStatus
FROM ER, BugIt, ExpI
WHERE ER.ErepNo = 21
AND BugIt.EXNo = ExpI.EXNo
AND BugIt.ErepNo = ExpI.ErepNo
ORDER BY ErepStatus DESC;
-- Test script
DECLARE
Result BOOLEAN;
aBIAct BugIt.BIAct%TYPE;
BEGIN
StoredProcedure1(2, 2, 3, Result);
IF Result then
dbms_output.put_line('updated element to the BugIt table');
ELSE
dbms_output.put_line('Row not updated to the BugIt table');
END IF;
END;
/
ERROR at line 1:
ORA-20001: Database error
ORA-06512: at "SYSTEM.SPROLLUPEXPITEM", line 51
ORA-06512: at line 6
我想你想要:
CREATE OR REPLACE PROCEDURE StoredProcedure1 (
tEXNo IN BugIt.EXNo%TYPE,
tErepNo IN ER.ErepNo%TYPE,
rUpAm IN INTEGER,
aRes OUT BOOLEAN
)
IS
tErepStatus ER.ErepStatus%TYPE;
BEGIN
SELECT ER.ErepStatus
INTO tErepStatus
FROM ER
INNER JOIN ExpI
ON ( ER.ErepNo = ExpI.ErepNo )
INNER JOIN BugIt
ON ( BugIt.EXNo = ExpI.EXNo )
WHERE ER.ErepNo = tErepNo
AND ER.ErepStatus IN ( 'APPROVED', 'PENDING', 'DENIED' )
ORDER BY ErepStatus DESC
FETCH FIRST ROW ONLY;
aRes := tErepStatus = 'APPROVED';
IF aRes THEN
UPDATE BugIt
SET BIAct = BIAct + rUpAm
WHERE EXNo = tEXNo;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
aRes := FALSE;
END;
/
其中,對於樣本數據:
CREATE TABLE ER ( ErepNo, Erepstatus ) AS
SELECT 1, 'APPROVED' FROM DUAL UNION ALL
SELECT 2, 'PENDING' FROM DUAL UNION ALL
SELECT 3, 'DENIED' FROM DUAL UNION ALL
SELECT 3, 'APPROVED' FROM DUAL;
CREATE TABLE ExpI ( ErepNo, EXNo ) AS
SELECT 1, 1 FROM DUAL UNION ALL
SELECT 2, 2 FROM DUAL UNION ALL
SELECT 3, 3 FROM DUAL;
CREATE TABLE BugIt ( EXNo, BIAct ) AS
SELECT 1, 1 FROM DUAL UNION ALL
SELECT 2, 2 FROM DUAL UNION ALL
SELECT 3, 3 FROM DUAL;
然后:
DECLARE
aRes BOOLEAN;
BEGIN
StoredProcedure1( 1, 1, 1, aRes );
IF ares THEN
DBMS_OUTPUT.PUT_LINE( 'Changed' );
ELSE
DBMS_OUTPUT.PUT_LINE( 'Not Changed' );
END IF;
END;
/
輸出Changed
並且:
SELECT * FROM BugIt;
給出:
\n EXNO | BIACT\n ---: | ----:\n 1 | 2\n 2 | 2\n 3 | 3\n
和:
DECLARE
aRes BOOLEAN;
BEGIN
StoredProcedure1( 3, 3, 1, aRes );
IF ares THEN
DBMS_OUTPUT.PUT_LINE( 'Changed' );
ELSE
DBMS_OUTPUT.PUT_LINE( 'Not Changed' );
END IF;
END;
/
輸出Not Changed
且BugIt
表未更改。
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.