Oracle PlSql Form 異常與處理

2021-07-27 05:47:50 字數 2908 閱讀 8109

no_data_found 當 sql 游標返回 0 行時; (sql%notfound)

too_many_rows 當 select into語句返回多行時;

invalid_number 未能將 sql語句中字串成功轉換成數字;

zero_divide 執行了除以0 操作;

cursor_already_open 試圖開啟乙個已開啟的游標;

invalid_cursor 執行了非法游標操作,如試圖關閉乙個已關閉的游標;

storage_error 由於pl/sql 記憶體溢位導致內部 pl/sql 錯誤發生;

timeout_on_resorce 等待資源超時;

dup_val_on_index 違反唯一性約束;

transaction_backed_out 由於死鎖使事務回滾;

program_error 內部 pl/sql 錯誤,這屬於系統軟體問題

value_error 由於在過程性語句中出現轉換、截斷、算術錯誤而產生的異常;

rowtype_mismatch 乙個主游標變數和 pl/sql游標變數型別不匹配;

access_into_null 試圖給乙個 null 物件的屬性賦值;

collection_is_null 試圖對 null 的 pl/sql 或變長陣列執行 exists 以外的操作;

subcript_outside_limit 引用的巢狀表或變長陣列索引超出了其申明範圍;

subcript_beyond_count 引用的巢狀表或變長陣列索引大於了巢狀表或巢狀表中元素 個數;

no_logged_on 沒有連線 oracle資料庫;

login_denied 錯誤的使用者名稱或口令;

在 insert, update 和 delete語句執行沒有行返回時是不會丟擲異常的,這個時候我們必須顯示的檢查 sql%notfound 的值以判斷是否有無資料返回的錯誤。對於這種語 句還可以用sql%rowcount(判斷該sql語句處理資料的行數)和sql%found來獲得執行狀態。

自定義異常的申明:

pragma exception_init(exception_name, oracle_error_number);
exception_name 是預先申明的異常名,oracle_error_number 是錯誤號,這條命令必須寫在定義部分。

declare 

v_code author.name%type;

e_toolarge exception;

pragma exception_init(e_toolarge, -1401);

其中 error_number 是錯誤號,值在-20000~-20999 之間,error_message 是錯誤訊息文字, 最大不超過 512 位元組;keep_errors 為 boolean 值可選引數,為 ture 則新的錯誤將加到已有 錯誤列表之後,為 false 則新的錯誤將代替當前的錯誤列表。

when e_error1 or e_error2 then
raise 語句還可以不帶引數的使用,則當前的異常被傳遞到塊外。

sqlcode 對應返回的錯誤**,sqlerrm 返回的是錯誤資訊。

注意,如果使用 exception_init 預編譯指令宣告與 oracle 錯誤相連的自定義異常,則sqlcode 和 sqlerrm 返回對應的 oracle錯誤**和相應的錯誤資訊,而不是返回「+1」和「user-dfined exception」。 呼叫 sqlerrm 時可以帶乙個數字引數,返回值是與這個數字引數相關的文字。

例如,如 果 sqlerrm 的引數是 0,則返回訊息是「ora-0000 : normal , successful completion」。

使用fnd_message來顯示錯誤資訊,然後丟擲form_trigger_failure來停止處理過程:

if (error_condition) then 

fnd_message.error;

raise form_trigger_failure;

endif;

if (error_condition) then 

endif;

該form中的儲存過程無需處理該錯誤異常,在form出發器on–error中的**會自動 偵測到該儲存器錯誤,抓取到異常並顯示錯誤資訊。

我們要意識到每當我們編譯當前觸發器時,可能會引起某些值的改變時,從而又會引起其 他觸發器的執行,為避免錯誤我們就應該測試 form_success,form_failure或者 fo rm_fatal的值。

例如:

go_item(』emp.empno』); 

if form_failure then

raise form_trigger_failure;

endif;

其中go_item會觸發別的觸發器, 例如when–new–item–instance,從而go_item執行可能會出錯,但最後乙個觸發的觸發器可能又是成功的,這就意味這form_failure值是flase從而無法引起異常而捕獲該錯誤,如下的**就可以避免這樣的問題:

go_item(』emp.empno』); 

if :system.cursor_item != 』emp.empno』 then

–– no need to show an error, because oracle forms

–– some other condition that caused the go_item

–– to fail.

raise form_trigger_failure;

endif;

mysql 丟擲異常sql mysql 異常處理

該文章內容通過網路搜尋組合,mysql 異常,可以自定義異常,再應用。也可使用系統預設的異常,捕獲應用。一 異常定義 declare condition name condition for condition type condition name引數表示異常的名稱 condition type引...

mysql 多異常 處理 MYSQL效能異常處理

通過information schema.processlist表中的連線資訊生成需要處理掉的mysql連線的語句臨時檔案,然後執行臨時檔案中生成的指令 mysql select concat kill id,from information schema.processlist where use...

spark on yarn 模式在hdp異常處理

其中乙個異常關鍵字 bad substitution 然後在stackoverflow發現相同提問,文中提到是因為沒有制定hdp版本,我才明白spark bin hadoop,編譯的是原生態的hadoop。英文應該都懂,我就不用翻譯了。正常情況遇見問題,不應該直接在網上找答案,診斷流程 從log或者...