2016-04-13 19 views
2

Ich habe einen PL/SQL-Code geschrieben, um nur Datensätze größer als ID = 4 zu drucken. Ich habe eine goto-Anweisung im Programm verwendet, die in der Ausnahme nicht erkannt wird. Bitte hilf mir, das Programm fortzusetzen, nachdem ich auf die Ausnahme gestoßen bin. Mein Code istWie kann ich mein Programm weiter ausführen, nachdem in SQL eine Ausnahme aufgetreten ist?

declare 
    cursor cur is select * from student; 
    c student%rowtype; 
    lt3 exception; 
    PRAGMA 
    exception_init(lt3,-77); 
begin 
    open cur; 
    loop 
     <<backup>> 
     fetch cur into c; 
     if c.id < 4 then 
      raise lt3; 
     else 
      dbms_output.put_line(c.name); 
     end if; 
    end loop; 
    close cur; 
exception 
    when lt3 then 
    dbms_output.put_line('Exception encountered'); 
    goto backup; 
end; 
/

Wo sollte ich ändern?

bekam ich den Fehler bei

ERROR at line 24: 
ORA-06550: line 24, column 7: 
PLS-00201: identifier 'BACKUP' must be declared 
ORA-06550: line 24, column 2: 
PL/SQL: Statement ignored 
+0

brauchen Sie wirklich die Ausnahme? – brenners1302

+0

@ brenners1302 Mein Punkt ist es, Ausnahme zu verwenden, und möchte die Ausführung nach dem Treffer fortsetzen. –

+0

Warum nicht einfach den Cursor ändern, um nur Schüler mit einer ID größer als 4 auszuwählen? – Chrisrs2292

Antwort

4

wenn Sie goto in cursor verwenden, Cursor geschlossen werden, daher können Sie das erwartete Verhalten nicht erreichen.

Von Doc

Wenn Sie die GOTO-Anweisung vorzeitig einen Cursor-FOR-Schleife zu beenden, der Cursor wird automatisch geschlossen. Der Cursor wird auch automatisch geschlossen, wenn innerhalb der Schleife eine Ausnahme ausgelöst wird.

Eine Sache, die Sie tun können, ist continue zu verwenden, break, exit in der Schleife der Ausführung steuern

open cur; 
loop 
    fetch cur into c; 
    if c.id < 4 then 
      continue; 
    else 
      dbms_output.put_line(c.name); 
    end if; 
end loop; 
close cur; 
1

Sie sollten mit goto-Anweisung in jedem Code vermeiden, wenn Sie können.

Der folgende Code sollte erreichen, was Sie versuchen zu tun. Ich habe keinen Zugriff in der Datenbank, daher könnte es eine falsche Syntax geben.

declare 
    cursor cur is select * from student; 
    c student%rowtype; 
    lt3 exception; 
    PRAGMA 
    exception_init(lt3,-77); 
begin 
    open cur; 
    loop 
    begin 
      fetch cur into c; 
      if c.id < 4 then 
     raise lt3; 
      else 
       dbms_output.put_line(c.name); 
      end if; 
    exception 
     when lt3 then 
     dbms_output.put_line('Exception encountered'); 
    end; 
    end loop; 
    close cur; 
exception 
    when others then 
    dbms_output.put_line('other error encountered'); 
end; 
1

Sie sollten wirklich ID> 4 wählen, um eine Ausnahme zu vermeiden.

Goto wird auf diese Weise nicht funktionieren. Sie müssen continue oder break für die Ausführungssteuerung verwenden.