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

时间:2010-08-21 17:05:48

标签: oracle function plsql ora-00907

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

这是CREATE代码:

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,以防万一。

3 个答案:

答案 0 :(得分:3)

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

请改用BEFORE INSERT trigger,因为我不相信您使用的语法对Oracle Express(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

答案 1 :(得分: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引入了虚拟列。

答案 2 :(得分:1)

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中有用?