代码之家  ›  专栏  ›  技术社区  ›  Brian Driscoll

ORA-00907正在尝试创建具有自动列的表

  •  0
  • Brian Driscoll  · 技术社区  · 14 年前

    以下是创建代码:

    CREATE TABLE NEW_EMP2 (
    SSN CHAR(9), 
    EMP_NUM2 CHAR(5) automatic as newemp2id(SSN), 
    Fname VARCHAR2(15), 
    Lname VARCHAR2(15), 
    Bdate DATE
    )
    

    这是函数的代码 新EMP2ID :

    CREATE OR REPLACE FUNCTION newemp2id (i_ssn NCHAR) RETURN NCHAR
    IS
    BEGIN
    RETURN 'E'||(1000+SUBSTR(i_ssn,6,4));
    END
    

    任何帮助都将不胜感激,谢谢!

    3 回复  |  直到 13 年前
        1
  •  3
  •   OMG Ponies    14 年前

    在此之前我还没有听说过语法,但我能找到的只是 this PDF for Oracle RDB RDB was/is a separate product for Oracle databases ... Confirmed - not supported on 10g

    BEFORE INSERT trigger 相反,因为我不相信您使用的语法对oracleexpress(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
    
        2
  •  1
  •   Codo    14 年前

    自动列应该是什么?你是说一个纯计算的,即虚拟列吗?那么你的陈述应该是这样的:

    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
    

    如果我没弄错的话,虚拟列是在oracle11g中引入的。

        3
  •  1
  •   a_horse_with_no_name    14 年前

    Oracle Express是Oracle 10g。

    根据说明书( http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7002.htm#i2095331 )没有“automatic”关键字,oracle10也不支持“computed columns”

    oracle11g支持虚拟列,但它们是使用 GENERATED ALWAYS ,甚至Oracle 11g也没有 automatic

    为什么你认为这应该在甲骨文中起作用?

    推荐文章