簡體   English   中英

為什么沒有提出我的例外?

[英]Why is my exception not being raised?

我是PL / SQL和Oracle的新手。 我正在研究一個小的代碼塊,該代碼塊在列中生成前5個值。 我試圖在表中少於5行數據時引發異常。

DELETE FROM CREDIT_CARD;
SELECT * FROM CREDIT_CARD;
Insert into CREDIT_CARD values (6011956844573649,'550',892);
Insert into CREDIT_CARD values (5250335443644204,'15000',661);


DECLARE
   CURSOR Final_Q2_Cursor is
      SELECT CREDITCARDNUMBER,CREDITCARDLIMIT,CUSTOMERID FROM CREDIT_CARD
         ORDER BY CREDITCARDLIMIT DESC;   -- start with highest paid employee

  aCardLimt NUMBER(8,2);
  aCardNum NUMBER(16);
  aCustId INT;
BEGIN
   OPEN  Final_Q2_Cursor ;
   FOR i IN 1..5 LOOP
      FETCH Final_Q2_Cursor INTO aCardNum, aCardLimt, aCustId;
      EXIT WHEN Final_Q2_Cursor%NOTFOUND; 
      INSERT INTO TOP_FIVE_CREDIT_LIMITS VALUES (aCardLimt, aCardNum, aCustId);
   END LOOP;
   CLOSE Final_Q2_Cursor;
EXCEPTION 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such customer!'); 
   WHEN others THEN 
      dbms_output.put_line('Error!');    
END;
/

我只插入2行數據,但它仍在處理所有數據。 為什么?

這是一個示例,在其中查詢cursor屬性以確定是否需要顯式引發錯誤

SQL> create table TOP_FIVE_CREDIT_LIMITS (CREDITCARDLIMIT int, CREDITCARDNUMBER int, CUSTOMERID int );

Table created.

SQL> create table CREDIT_CARD (
  2        CREDITCARDNUMBER int,CREDITCARDLIMIT int,CUSTOMERID int );

Table created.

SQL>
SQL> DELETE FROM CREDIT_CARD;

0 rows deleted.

SQL> SELECT * FROM CREDIT_CARD;

no rows selected

SQL> Insert into CREDIT_CARD values (6011956844573649,'550',892);

1 row created.

SQL> Insert into CREDIT_CARD values (5250335443644204,'15000',661);

1 row created.

SQL>

PL / SQL:

SQL> set serverout on
SQL> DECLARE
  2     CURSOR Final_Q2_Cursor is
  3        SELECT CREDITCARDNUMBER,CREDITCARDLIMIT,CUSTOMERID FROM CREDIT_CARD
  4           ORDER BY CREDITCARDLIMIT DESC;   -- start with highest paid employee
  5
  6    aCardLimt NUMBER(8,2);
  7    aCardNum NUMBER(16);
  8    aCustId INT;
  9  BEGIN
 10     OPEN  Final_Q2_Cursor ;
 11     FOR i IN 1..5 LOOP
 12        FETCH Final_Q2_Cursor INTO aCardNum, aCardLimt, aCustId;
 13
 14        if Final_Q2_Cursor%NOTFOUND and i < 5 then
 15             raise_application_error(-20000,'Ran out of rows before I got to 5');
 16        end if;
 17        EXIT WHEN Final_Q2_Cursor%NOTFOUND;
 18        INSERT INTO TOP_FIVE_CREDIT_LIMITS VALUES (aCardLimt, aCardNum, aCustId);
 19     END LOOP;
 20     CLOSE Final_Q2_Cursor;
 21  EXCEPTION
 22     WHEN no_data_found THEN
 23        dbms_output.put_line('No such customer!');
 24     WHEN others THEN
 25        dbms_output.put_line('Error!');
 26  END;
 27  /
Error!

PL/SQL procedure successfully completed.

但我要強調的是,這不是一種明智的處理方式(盡管如果您的任務是……那么可以)。 通常,我們盡可能地使用SQL來嘗試保持代碼的美觀和精簡,並且我們永遠不希望在when-others中捕獲所有錯誤而不將其傳播回調用環境。 因此,您還可以像下面這樣重鑄代碼:

SQL> set serverout on
SQL> BEGIN
  2    insert into TOP_FIVE_CREDIT_LIMITS
  3    select *
  4    from
  5      ( SELECT CREDITCARDNUMBER,CREDITCARDLIMIT,CUSTOMERID FROM CREDIT_CARD
  6        ORDER BY CREDITCARDLIMIT DESC
  7      )
  8    where rownum <= 5;
  9
 10    if sql%rowcount = 0 then
 11         raise_application_error(-20000,'No rows were found at all');
 12    elsif sql%rowcount < 5 then
 13         raise_application_error(-20000,'Ran out of rows before I got to 5');
 14    end if;
 15
 16  END;
 17  /
BEGIN
*
ERROR at line 1:
ORA-20000: Ran out of rows before I got to 5
ORA-06512: at line 13

暫無
暫無

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

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