ORA-06502報錯導致資料庫所有檢視無法修改。

datapeng發表於2014-03-10
ORA-06502報錯導致資料庫所有檢視無法修改。
今天有客戶反映資料庫所有檢視和包重新編譯都會報這個錯
1.日誌資訊
Mon Mar  3 09:54:48 2014
Errors in file /oracle/oracle/admin/xxx/bdump/xxx_j000_21390.trc:
ORA-12012: 自動執行作業 1541 出錯
ORA-04045: 在重新編譯/重新驗證 user.table_UPDATE_ST 時出錯
ORA-01422: 實際返回的行數超出請求的行數
ORA-06512: 在line 14
Mon Mar  3 09:58:49 2014
Errors in file /oracle/oracle/admin/xxx/bdump/xxx_j001_21208.trc:
ORA-12012: 自動執行作業 1541 出錯
ORA-04045: 在重新編譯/重新驗證 user.table_UPDATE_ST 時出錯
ORA-01422: 實際返回的行數超出請求的行數
ORA-06512: 在line 14
Mon Mar  3 10:06:52 2014
Errors in file /oracle/oracle/admin/xxx/bdump/xxx_j000_21390.trc:
ORA-12012: 自動執行作業 1541 出錯
ORA-04045: 在重新編譯/重新驗證 user.table_UPDATE_ST 時出錯
ORA-01422: 實際返回的行數超出請求的行數
ORA-06512: 在line 14
2.
sqlplus 執行修改檢視內容:
報:
ORA-00604
ORA-06502
ORA-06512
3.檢視引數設定
執行 select dummy from dual; 沒問題
執行
  SELECT KSPFTCTXPN PARAMETER_NUMBER,
KSPPINM PARAMETER_NAME,
KSPPITY PARAMETER_TYPE,
KSPFTCTXVL PARAMETER_VALUE,
KSPFTCTXDF IS_DEFAULT,
KSPPIFLG MODIFICATION_FLAG,
KSPFTCTXVF VALUE_FLAG
FROM X$KSPPI X, X$KSPPCV2 Y
WHERE (X.INDX + 1) = KSPFTCTXPN
AND KSPPINM LIKE '_system_trig_enabled';
結果為true\

4.編譯檢視沒問題
Connected.
SQL> alter procedure table_update_st compile;
Procedure altered.
SQL> show errors;
No errors.
5.
執行檢視內容修改的語句報錯ORA-00604 ,ORA-06502,ORA-06512
SQL> exec table_to_custom_v;
BEGIN table_to_custom_v; END;
      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00221: 'table_TO_CUSTOM_V' is not a procedure or is undefined
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
5.解決
alter system set "_system_trig_enabled"=false;
6. 
官方文件上的解釋:
ORA-06502: PL/SQL: numeric or value errorstring
Cause: An arithmetic, numeric, string, conversion, or constraint error occurred. For example, this error occurs if an attempt is made to assign the value NULL to a variable declared NOT NULL, or if an attempt is made to assign an integer larger than 99 to a variable declared NUMBER(2).
Action: Change the data, how it is manipulated, or how it is declared so that values do not violate constraints.
官方解釋是:  想存入資料庫的資料(包含資料,字串等等)不符合該欄位的定義(比如長度,約束等), 舉個例子,就是說你想存一個空值到非空欄位,如存入3位以上的數字到NUMBER(2)欄位中,等等
官方解決方法是: 改變資料的型別,或長度,等等。
7.
oracle隱含引數“_system_trig_enabled”用來控制系統觸發器的,用來儲存系統的一些觸發事件,但這個表(目前不知道是哪個表)本身有問題,導致資料無法插入。
解決思路: 把這個引數關掉,讓系統的日誌不儲存在那張有問題的表中,就好了(當然有隱含風險,目前未知):
8.
一.如果是使用者資料,則更改使用者表,或者資料
二.如果是oracle系統表,則使用如下語句關係統系統觸發器:
alter system set "_system_trig_enabled"=false;
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29371470/viewspace-1104458/,如需轉載,請註明出處,否則將追究法律責任。

相關文章