2012-06-04 17 views
0

我有大量的插入語句。PL/SQL出現錯誤後是否可以返回行?

我想在這些行的執行過程中忽略錯誤,而且我不想單獨換行。

例子:

try 
    insert 1 
    insert 2 
    insert 3 
exception 
    ... 

我想,如果一個例外是在插入1拋出,它會忽略它,並返回到執行插入2,等

我該怎麼辦呢?

我正在尋找類似於「在VB中恢復下一個」的東西。

+0

你是否必須使用PLSQL?你不能從sql * plus運行這些插入嗎? –

+0

我可以,但即使錯誤聲明失敗,我也必須讓它運行。 – Matan

+0

我的意思是運行它的腳本,而不是一個匿名塊。如果可以,那麼每個語句都會自己運行 –

回答

3

如果您可以將所有插入操作移動到sql腳本中,然後在sql * plus中運行它們,那麼每個插入操作都會自行運行,腳本將繼續運行。

如果您正在使用plsqldeveloper(你功能標籤的話),然後打開一個新的命令窗口(至極酷似通過在SQL * Plus運行的SQL腳本),並把你的staements這樣的:

insert into table your_table values(1,'aa'); 
insert into table your_table values(2/0,'bb'); 
insert into table your_table values(3,'cc'); 
commit; 

即使盡管語句(2)會拋出一個執行,因爲它不在塊中,它將繼續執行下一個命令。

UPDATE:根據@CheranShunmugavel評論,在腳本的頂部添加

WHENEVER SQLERROR CONTINUE NONE 

(特別是如果你使用SQL * Plus其中有該difault是exit)。

+2

爲了安全起見,您可能需要在腳本頂部添加'WHENEVER SQLERROR CONTINUE NONE'行([documentation](http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12052) .htm#i2700066)),以防默認行爲不同。 (根據文檔,默認行爲是退出) –

+0

謝謝@CheranShunmugavel,我會更新我的答案 –

3

您需要用自己的異常處理程序來包裝每個INSERT語句。如果你的插入語句中有任何語句可能會失敗,那麼我會傾向於懷疑你錯誤地處理了這個問題。這些陳述來自哪裏?你能直接從該源系統中獲取數據嗎?你可以在循環中執行這些語句而不是列出每個語句嗎?您可以首先將數據加載到一組登臺表中,以確保所有INSERT語句成功(即沒有約束,所有列定義爲VARCHAR2(4000)等),然後編寫一個將數據移入數據的單個SQL語句具有適當驗證和異常處理的實際目標表?

+0

我試圖添加將「硬編碼」值賦予表格。但是,由於腳本部分可能以前運行,約束可能會失敗某些語句... – Matan

+0

同意 - 上載到登臺表,並在真正插入表時捕獲錯誤。如有必要,請使用多組表格。 –

+0

我該怎麼做?它如何解決我的問題? – Matan

相關問題