循环结束前的EXCEPTION

时间:2016-11-26 18:25:41

标签: sql oracle for-loop exception plsql

我试图在内循环结束后提出一个EXCEPTION并继续外循环我得到以下错误:

  

第29行的错误:
  ORA-06550:第29行,第6栏:
  PLS-00103:遇到符号" EXCEPTION"当期待以下之一时:
  (如果循环mod为null,则开始为goto声明结束退出   用pragma提高返回选择更新     <<   继续关闭当前删除获取锁定插入打开回滚   savepoint set sql execute commit forall merge pipe purge

这是我的代码:

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

1 个答案:

答案 0 :(得分:0)

您在异常声明之前错过了一个结束循环。我在异常后删除了结束循环。 异常(如果使用)始终与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;
/