此处不允许使用虚拟列

时间:2013-04-22 07:38:46

标签: sql oracle

我正在尝试使用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)
  );

3 个答案:

答案 0 :(得分:5)

LANGUAGE_ID可能是一个计算字段,或者在任何情况下,数据库都无法根据您所需的更改推断对视图下的表所做的更改。必须要查看视图定义代码才能知道。

答案 1 :(得分:2)

我认为,为了使用视图进行插入或更新,视图中的所有表必须通过主键连接。这是为了防止由无法更新的视图引起的重复。

答案 2 :(得分:0)

有没有一个很好的理由你不只是插入基础表?如果可以,只需直接插入表中,避免这种复杂情况。

您期望Oracle做什么?您是否希望它将新记录插入i18n_fields

如果你真的想这样做,你需要创建一个INSTEAD OF触发器,因为Oracle在运行你的insert语句时无法弄清楚应该插入哪些底层表。