проверка оракула plsql в ошибке ограничения - PullRequest
5 голосов
/ 25 февраля 2011

Я получаю эту ошибку: ORA-00904: "M": неверный идентификатор -> если я поставил ('M', 'F') // одинарную кавычку, я получил это сообщение об ошибке: PLS-00103: Обнаружил символ "M" при ожидании одного из следующего: * & = - +; </> в моде остаток не реми возврат возвращая <> или! = или ~ => = <= <> и или как LIKE2_ LIKE4_ LIKEC_ между использованием || многосетевой объем участник SUBMULTISET_ -> если я уберу ограничение, таблица будет создана нормально

это мой код

EXECUTE IMMEDIATE 'CREATE TABLE dependents
    ( Id    NUMBER(6)
    , FirstName     VARCHAR2(20)
    , LastName      VARCHAR2(25)
     CONSTRAINT     dep_last_name_nn  NOT NULL
    , Birthdate Date
    , Relation VARCHAR2(20)
    , Gender char(1) 
    , RelativeId Number(6) 
    , CONSTRAINT pk_dependent primary key (Id) 
    , CONSTRAINT ck_gender CHECK(Gender in("F","M")) 


    )';         

Ответы [ 3 ]

9 голосов
/ 25 февраля 2011

Если вы используете относительно новую версию Oracle, я бы использовал новый синтаксис escape-строки

EXECUTE IMMEDIATE q'[CREATE TABLE dependents
    ( Id    NUMBER(6)
    , FirstName     VARCHAR2(20)
    , LastName      VARCHAR2(25)
      CONSTRAINT    dep_last_name_nn  NOT NULL
    , Birthdate Date
    , Relation VARCHAR2(20)
    , Gender char(1) 
    , RelativeId Number(6) 
    , CONSTRAINT pk_dependent primary key (Id) 
    , CONSTRAINT ck_gender CHECK(Gender in('F','M')) 
    )]';         

Если вы не хотите использовать новый синтаксис, вам понадобятся два последовательныходиночные кавычки, а не двойные кавычки

EXECUTE IMMEDIATE 'CREATE TABLE dependents
    ( Id    NUMBER(6)
    , FirstName     VARCHAR2(20)
    , LastName      VARCHAR2(25)
      CONSTRAINT    dep_last_name_nn  NOT NULL
    , Birthdate Date
    , Relation VARCHAR2(20)
    , Gender char(1) 
    , RelativeId Number(6) 
    , CONSTRAINT pk_dependent primary key (Id) 
    , CONSTRAINT ck_gender CHECK(Gender in(''F'',''M'')) 
    )';         

Я бы, однако, предупредил, что динамическое создание объектов, как правило, плохая идея - как правило, есть более эффективные способы для достижения такого рода вещи.

6 голосов
/ 25 февраля 2011

Двигатель оракула ожидает «F», «M». Поскольку он встроен в строку, для кавычек необходимо использовать экранирующий символ, подобный паскалю, попробуйте следующее:

EXECUTE IMMEDIATE 'CREATE TABLE dependents
    ( Id    NUMBER(6)
    , FirstName     VARCHAR2(20)
    , LastName      VARCHAR2(25)
     CONSTRAINT     dep_last_name_nn  NOT NULL
    , Birthdate Date
    , Relation VARCHAR2(20)
    , Gender char(1) 
    , RelativeId Number(6) 
    , CONSTRAINT pk_dependent primary key (Id) 
    , CONSTRAINT ck_gender CHECK(Gender in(''F'',''M'')) 
    )';         

Он будет работать так, как вы хотите.

2 голосов
/ 25 февраля 2011

Измените список ограничений CHECK, чтобы использовать одинарные кавычки:

CONSTRAINT ck_gender CHECK(Gender in(''F'',''M''))

Символьные константы в Oracle заключены в одинарные, а не двойные кавычки.

...