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 在尝试创建具有自动列的表时的主要内容,如果未能解决你的问题,请参考以下文章