2010-08-21 42 views
-1

我试图创建一个表有自动柱,它的值是使用我定义一个函数来计算。但是,当我尝试创建表时,我不断收到ora-00907:缺少右括号。谁能帮忙?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 

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

UPDATE:我使用的是Oracle快捷版在Windows Vista计算机上,如果说有什么区别。

回答

3

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

使用BEFORE INSERT trigger代替,因为我不相信你正在使用的语法是有效的Oracle快捷(有效10G) - 有在CREATE TABLEALTER 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 
+0

这是关于虚拟列的好事 - 它们将节省创建不必要的视图和非规范化的数据。我认为甚至有可能对它们施加限制。有一天我们会得到Oracle 11! – JulesLt 2010-08-23 11:52:49

1

什么是应该是一个自动列?你的意思是一个纯粹计算的虚拟列吗?然后你的说法应该是这样的:

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中引入。

+0

Express是Oracle 10g中 – 2010-08-21 17:32:22

+0

根据这一文件(http://www.oracle.com/technetwork/database/rdb /automatic-columns-132042.pdf)Oracle支持计算机编辑和自动列自v7.1以来。我是Oracle的新手,所以如果本文中描述的产品不同,那么显然这是我的问题...... – 2010-08-21 17:36:18

+0

@Brian Driscoll:Oracle RDB仅适用于OpenVMS--它不是您正在使用的Oracle RDBMS。 – 2010-08-21 17:38:20