2011-12-19 26 views
7

Tôi đang cố thực hiện một con trỏ và muốn nó hoàn thành vòng lặp ngay cả khi có một số ngoại lệ.plsql/cursors xử lý ngoại lệ và quay trở lại luồng thực hiện

Điều tôi đang cố gắng thực hiện là "bắt" tất cả ngoại lệ và có thể ghi nhật ký somthing hoặc không làm gì và sau đó quay trở lại luồng. Dưới đây là cách mã trông giống như:

FOR line IN my_cursor 
LOOP 
begin 

    if<condition> then 
     GOTO pass; 
    else  
    <<do_something>> 
    exception 
     when others then 
     sys.dbms_output.put_line('say something');  
    end if; 

    <<pass>> null; 
end 
END LOOP; 

Tập lệnh không biên dịch. Có thể có một số lỗi cú pháp với ngoại lệ, nhưng tôi cũng không nhận thức được ngữ nghĩa rất tốt. Giống như tôi không chắc chắn nếu bạn có thể trở lại dòng chảy thực hiện sau khi xử lý một ngoại lệ.

p.s: DB là 10g và không có CONTINUE trong đó. Do đó sử dụng GOTO.

+2

Ngoài ra, 'if' cần một 'then' và' cuối if'. –

+0

thnx. Đó là một lỗi đánh máy trong câu hỏi. – codeObserver

+0

Bạn có thể kiểm tra xem một trong các câu trả lời được đề xuất có thể đủ điều kiện được chấp nhận không? TIA – lkuty

Trả lời

16

Đặt mã mà bạn muốn thực thi trong vòng lặp trong khối riêng của nó và sau đó bạn có thể sử dụng khối đó để chặn phần ngoại lệ để xử lý bất kỳ sự cố nào trong vòng lặp lặp lại.

Khi ngoại lệ cho lặp mà được xử lý, các lần lặp tiếp theo sẽ bắt đầu

ví dụ:

for line in my_cursor 
loop 
    begin  
     <<do_something>> 
    exception 
     <<do_exception_processing>>   
    end; 
end loop; 

Để minh họa điều này hơn nữa, trong ví dụ dưới đây, tôi đã tuyên bố một biến địa phương của loại ngoại lệ. Tôi đang lặp qua các số từ 1 đến 10, trong vòng lặp lặp thứ hai, câu lệnh if là đúng và xử lý chuyển cho trình xử lý ngoại lệ. Khi ngoại lệ được xử lý, vòng lặp tiếp theo của vòng lặp bắt đầu.

begin 

    for i in 1 .. 10 
    loop 

     declare 

     my_exception exception; 

     begin 

     if i = 2 
     then 

      -- if you need to do some processing then you would enter it 
      -- here and then when you want to enter the exception section 
      -- you would add the line below 

      raise my_exception; 

     end if; 

     exception 
     when my_exception then 
      dbms_output.put_line('in exception section'); 

     end; 

    end loop; 

end; 
+1

Thnx Ian. Tôi đã thử và cập nhật trong câu hỏi. Vẫn còn có vấn đề.Btw là có cần cho "bắt đầu" và "kết thúc" trong LOOP? – codeObserver

+2

Có, để sử dụng phần ngoại lệ, bắt đầu .. phần cuối được yêu cầu –

+0

Tôi sẽ cập nhật câu trả lời của mình với ví dụ –

7
FOR line IN my_cursor 
LOOP 
    if not some_condition then 
    begin 
     do_something; 
    exception  
     when others then log_my_error(); -- this should be something that uses 
             -- an autonomous transaction 
    end; 
    end if; 
END LOOP; 
0
BEGIN 
FOR Line in My_Cursor LOOP 
    IF condition THEN 
BEGIN 
    do something... 
END; 
    ELSE 
BEGIN 
    do something... 
END; 
    END IF; 
END LOOP; 
EXCEPTION 
WHEN OTHERS THEN 
DBMS_OUTPUT.PUT_LINE('say something'); 
END;