Oracle異常彙總

来源:http://www.cnblogs.com/snowballed/archive/2017/08/31/7455994.html
-Advertisement-
Play Games

目前統計異常:ORA-00000、ORA-00001、ORA-00017、ORA-00018、ORA-00019、ORA-00020、ORA-01722、ORA-01747 文檔通過翻譯文檔、搜索資料及測試實踐對Oralce的異常做彙總、分析導致異常的各類原因及對應的解決方法,並備註一些知識點以助學... ...


持續更新中,可參見https://hnuhell.gitbooks.io/oracle_errmg/content/https://hnuhell.github.io/Oracle_ERRMG/上的頁面。

ORA-00000 to ORA-00877

ORA-00000: 正常的成功的完成(操作)

ORA-00000: normal, successful completion

原因1: 正常執行完成。【部分驗證】

Normal exit.

  • 分析: 此異常多數為程式沒有執行SQL語句或者說成功執行完SQL語句,但人為或因邏輯有誤,非要使用相關方法程式去獲取Oracle的錯誤信息,得到此異常,實質是Oracle告知沒有異常產生,猜測是異常信息的預設值為這個。目前發現以下兩種情況:
    1. 存儲過程、PL/SQL塊等,使用sqlerrm獲取異常,如下例所示。【已驗證】

       declare
         v_sqlcode number;
         v_sqlerrm varchar2(4000);
       begin
         /*
            ……
            相關執行代碼
            ……
         */
      
         v_sqlcode := sqlcode;
         v_sqlerrm := sqlerrm;
         dbms_output.put_line('本次的異常code:' || v_sqlcode || chr(10) || '本次的異常信息:' || v_sqlerrm);
      
       exception
         when others then
           rollback;
           v_sqlcode := sqlcode;
           v_sqlerrm := sqlerrm;
           dbms_output.put_line('本次的異常code:' || v_sqlcode || chr(10) || '本次的異常信息:' || v_sqlerrm);
       end;
       /
      
    2. 使用OCI的C程式中,用erhms()函數(OCIErrorGet())獲得Oracle錯誤信息。【未驗證,網路彙總】

  • 措施: 無。【如果是人為需要獲取該異常,則不用做任何操作;如果是邏輯有誤,那麼需要調整不去此異常或者在遇到此異常時將其屏蔽去掉。】

    None

原因2: hosts文件配置錯誤。【未驗證,網路彙總】

  • 分析: 這種錯誤通常由於資料庫是複製過來的,hosts文件中的ip對應的host name和當前的主機名不一致導致甚至hosts文件丟失,都會導致資料庫startup時報此錯。
  • 措施: 校驗hosts文件是否有錯或缺失,進行修改或補充。
    • hosts文件在不同系統中所處的目錄:

        Windows XP/2000/Vista/7/8/8.1/10 ==> C:\windows\system32\drivers\etc\
        Linux及其他類Unix操作系統 ==> /etc/
      

ORA-00001: 違反唯一約束條件 (string.string=>[擁有者].[約束名])

ORA-00001: unique constraint (string.string) violated

原因1: UPDATE或INSERT語句試圖插入重覆的鍵。對於在DBMS MAC模式下配置的Trusted Oracle,如果在不同級別存在重覆條目,您可能會看到此信息。【已驗證】

An UPDATE or INSERT statement attempted to insert a duplicate key. For Trusted Oracle configured in DBMS MAC mode, you may see this message if a duplicate entry exists at a different level.

  • 分析: 如下例所示,此異常一般為違反作用於表上的唯一約束或者主鍵約束導致,它們限制了表的一列或多列值的唯一性,不能插入重覆數據。

      -- 創建測試表
      create table ora_00001_1(
          a char(24) /*primary key*/,  -- 亦可加註釋內信息實現添加主鍵約束
          b number /*unique*/, -- 亦可加註釋內信息實現添加唯一約束
          -- 增加主鍵約束
          constraint ora_00001_1_a primary key (a)
          -- 亦可加註釋內信息實現添加唯一約束
          /*, constraint ora_00001_1_b unique (b)*/
       );
    	 
       -- 亦可加註釋內信息實現添加主鍵約束
      /*alter table ora_00001_1 add constraint ora_00001_1_a primary key (a);*/
       -- 增加唯一約束
      alter table ora_00001_1 add constraint ora_00001_1_b unique (b);
    
      -- 插入測試數據
      insert into ora_00001_1(a, b) values ('1',1);
      insert into ora_00001_1(a, b) values ('2',2);
      commit;
    
      -- ORA-00001: 違反唯一約束條件 (C##LY.ORA_00001_1_A);
      insert into ora_00001_1(a, b) values ('1',3);
      -- ORA-00001: 違反唯一約束條件 (C##LY.ORA_00001_1_B)
      insert into ora_00001_1(a, b) values ('3',2);
      -- ORA-00001: 違反唯一約束條件 (C##LY.ORA_00001_1_A)
      update ora_00001_1 set a = '1' where a = '2';
      -- ORA-00001: 違反唯一約束條件 (C##LY.ORA_00001_1_B)
      update ora_00001_1 set b = '2' where b = '1';
    
  • 措施: 刪除唯一約束限制或不插入重覆值。

    Either remove the unique restriction or do not insert the key.

    • 如果分析確定此處唯一約束或主鍵約束不需要,那麼則可使用下麵語句刪除約束

        -- 查詢約束與索引信息
        select a.owner 約束所有者,
               a.constraint_name 約束名,
               case a.constraint_type
                 when 'P' then
                  'Primary key'
                 when 'U' then
                  'Unique key'
                 when 'C' then
                  ' Check constraint on a table'
                 when 'R' then
                  'Referential integrity'
                 when 'V' then
                  'With check option, on a view'
                 when 'O' then
                  'With read only, on a view'
                 when 'H' then
                  'Hash expression'
                 when 'F' then
                  'Constraint that involves a REF column'
                 when 'S' then
                  'Supplemental logging'
                 else
                  'unkown'
               end 約束類型,
               b.table_name 表名,
               b.column_name 列名,
               c.index_name 索引名,
               c.uniqueness 是否唯一索引/*,
               d.table_name 表名,
               d.column_name 列名*/
          from user_constraints a, user_cons_columns b, user_indexes c/*, user_ind_columns d*/
         where a.constraint_name = b.constraint_name
           and a.index_name = c.index_name
           /*and c.index_name = d.index_name*/
           and a.owner = b.owner
           and a.owner = c.table_owner
           and a.owner = &"[擁有者]"
           and a.constraint_name = &"[約束名]";
      		
        -- 由於如果約束對應的唯一索引若是事先手工創建的,那麼在刪除約束時索引不會被刪除,Oracle之後自動刪除自己隱式創建的索引。
        -- 因此加上drop index,可確保一定將索引刪除。
        alter table [表名] drop constraint [約束名] drop index;
        -- 如果是主鍵約束,有可能遇到有用作外鍵的情況,那麼在刪除時仍會報=>ORA-02273: 此唯一/主鍵已被某些外鍵引用
        -- 報錯後瞭解是否有問題,是否需去除此主鍵和外鍵,然後可考慮用下麵語句刪除主鍵約束,會同時刪除外鍵約束
        alter table [表名] drop constraint [約束名] cascade drop index;
        alter table [表名] drop primary key cascade drop index;
      
    • 如果分析確定是值重覆,那麼需排查表數據與預執行的SQL語句的重覆值衝突、同一個事務內執行的SQL語句之間的重覆值衝突,去掉重覆值的插入或更新。

  • 備註:

    1. 唯一約束與主鍵約束的同:
      • 都通過唯一索引來限制約束列的唯一性,確保任何使表中約束的列在行與行之間存在重覆值的操作失敗
      • 若無事先創建好唯一索引,都會在創建唯一約束或主鍵約束時隱式創建同名的唯一約束
      • 有約束必定有索引(無法在保持約束存在的情況下刪除索引=>ORA-02429: 無法刪除用於強制唯一/主鍵的索引)
      • 有索引不一定有約束(只刪除約束但不刪除索引則仍然會限制索引列的值的唯一性)
    2. 唯一約束與主鍵約束的異:
      • 唯一約束允許在該列或多列上存在NULL值,但主鍵約束不能存在NULL值
      • 一個表只能創建一個主鍵約束,但可創建多個唯一約束
      • 主鍵可擴展作為外鍵,唯一約束不可

ORA-00017: 會話被要求設置跟蹤事件

ORA-00017: session requested to set trace event

原因1: 當前會話被要求通過另一個會話設置一個跟蹤事件【ora12_ERRMG】

The current session was requested to set a trace event by another session.

  • 措施: 內部使用;無需操作。

    This is used internally; no action is required.

ORA-00018: 超出最大會話數

ORA-00018: maximum number of sessions exceeded

原因1: 所有會話狀態對象都在使用中。【部分驗證】

All session state objects are in use.

  • 分析: 很明顯,系統中所有會話數目已經達到設置的SESSIONS值,因此準備要創建的會話無法成功創建,而這個會話包括有用戶建立連接至資料庫是產生的會話、後臺進程產生的會話以及各類涉及到硬解析處理數據字典基表的DML、DDL語句產生的遞歸會話。
  • 措施: 增加SESSIONS初始化參數值。【是否需要增加SESSIONS值還需進行判斷,是否是由於此值過小而現實場景需要更大的值?】

    Increase the value of the SESSIONS initialization parameter.

    • 如果判斷確定是由於SESSIONS值過小導致,則需修改增大此參數值:

         /*
            alter system set 參數名=值  [scope=應用範圍];
            scope需知:
                scope=both,表示修改會立即生效且會修改spfile文件以確保資料庫在重啟後也會生效如果(以spfile啟動此項為預設值);
                scope=memory,表示修改會立即生效但不會修改spfile文件,因此重啟後失效(以pfile啟動此項為預設值,且只可設置這個值);
                scope=spfile,表示只修改spfile文件,在重啟資料庫後才生效(對應靜態參數則只可設置此項值,設置其它值會報錯:
                                                 ORA-02095: specified initialization parameter cannot be modified)。
         */
      	 
        -- 查看"是否可用ALTER SYSTEM修改"列值,根據結果進行修改
        select name 參數名,
               case type
                 when 1 then
                  'Boolean'
                 when 2 then
                  'String'
                 when 3 then
                  'Integer'
                 when 4 then
                  'Parameter file'
                 when 5 then
                  'Reserved'
                 when 6 then
                  'Big integer'
                 else
                  'unknown'
               end 參數類型,
               value "會話級(若可修改)或實例級參數值",
               display_value 展示值,
               isses_modifiable "是否可用ALTER SESSION修改",
               case issys_modifiable
                 when 'IMMEDIATE' then
                  '無論pfile還是spfile啟動,都可用"alter system set ' || name || '=&' ||
                  '新的參數值;"更改參數並立即生效。'
                 when 'DEFERRED' then
                  '無論pfile還是spfile啟動,都可用"alter system set ' || name || '=&' ||
                  '新的參數值;"更改參數並將在之後的會話中生效。'
                 when 'FALSE' then
                  case a.is_spfile
                    when 0 then
                     '使用pfile啟動,需手動修改pfile文件中對應參數值再重啟。'
                    else
                     '使用spfile啟動,可用"alter system set ' || name || '=&' || name ||
                     ' scope=spfile;"更改參數。更改將在後續的實例中生效(當前資料庫需重啟)。'
                  end
                 else
                  '?'
               end "是否可用ALTER SYSTEM修改",
               isinstance_modifiable "是否不同實例間值可不同"
          from v$parameter,
               (select count(1) is_spfile from v$parameter t where t.name = 'spfile') a
         where name = 'sessions';
      
    • 如果判斷確定SESSIONS值合理,則需分析確定產生大量會話的原因,是否相關程式代碼建立了連接未釋放?或者其它原因等。【待完善】

  • 備註: 參數SESSIONS:

    屬性描述
    參數類型 Integer
    預設值 派生公式: (1.1 * PROCESSES) + 5) [11gR1,11gR2] (1.5 * PROCESSES) + 22
    可修改(不用重啟及時生效) 否 [11gR2,12cR1] 可用ALTER SYSTEM修改
    取值範圍 1~2^31 [11gR1,11gR2] 1~2^16(1~65536)
    基礎參數

    SESSIONS指定可以在系統中創建的最大會話數。因為每次登錄都需要一個會話,所以這個參數有效地確定了系統中最大併發用戶數。您應該始終將此參數顯式設置等於最大併發用戶數的估計值+後臺進程數+遞歸會話數(大約占總數的10%)。

    Oracle使用此參數的預設值作為其最小值。 將SESSIONS值設置成[1~預設值)不會觸發錯誤,因為Oracle會忽略此值直接使用預設值。

    ENQUEUE_RESOURCES和TRANSACTIONS參數的預設值派生自SESSIONS。因此,如果增加SESSIONS的值,則應考慮是否也調整ENQUEUE_RESOURCES和TRANSACTIONS的值。 (請註意,從Oracle Database 10g release 2(10.2)起,ENQUEUE_RESOURCES已被廢棄。)

    在共用伺服器環境中,PROCESSES的值可能相當小。因此,Oracle建議您將SESSIONS的值調整為大約1.1 *總連接數。

ORA-00019: 超出最大許可會話數

ORA-00019: maximum number of session licenses exceeded

原因1: 所有許可會話都在使用中。【部分驗證】

All licenses are in use.

  • 分析: 很明顯,系統中併發用戶會話已經達到設置的LICENSE_MAX_SESSIONS值,因此準備要創建的用戶會話無法創建。
  • 措施: 增大LICENSE_MAX_SESSIONS初始化參數的值。【是否需要增加LICENSE_MAX_SESSIONS值還需進行判斷,是否是由於此值過小而現實場景需要更大的值?】

    Increase the value of the LICENSE MAX SESSIONS initialization parameter.

    • 如果判斷確定是由於LICENSE_MAX_SESSIONS值過小導致,則需修改增大此參數值,【詳情參見ORA-00018=>原因1=>措施,將SQL語句中name = 'sessions'修改為name = 'license_max_sessions'即可】
    • 如果判斷確定LICENSE_MAX_SESSIONS值合理,則需分析確定產生大量會話的原因,是否相關程式代碼建立了連接未釋放?或者其它原因等。【待完善】
  • 備註: 參數LICENSE_MAX_SESSIONS:

    屬性描述
    參數類型 Integer
    預設值 0
    可修改(不用重啟及時生效) 可用ALTER SYSTEM修改
    取值範圍 0~許可會話數
    基礎參數
    Oracle實時應用集群 多個實例可以具有不同的值,但是安裝資料庫的所有實例的總和應小於或等於該資料庫許可的會話總數。

    LICENSE_MAX_SESSIONS指定允許的併發用戶會話的最大數量。達到此限制後,只有具有RESTRICTED SESSION許可權的用戶才能連接到資料庫。無法連接的用戶收到表示系統達到最大容量的警告消息。

    零值表示不強制執行併發使用(會話)許可。如果將此參數設置為非零數字,則可能還需要設置LICENSE_SESSIONS_WARNING(請參閱“LICENSE_SESSIONS_WARNING”)。

    不要同時啟用併發使用許可和用戶許可,即LICENSE_MAX_SESSIONS與LICENSE_MAX_USERS兩參數值至少一個要設置為零。

ORA-00020: 超出最大進程數(string=>[最大進程數])

ORA-00020: maximum number of processes (string) exceeded

原因1: 所有進程狀態對象都在使用中。【部分驗證】

All process state objects are in use.

  • 分析: 很明顯,系統中進程數已經達到設置的PROCESSES值,因此準備要創建的用戶會話無法創建。
  • 措施: 增加PROCESSES初始化參數的值。【是否需要增加PROCESSES值還需進行判斷,是否是由於此值過小而現實場景需要更大的值?】

    Increase the value of the PROCESSES initialization parameter.

    • 如果判斷確定是由於PROCESSES值過小導致,則需修改增大此參數值,【詳情參見ORA-00018=>原因1=>措施,將SQL語句中name = 'sessions'修改為name = 'processes'即可】
    • 如果判斷確定PROCESSES值合理,則需分析確定產生大量進程的原因,是否相關程式代碼建立了連接未釋放?或者其它原因等。【待完善】
  • 備註: 參數PROCESSES:

    屬性描述
    參數類型 Integer
    預設值 40~操作系統依賴數 [10gR2,11gR1] 100 [11gR2,12cR1] 該值是派生的,它通常取決於警報日誌中報告的核心數。
    可修改(不用重啟及時生效)
    取值範圍 6~操作系統依賴數
    基礎參數
    Oracle實時應用集群 多個實例可以具有不同的值。

    PROCESSES指定可以同時連接到Oracle的最大操作系統用戶進程數。它的值應允許所有後臺進程運行,如鎖,作業隊列進程和並行執行進程。

    該參數派生了SESSIONS和TRANSACTIONS參數的預設值。因此,如果更改PROCESSES的值,則應評估是否要調整這些派生參數的值。

ORA-01500 to ORA-02098

ORA-01722: 無效數字

ORA-01722: invalid number

原因1: 指定的數字無效

The specified number was invalid.

  • 分析: 究其根本在於,要執行的語句在人為顯式轉換或Oracle判斷決定隱式轉換,故意或非故意得使一個非數值類型且無法轉換為數值類型的值轉換為數值類型失敗導致的。如下幾例:
    • 顯式轉換:

        -- to_number、to_binary_float、to_binary_double轉換字元串為數值
        select to_number('2017年') from dual;
        select to_binary_float('8.935M') from dual;
        select to_binary_double('0.001s')  from dual;
      
    • 隱式轉換:

        ---------涉及到數值類型列的賦值或函數需要函數數值類型結果的轉換---------
        -- insert/update/merge等語句操作列值
        -- 測試表
        create table ora_01722_1(
            a number,
            b char(24),
            c varchar2(300)
        );
        -- 插入賦值,無法隱式轉換成數值,報錯
        insert into ora_01722_1(a) values ('111測試字元串');
        -- 插入賦值,可以隱式轉換成數值,不報錯
        insert into ora_01722_1(a, b) values ('111', 'bbb');
        commit;
        -- 更新賦值,無法隱式轉換成數值,報錯
        update ora_01722_1 set a = '222測試字元串';
      
        -- decode由第三列的數值1確定了改函數輸出結果為數值類型
        -- 當匹配到'a'返回1,結果為數值,不報錯
        select decode('a', 'a', 1, 'b', 2, 'c', 'three', 0) test1 from dual;
        -- 當匹配到'c'返回'three',結果不為數值且無法轉換為數值,報錯
        select decode('c', 'a', 1, 'b', 2, 'c', 'three', 0) test2 from dual;
      
        -- nvl由第一列輸入的數值確定了它在此時輸出的結果也會為數值
        -- 當發現第一個值不為空時,就嘗試輸出後邊的值作為本次nvl函數操作後的數值結果,發現無法轉換為數值,報錯
        select nvl(&請輸入數值, '測試') from dual;
      
        -- nvl2由第二列的2確定了它在此時輸出的結果也會為數值
        -- 當不管結果是否為2,它都會講後邊的值進行測試轉換……所以無論是否輸入null都報錯
        select nvl2(&無論是否null, 2, '測試') from dual;
      
        ---------涉及到與數值類型的比較或其它運算---------
        -- 未比較到'三',不報錯
        select decode(1, 1, 'one', 2, 'two', '三', 'three', 'zero') from dual;
        -- 比較到'三',報錯 
        select decode(3, 1, 'one', 2, 'two', '三', 'three', 'zero') from dual;
        -- 與數值進行算術運算,無法隱式轉換為數值,報錯
        select 'a' + 2 from dual;
        -- 與ora_01722_1的數值類型列a進行比較,將右邊轉換為數值失敗,報錯
        select * from ora_01722_1 t where t.a = 'a';
        -- ora_01722_1列b與數值類型進行比較,將左邊轉換為數值失敗,報錯
        select * from ora_01722_1 t where t.b = 2;
      
    • 隱式轉換:特別註意時靈時不靈的查詢,都是重新類似於上面的情況,但由於之前查詢的是部分表數據或部分視圖數據等,但是報錯是涉及到另一部分甚至是全表全視圖的數據,而由於未註意隱式轉換導致“臟數據”無法轉換成數值類型而報錯。其實不是它臟,是你不註意欄位類型的區分,請不要依賴於Oracle的隱式轉換!

  • 措施: 指定一個有效的數字。

    Specify a valid number.

    • 根據分析的情況,明確是否需要主動轉換,是否數據存在問題,該是數值就傳數值,該是字元串就添加左右英文單引號包裹成字元串。
  • 備註: 當需要的時候,Oracle資料庫會自動將值從一種數據類型轉換為另一種(如CHAR、VARCHAR2、NCHAR、NVARCHAR2、BINARY_FLOAT、BINARY_DOUBLE就有可能隱式轉換為NUMBER)。由於以下原因,Oracle建議您指定顯式轉換,而不是依賴於隱式自動轉換:
    • 當您使用顯式數據類型轉換函數時,SQL語句更容易理解。
    • 隱式數據類型轉換可能會對性能產生負面影響,特別是如果列值的數據類型被隱式轉換為基本常量的數據類型,而不是主動轉為其它類型。
    • 隱式轉換要根據需要轉換時的上下文來決定,而且在每類場景中不一定產生一樣的效果。例如,從datetime值到varchar2值的隱式轉換可能會根據NLS_DATE_FORMAT參數的值返回意外的一年。
    • 隱式轉換的演算法可能會隨著軟體版本和Oracle產品之間的變化而變化。顯式轉換的變化則更有預見性。
    • 如果在索引表達式中產生了隱式數據類型轉換,那麼Oracle資料庫可能不會使用該索引,因為它是為轉換前數據類型定義的。這可能會對性能產生負面影響。

ORA-01747: user.table.column, table.column 或列說明無效【已驗證】

ORA-01747: invalid user.table.column, table.column, or column specification

原因1: 列名為關鍵字。

  • 分析: 一般為在SQL語句或存儲過程、函數等中使用到的此欄位為oracle的保留關鍵字,且保留方式標識了此關鍵字在某些情況下,例如在DML中是否不允許作為標識符的。如下列情況:

      -- 查詢能做屬性但不能作為標識符或某些場景(如DML操作)下不能作為標識符的關鍵字
      select t.*
        from v$reserved_words t
       where (t.res_semi = 'Y' or t.reserved = 'Y')
         and t.res_attr = 'N';
      -- 根據上面關鍵字建表,為測試需要,實際使用時請避免將Oracle保留關鍵字作為表的欄位!
      create table ora_01747_1 (
         "TRIGGER" number, "WHERE" number, "REVOKE" number, "INCREMENT" number, "THEN" number, 
         "FILE" number, "PRIOR" number, "CONNECT" number, "COMMENT" number, "SYSDATE" number, 
         "ONLINE" number, "DECIMAL" number, "SESSION" number, "MODIFY" number, "IN" number, 
         "@" number, "," number, "GRANT" number, "INTO" number, "VALIDATE" number, "." number, 
         "ADD" number, "ORDER" number, "HAVING" number, "TO" number, "NULL" number, "RENAME" number, 
         "LEVEL" number, "USER" number, "ANY" number, /*"ROWID" number, --不可作建表屬性*/ 
         "SHARE" number, "MODE" number, "UNION" number, "/" number, "SET" number, "INDEX" number, 
         "MAXEXTENTS" number, "VALUES" number, "|" number, "VIEW" number, "[" number, "WITH" number, 
         "EXCLUSIVE" number, "ALTER" number, "FROM" number, "SELECT" number, "BY" number, "-" number, 
         "MLSLABEL" number, "AND" number, "+" number, "ROWS" number, "CHECK" number, ":" number, 
         "VARCHAR2" number, "IMMEDIATE" number, "CURRENT" number, "AS" number, "*" number, "TABLE" number, 
         "LONG" number, "SYNONYM" number, "ASC" number, "UNIQUE" number, "LIKE" number, "DESC" number, 
         "VARCHAR" number, "INITIAL" number, "CHAR" number, "=" number, "DROP" number, "AUDIT" number, 
         "ROWNUM" number, "FLOAT" number, "COMPRESS" number, "OFFLINE" number, "NOT" number, "DELETE" number, 
         "^" number, "BETWEEN" number, "EXISTS" number, "IDENTIFIED" number, "WHENEVER" number, "INTEGER" number, 
         "SIZE" number, "NOWAIT" number, ")" number, "]" number, "NOCOMPRESS" number, "COLUMN" number, "ELSE" number, 
         "FOR" number, "INTERSECT" number, "!" number, "PRIVILEGES" number, "SUCCESSFUL" number, "PCTFREE" number, 
         "UPDATE" number, "ACCESS" number, "RESOURCE" number, "UID" number, "DATE" number, "NOAUDIT" number, 
         "RAW" number, /*"&" number,--不可作建表屬性 */"OPTION" number, "ROW" number, "SMALLINT" number, 
         "MINUS" number, "OF" number, "ON" number, ">" number, "INSERT" number, "DEFAULT" number, "ALL" number, 
         "START" number, "IS" number, "CREATE" number, "DISTINCT" number, "LOCK" number, "CLUSTER" number, 
         "GROUP" number, "PUBLIC" number, "OR" number, "<" number, "NUMBER" number, "(" number/* ,"" number --不可作建表屬性*/
      );
    
      -- 異常測試(不是所有屬性錯誤使用都會產生ORA-01747的異常,還可能產生ORA-00936、ORA-01788、ORA-01745等異常)
      -- ORA-01747: user.table.column, table.column 或列說明無效
      select SET from ora_01747_1;
      update ora_01747_1 set NUMBER = 1;
      update ora_01747_1 set ,"NUMBER" = 1;
      insert into ora_01747_1("TRIGGER", ,WHERE) values(1, ,1);
    
  • 措施: 在使用此欄位時,添加英文雙引號(”“)包裹。
    • 通過下麵語句可查詢此類關鍵字的使用情況:

        select a.table_name ,
               a.column_name 原欄位,
               '"' || a.column_name || '"' 使用需加雙引號,
               'select "' || a.column_name || '" from ' || a.table_name ||
               ' where rownum = 1;' 簡單查詢語句,
               b.reserved "是否不能作標識符",
               b.res_type "是否不能作類型名稱",
               b.res_attr "是否不能作屬性名稱",
               b.res_semi "是否某些環境(DML)不能作標識符",
               b.duplicate
          from user_tab_columns a, v$reserved_words b
         where a.column_name = b.keyword
           and b.res_semi = 'Y'
        --  and a.table_name = '表名'
        --  and a.column_name = '欄位名'
        ;
      
  • 備註: 實際使用時請避免將Oracle保留關鍵字作為表的欄位!

原因2: DML語句缺失列或多逗號。

  • 分析: 一般為使用各種方式動態拼接SQL時,拼接有誤,使得insert語句或update語句中逗號分隔的左邊或右邊出現空,示例可參見上面原因1的分析代碼。
  • 措施: 檢查拼接邏輯,加上缺失欄位或去除多餘的逗號

 

 

作者:滾雪球俱樂部-何理利

出處: http://www.cnblogs.com/snowballed/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
如有疑問, 可郵件([email protected])咨詢。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.安裝必要的軟體包 2.關閉記憶體透明大頁 echo "transparent_hugepage=never">> sudo /etc/grub2.cfg 3.創建用戶組 及 用戶 4. chown -R oracle:oinstall /oracle /oradatachmod 755 /orac ...
  • 1、MySQL使用命令行啟動時報錯“發生系統錯誤 5”,如下: 原因:未用管理員身份運行cmd程式 解決方案:在開始菜單里找到命令提示符,右擊選擇以管理員身份運行 2、登錄時報錯“提示mysql不是內部或外部命令,也不是可運行的程式或批處理文件” 解決方案:配置環境變數(右擊我的電腦->高級系統設置 ...
  • 看到一篇不知道是好好玩還是好玩玩童鞋的博客,發現一道好玩的mapreduce題目,地址http://www.cnblogs.com/songhaowan/p/7239578.html 如圖 由於自己太笨,看到一大堆java代碼就頭暈、心慌,所以用python把這個題目研究了一下。 題目:尋找共同好友 ...
  • Oracle: --concat(str1,str2)字元串拼接函數 select concat(t.uuid,t.name) from group t; select t.uuid || t.name from group t;--initcap(str)將每個單詞首字母大寫,其他字母小寫sele ...
  • 因為這兩天業務需求不是很多,昨天抽空研究了下MySQL的主從同步。 期間也遇到了許多問題,怕之後會忘記,也順便記錄下自己的成長經歷。所以寫這篇博文。 因為我是在VM虛擬機上進行的測試。 所以首先要把虛擬機的鏈接模式改為橋接模式。 在設置->硬體->網路適配器->網路連接里更改為橋接模式。 如果不是使 ...
  • 一、表與庫的概念 資料庫管理數據,它是以什麼樣的形式組成的? 生活中的表 >表 table多行多列,傳統的資料庫都是這樣的;聲明瞭表頭,一個表創建好了,剩下的就是往表中添加數據 多張表放在檔案中 >庫 database學生信息表,成績表,記過表 -> 都是這個班級的信息,將這幾張表放在一個文件夾中 ...
  • 書內容的思維導圖與讀後感 圖片顯示的大小有限制,可以右擊 在新標簽頁中打開圖片,或者, "點擊下載源文檔" : 思維 : 從《浪潮之巔》里描述的企業變遷,感受思維可以決定一個企業的方向,如果方向與新時代不符,很難改變走向頹廢或消失的結果,因為企業的基因問題,就是思維難以改變; 再到《智能時代》從第一 ...
  • 本文主要講述了PG的幾個主要進程,以及PG的核心架構。進程和體繫結構詳見下圖: 從上面的體繫結構圖可以看出來,PG使用經典的C/S架構,進程架構。在伺服器端有主進程、服務進程、子進程、共用記憶體以及文件存儲幾大部分,下麵著重講述伺服器端的進程部分: 1. Postmaster主進程和服務進程 當PG數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...