ORA-00907 при попытке создать таблицу с автоматическим столбцом - PullRequest
0 голосов
/ 21 августа 2010

Я пытаюсь создать таблицу с автоматическим столбцом, значение которого вычисляется с помощью определенной мной функции. Тем не менее, когда я пытаюсь создать таблицу, я получаю 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

Любая помощь по этому вопросу будет принята с благодарностью, спасибо!

ОБНОВЛЕНИЕ: Я использую Oracle Express Edition на компьютере с Windows Vista, на случай, если что-то изменится.

Ответы [ 3 ]

3 голосов
/ 21 августа 2010

До этого я не слышал о синтаксисе, но все, что я мог найти, это этот PDF для Oracle RDB . RDB был / является отдельным продуктом для баз данных Oracle ... Подтверждено - не поддерживается для 10g

Вместо этого используйте триггер BEFORE INSERT ,потому что я не верю, что используемый вами синтаксис действителен для 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 голос
/ 21 августа 2010

Oracle Express - это Oracle 10g.

В соответствии с руководством (http://download -uk.oracle.com / docs / cd / B19306_01 / server.102 / b14200 / reports_7002.htm # i2095331) ключевого слова «автоматический» не существует, и Oracle 10 никогда не поддерживал «вычисляемые столбцы»

Oracle 11g поддерживает виртуальные столбцы, но они создаются с использованием GENERATED ALWAYS, даже в Oracle 11g нет automatic ключевое слово

Как вы думаете, почему это должно работать в Oracle?

1 голос
/ 21 августа 2010

Какой должна быть автоматическая колонка?Вы имели в виду чисто вычисленный, т.е. виртуальный столбец?Тогда ваше утверждение должно выглядеть так:

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.

...