首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle ORA-54013 錯誤解析:虛擬欄位不可直接插入資料

     編輯:Oracle 資料庫相關知識

錯誤現象

ORA-54013: 不允許對虛擬欄位執行 INSERT 操作

根本原因

Oracle 11g 引入虛擬欄位特性。虛擬欄位的值不儲存在磁碟,而是根據定義的運算式在查詢時即時計算。因此:

  • 無法對虛擬欄位執行 INSERT / UPDATE 指定值
  • 只能透過插入/更新其依賴的實體欄位,查詢時自動反映計算結果
  • 可對虛擬欄位建立索引、約束、外鍵

實例分析

資料表 APEX_CW_月結賬單明細詳情表 結構如下:

PK_MONTHBILLDETAILID  VARCHAR2(35)
FK_MONTHBILLID        VARCHAR2(18)
...
MONTHBILLTYPE         VARCHAR2(2)       -- 虛擬欄位
SUBSTR("FK_MONTHBILLID",1,1)            -- 定義運算式

最後一行 MONTHBILLTYPE 為虛擬欄位,其值衍生自 FK_MONTHBILLID 的第一個字元。若嘗試在 INSERT 或 UPDATE 中對 MONTHBILLTYPE 賦值,即觸發 ORA-54013。

解決方案

  1. 移除虛擬欄位賦值:INSERT / UPDATE 陳述式中略過該欄位,僅提供實體欄位值。
  2. 檢視表定義:DESC table_name 或查詢 USER_TAB_COLS 中 VIRTUAL_COLUMN = 'YES' 的欄位,確認哪些為虛擬欄位。
  3. 調整應用程式邏輯:ORM 框架 (如 Hibernate) 需將該欄位標記為 insertable=false, updatable=false 或設為 @Transient。

虛擬欄位優缺點快速參考

優點限制
節省儲存空間不可直接寫入
查詢即時計算,資料永遠一致不可為主鍵 (12c 起可作主鍵)
可建索引、約束、外鍵運算式不可包含非確定性函數
簡化視圖與函數索引維護DDL 變更需重建相依物件

總結

遇到 ORA-54013,請檢查目標欄位是否為虛擬欄位,並調整 SQL 或 ORM 映射,僅操作其依賴的實體欄位即可。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved