2013-04-22 69 views
2

不允許我試圖使用一個表中插入一行VIEW作爲虛擬列在這裏

INSERT INTO FIELDI18N(LANGUAGE_ID) VALUES (1); 

,但它給了我以下錯誤:

Error starting at line 5 in command: 
INSERT INTO FIELDI18N(LANGUAGE_ID) VALUES (1) 
Error at Command Line:5 Column:22 
Error report: 
SQL Error: ORA-01733: virtual column not allowed here 
01733. 00000 - "virtual column not allowed here" 
*Cause:  
*Action: 

任何線索?

添加視圖定義:

CREATE OR REPLACE VIEW FIELDI18N("FIELDID", "NAME", "TYPE", "DESCRIPTION", "LANGUAGE_ID") 
AS 
    (SELECT field.fieldid, 
    field.type, 
    NVL(i18n.name, field.name) name, 
    NVL(i18n.description, field.description) description, 
    i18n.language_id 
    FROM fields field 
    JOIN i18n_fields i18n 
    ON (field.fieldid = i18n.fieldid) 
); 
+0

請發佈受此影響的對象的創建視圖和表語句。 – 2013-04-22 08:00:19

+0

除非創建了'INSTEAD OF'觸發器,否則連接視圖不可更新。有關詳細信息,請參閱手冊:http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_8004.htm#SQLRF54782,以及http://docs.oracle.com/cd/E11882_01/server.112 /e25494/views.htm#ADMIN11782 – 2013-10-02 07:00:19

回答

5

LANGUAGE_ID可能是一個計算的字段,或在任何情況下,數據庫不能推斷出什麼樣的變化是基於你需要改變的觀點所依據的表來進行。必須查看視圖定義代碼才能知道。

0

是不是有一個很好的理由,你不只是插入到基礎表?如果可以的話,直接插入表格並避免這種複雜情況。

你期待Oracle做什麼?您是否期待在i18n_fields中插入新記錄?

如果你真的想這樣做,你需要創建一個INSTEAD OF觸發器,因爲當你運行你的insert語句時,Oracle不能找出它應該插入哪個底層表。

+0

是的,它必須通過視圖插入。 – 2013-10-07 13:05:51

1

我相信,爲了做一個插入或更新使用視圖中的所有表必須通過主鍵連接。這是爲了防止無法更新的視圖造成重複。