我正在尝试使用自动列创建一个表,其值使用我定义的函数计算。但是,当我尝试创建表时,我不断得到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,以防万一。
答案 0 :(得分:3)
在此之前我没有听说过语法,但我能找到的只有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
答案 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中有用?