【问题标题】:EXCEPTION in before the end of the loop循环结束前的异常
【发布时间】:2017-04-10 20:04:40
【问题描述】:

我试图在内循环结束后引发一个异常并继续外循环我得到以下错误:

第 29 行出现错误:
ORA-06550:第 29 行,第 6 列:
PLS-00103:在预期以下情况之一时遇到符号“例外”:
( begin case 声明 end exit for goto if loop mod null pragma raise return select update while with

这是我的代码:

DECLARE
TOTAL_ZERO  EXCEPTION;
client_rec E_CLIENT%ROWTYPE;
commande_rec E_COMMANDE%ROWTYPE;
total_client integer:=0;
total_commande integer:=0;
i integer:=1;
j integer:=1;
Nombre_Commande integer:=0;
Total_paye E_COMMANDE.TOTAL%TYPE:=0;
BEGIN
select count (*) into total_commande from E_COMMANDE;
select count (*) into total_client from E_CLIENT;
FOR j IN 1 .. total_client LOOP
    select * into client_rec from E_CLIENT where NO=j;
    FOR i IN 1 .. total_commande LOOP

        select  * into commande_rec from E_COMMANDE where NO=i;
        IF EXTRACT(YEAR FROM commande_rec.DATE_COMMANDE)=2004 THEN
            IF commande_rec.CLIENT_NO = j THEN
                Nombre_Commande:=Nombre_Commande+1;
                Total_paye := Total_paye + commande_rec.TOTAL;
            END IF;
        END IF;
    END LOOP;
    IF Nombre_Commande=0 THEN RAISE TOTAL_ZERO; END IF;
    dbms_output.put_line('Numero client     ' || client_rec.NO || '     Nom client      ' || client_rec.NOM || ': ');
    dbms_output.put_line('total :   ' || Total_paye || '    ' || 'Nombre_Commande' || Nombre_Commande);
    EXCEPTION
    WHEN TOTAL_ZERO THEN
    dbms_output.put_line('---------ERROR----------');
    Nombre_Commande:=0;
    Total_paye:=0;


END LOOP;
END;
/

PS:我在 Ubuntu 16.04 上使用 SQLplus Oracle 11gR2

【问题讨论】:

    标签: sql oracle for-loop exception plsql


    【解决方案1】:

    您在异常语句之前错过了一个结束循环。我在异常之后删除了结束循环。 异常(如果使用)总是与 begin 和 end 语句一起出现。

    祝你好运。

    DECLARE
      TOTAL_ZERO  EXCEPTION;
      client_rec E_CLIENT%ROWTYPE;
      commande_rec E_COMMANDE%ROWTYPE;
      total_client integer:=0;
      total_commande integer:=0;
      i integer:=1;
      j integer:=1;
      Nombre_Commande integer:=0;
      Total_paye E_COMMANDE.TOTAL%TYPE:=0;
    BEGIN
      select count (*) into total_commande from E_COMMANDE;
      select count (*) into total_client from E_CLIENT;
      FOR j IN 1 .. total_client LOOP
        select * into client_rec from E_CLIENT where NO=j;
        FOR i IN 1 .. total_commande LOOP
    
            select  * into commande_rec from E_COMMANDE where NO=i;
            IF EXTRACT(YEAR FROM commande_rec.DATE_COMMANDE)=2004 THEN
                IF commande_rec.CLIENT_NO = j THEN
                    Nombre_Commande:=Nombre_Commande+1;
                    Total_paye := Total_paye + commande_rec.TOTAL;
                END IF;
            END IF;
        END LOOP;
        IF Nombre_Commande=0 THEN RAISE TOTAL_ZERO; END IF;
        dbms_output.put_line('Numero client     ' || client_rec.NO || '     Nom client      ' || client_rec.NOM || ': ');
        dbms_output.put_line('total :   ' || Total_paye || '    ' || 'Nombre_Commande' || Nombre_Commande);
      END LOOP;   ---> !!!!
    EXCEPTION
        WHEN TOTAL_ZERO THEN
          dbms_output.put_line('---------ERROR----------');
          Nombre_Commande:=0;
          Total_paye:=0;
    
    END;
    /
    

    【讨论】:

    • 我希望第一个循环在异常之后继续,这就是为什么我将 END LOOP 放在异常之后
    • 顺便说一下,您在顶部声明的ij 变量没有被使用。 for i in ... loop 构造隐含地声明了它自己的构造。
    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多