【问题标题】:Why doesn't Oracle recognize a stored generated column definition?为什么 Oracle 不能识别存储的生成列定义?
【发布时间】:2020-07-23 12:29:31
【问题描述】:

我在CREATE TABLE 语句中定义了以下生成的列:

NET_ROWS_ADDED NUMBER(18) GENERATED ALWAYS AS (ROW_COUNT - PREV_ROW_COUNT) /*STORED*/,

ROW_COUNTPREV_ROW_COUNT 是先前在同一个表中定义的简单 NUMBER(18) 列。

一切正常。
但是,如果我取消注释 STORED 选项,我会得到:

ORA-00907: missing right parenthesis

我需要将其转换为 STORED 生成的列。
这里的语法有什么问题?这一切对我来说都是正确的......

【问题讨论】:

  • Oracle中没有STORED选项,你用的是MySQL吗?
  • 您收到错误,因为 STORED 无效; Oracle 从不存储虚拟列。不知道为什么你认为你需要;你不知道,请参阅here。然后,您仍然可以索引,在 where 子句中使用,创建视图,......简而言之,您可以对存储的列进行任何操作。除了直接设置它们的值。
  • 大声笑我一直在无意中查看 MySQL 文档。这就解释了。谢谢!

标签: sql oracle syntax calculated-columns


【解决方案1】:

Oracle 不在磁盘上存储虚拟列,它只是按需评估。您可能对 MySQL 中的 STORED 选项感到困惑。由于Oracle中没有STORED子句,所以会抛出语法错误。

来自documentation

总是生成

为语义提供可选关键字 GENERATED ALWAYS 明晰。它们表明该列未存储在磁盘上,而是存储在 按需评估。

虚拟

为语义提供可选关键字 VIRTUAL 清晰度。

【讨论】:

  • 是的,这正是问题所在。当我在寻找 Oracle 的东西时,我总是不小心查看 MySQL 文档。
  • 有时我的谷歌搜索也会把我带到 MySQL 页面,让我发疯——不要为此自责
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
相关资源
最近更新 更多