for tab_name in tables loop execute immediate 'drop table '||tab_name; --此處可能會報錯
end loop;
當前情況是,循環表,進行刪除,如果出現表不存在,則會異常中斷,導致整個存儲過程掛掉,需求是要能跳過錯誤的執行,不進行處理,進行下個循環。
最終代碼:
for tab_name in tables loop begin execute immediate 'drop table '||tab_name; --此處可能會報錯 EXCEPTION WHEN others THEN NULL; end; end loop;
如何拋出
上面存儲過程是,異常處理寫法是(異常跳過不處理): EXCEPTION WHEN OTHERS THEN END 這種寫法當存儲過程拋出異常時,我們不知道其到底拋出了哪種異常(比如列寬度不夠大而在插入數據時拋異常),可以按如下方式顯示異常信息 EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line(‘sqlcode : ’ ||sqlcode); DBMS_OUTPUT.put_line(‘sqlerrm : ’ ||sqlerrm); END sqlcode是異常編號,sqlerrm是異常的詳細信息,如果異常信息太多,可以截取一段顯示,如 DBMS_OUTPUT.put_line(‘sqlerrm : ’ ||substr(sqlerrm,1,100));是截取前100個字符顯示出來。 也可以插入到日志表 insert xxx values (sqlcode,sqlerrm)