ORA-00907 在尝试创建具有自动列的表时

Posted

技术标签:

【中文标题】ORA-00907 在尝试创建具有自动列的表时【英文标题】:ORA-00907 while trying to create a table with automatic column 【发布时间】:2010-08-21 17:05:48 【问题描述】:

我正在尝试创建一个带有自动列的表,其值是使用我定义的函数计算的。但是,当我尝试创建表时,我不断收到 ora-00907:缺少右括号。有人可以帮忙吗?

这里是创建代码:

CREATE TABLE NEW_EMP2 (
SSN CHAR(9), 
EMP_NUM2 CHAR(5) automatic as newemp2id(SSN), 
Fname VARCHAR2(15), 
Lname VARCHAR2(15), 
Bdate DATE
)

这是函数newemp2id的代码:

CREATE OR REPLACE FUNCTION newemp2id (i_ssn NCHAR) RETURN NCHAR
IS
BEGIN
RETURN 'E'||(1000+SUBSTR(i_ssn,6,4));
END

对此的任何帮助将不胜感激,谢谢!

更新:我在 Windows Vista 机器上使用 Oracle Express Edition,以防万一。

【问题讨论】:

【参考方案1】:

在此之前我没有听说过语法,但我能找到的只有this PDF for Oracle RDB。 RDB was/is a separate product for Oracle databases...Confirmed - not supported on 10g

改用BEFORE INSERT trigger,因为我不相信您使用的语法对Oracle Express 有效(10g 有效)-CREATE TABLE 或ALTER TABLE 文档中没有提及。

我不喜欢使用触发器,我更喜欢使用单个存储过程来插入给定的表,并且只允许任何人使用该过程而不是直接访问表...

CREATE OR REPLACE TRIGGER newemp2_before_insert
BEFORE INSERT
    ON new_mep2
    FOR EACH ROW
BEGIN

    -- Update created_by field to the username of the person performing the INSERT
    :new.emp_num2 := newemp2id(new.ssn)
END;

坦率地说,当它可以在视图中处理时,这过于复杂了:

CREATE VIEW vw_emp AS
  SELECT t.ssn,
         'E'||(1000+SUBSTR(i_ssn,6,4)) AS emp_num2
    FROM NEW_EMP2 t

【讨论】:

这就是虚拟列的好处——它们可以节省创建不必要的视图和非规范化数据。我认为甚至可以对它们施加限制。有一天我们会得到 Oracle 11!【参考方案2】:

什么是自动列?您的意思是纯粹计算的即虚拟列吗?那么你的陈述应该是这样的:

CREATE TABLE NEW_EMP2 (
SSN CHAR(9), 
EMP_NUM2 CHAR(5) GENERATED ALWAYS AS ( newemp2id(SSN) ) VIRTUAL, 
Fname VARCHAR2(15), 
Lname VARCHAR2(15), 
Bdate DATE
)

您的函数需要声明确定性:

CREATE OR REPLACE FUNCTION newemp2id (i_ssn NCHAR) RETURN NCHAR DETERMINISTIC 
IS
BEGIN
RETURN 'E'||(1000+SUBSTR(i_ssn,6,4));
END

如果我没记错的话,Oracle 11g 中引入了虚拟列。

【讨论】:

根据本文档 (oracle.com/technetwork/database/rdb/…),Oracle 从 v7.1 开始支持计算列和自动列。我是 Oracle 的新手,所以如果文章中描述的产品不同,那么显然这是我的问题...... @Brian Driscoll:Oracle RDB 仅适用于 OpenVMS - 它不是您使用的 Oracle RDBMS。【参考方案3】:

Oracle Express 是 Oracle 10g。

根据手册 (http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7002.htm#i2095331),没有“自动”关键字,Oracle 10 从未支持“计算列”

Oracle 11g 支持虚拟列,但它们是使用 GENERATED ALWAYS 创建的,甚至 Oracle 11g 都没有 automatic 关键字

您为什么认为这应该在 Oracle 中工作?

【讨论】:

以上是关于ORA-00907 在尝试创建具有自动列的表时的主要内容,如果未能解决你的问题,请参考以下文章

获取“ORA-00907:缺少右括号”,找不到错误

尝试创建 CHECK 约束时出现 ORA-00907

ORA-00907:缺失右括号

ORA-00907: 两个子查询的左连接缺少右括号

创建表并收到错误,因为 ora 00907 缺少右括号

尝试将记录添加到具有先前创建的记录的表时出错