为啥 Oracle 认为我缺少右括号?

Posted

技术标签:

【中文标题】为啥 Oracle 认为我缺少右括号?【英文标题】:Why does Oracle think I'm missing a right parenthesis?为什么 Oracle 认为我缺少右括号? 【发布时间】:2009-04-01 17:07:53 【问题描述】:

在 Oracle 10i 中,我正在运行以下命令:

ALTER TABLE jnrvwchnglst ADD
     ( jnrvwchnglst_userid NUMBER(10) NOT NULL DEFAULT 1 )

jnrvwchnglst 是现有表,没有jnrvwchnglst_userid 不是现有列。

Oracle 错误信息是:

ORA-00907: missing right parenthesis

这个查询有什么问题,为什么 Oracle 认为我缺少括号?

【问题讨论】:

这不是我的事,但是你用这样的名字在桌子上放什么?初中大众改名表? :) @Quassnoi - ORM 系统从标记中删除元音,因为 Oracle 有其(不合理的)30 个字符的最大值。所以真的是“JoinReviewChangelist”。 【参考方案1】:
ALTER TABLE jnrvwchnglst ADD
     ( jnrvwchnglst_userid NUMBER(10) DEFAULT 1  NOT NULL )

【讨论】:

【参考方案2】:

"(NOT) NULL" 在语法上必须是“ALTER”中的最后一条语句,所以当 Oracle 看到时 - 并且下一个字符(您的“DEFAULT”stmt)不是预期的终止权“) ",抛出错误。

【讨论】:

希望这能解释更多为什么你会得到这个错误,以帮助解决其他类似的情况。【参考方案3】:

我之前遇到过这个问题,您无法在同一语句中添加列并设置默认/约束。 “缺少右括号”是一个红鲱鱼。 Oracle 喜欢在与括号无关的情况下使用该错误(我的猜测是它们的解析逻辑一直到 00907)。

试试

ALTER TABLE jnrvwchnglst ADD ( nrvwchnglst_userid NUMBER(10) );
ALTER TABLE jnrvwchnglst ALTER ( nrvwchnglst_userid  SET DEFAULT 1 );
UPDATE jnrvwchnglst SET nrvwchnglst_userid = 1 WHERE nrvwchnglst_userid IS NULL;
ALTER TABLE jnrvwchnglst  ALTER ( nrvwchnglst_userid  SET NOT NULL );

【讨论】:

该死 =) 或者它可能只是操作顺序问题。呸 =) 这是真的,例如时间戳。然而,Quassnoi 的代码确实有效。谢谢!

以上是关于为啥 Oracle 认为我缺少右括号?的主要内容,如果未能解决你的问题,请参考以下文章

获取 ORA-00907 的 Oracle 查询:缺少右括号

Oracle SQL中的“缺少右括号”

为啥“缺少右括号”错误?

Oracle 缺少右括号

SQL Oracle 命令“缺少右括号”

ORA-00907: ORACLE 10G 中缺少右括号