0

我正在尝试创建一个带有自动列的表,其值是使用我定义的函数计算的。但是,当我尝试创建表时,我不断收到 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,以防万一。

4

3 回答 3

3

在此之前我没有听说过语法,但我能找到的只是这个 PDF for Oracle RDBRDB 曾经是/现在是 Oracle 数据库的单独产品...已确认 - 10g 不支持

请改用BEFORE INSERT 触发器,因为我不相信您使用的语法对 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
于 2010-08-21T17:33:43.047 回答
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 中引入了虚拟列。

于 2010-08-21T17:31:16.870 回答
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 中工作?

于 2010-08-21T17:31:48.617 回答