ORA-00907试图创建一个表,自动列
我试图创建一个表有自动柱,它的值是使用我定义一个函数来计算。但是,当我尝试创建表时,我不断收到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计算机上,如果说有什么区别。
我没有听说过在此之前的语法,但所有我能找到的是this PDF for Oracle RDB。 RDB was/is a separate product for Oracle databases ... Confirmed - not supported on 10g
使用BEFORE INSERT trigger代替,因为我不相信你正在使用的语法是有效的Oracle快捷(有效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
什么是应该是一个自动列?你的意思是一个纯粹计算的虚拟列吗?然后你的说法应该是这样的:
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中引入。
Express是Oracle 10g中 – 2010-08-21 17:32:22
根据这一文件(http://www.oracle.com/technetwork/database/rdb /automatic-columns-132042.pdf)Oracle支持计算机编辑和自动列自v7.1以来。我是Oracle的新手,所以如果本文中描述的产品不同,那么显然这是我的问题...... – 2010-08-21 17:36:18
@Brian Driscoll:Oracle RDB仅适用于OpenVMS--它不是您正在使用的Oracle RDBMS。 – 2010-08-21 17:38:20
的Oracle Express是Oracle 10g中。
根据手册(http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7002.htm#i2095331)没有“自动”关键字和Oracle 10从未支持“计算列”
甲骨文11g支持虚拟列,但它们使用GENERATED ALWAYS
,甚至没有的Oracle 11g具有创建一个automatic
关键字
为什么你认为这应该在甲骨文工作?
请看我上面的评论 – 2010-08-21 17:36:48
这是关于虚拟列的好事 - 它们将节省创建不必要的视图和非规范化的数据。我认为甚至有可能对它们施加限制。有一天我们会得到Oracle 11! – JulesLt 2010-08-23 11:52:49