簡體   English   中英

存儲過程(菜鳥程序員),我的代碼有什么問題?

[英]Stored Procedure (rookie programmer), What's wrong with my code?

我正在嘗試創建一個存儲過程,該過程將在給定費用報告編號ErepNo和費用類別編號EXNo更新BugIt表中的相關行。

該過程必須包含 3 個輸入參數EXNoErepNo'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 ChangedBugIt表未更改。

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM