2010-08-21 40 views
-1

我試圖創建一個表有自動柱,它的值是使用我定義一個函數來計算。但是,當我嘗試創建表時,我不斷收到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計算機上,如果說有什麼區別。

回答

3

我沒有聽說過在此之前的語法,但所有我能找到的是this PDF for Oracle RDBRDB was/is a separate product for Oracle databases ... Confirmed - not supported on 10g

使用BEFORE INSERT trigger代替,因爲我不相信你正在使用的語法是有效的Oracle快捷(有效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 
+0

這是關於虛擬列的好事 - 它們將節省創建不必要的視圖和非規範化的數據。我認爲甚至有可能對它們施加限制。有一天我們會得到Oracle 11! – JulesLt 2010-08-23 11:52:49

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中引入。

+0

Express是Oracle 10g中 – 2010-08-21 17:32:22

+0

根據這一文件(http://www.oracle.com/technetwork/database/rdb /automatic-columns-132042.pdf)Oracle支持計算機編輯和自動列自v7.1以來。我是Oracle的新手,所以如果本文中描述的產品不同,那麼顯然這是我的問題...... – 2010-08-21 17:36:18

+0

@Brian Driscoll:Oracle RDB僅適用於OpenVMS--它不是您正在使用的Oracle RDBMS。 – 2010-08-21 17:38:20