plsql oracle检查约束错误

时间:2011-02-24 22:14:53

标签: oracle plsql ora-00904 check-constraints

我收到此错误:ORA-00904:“M”:标识符无效 - >如果我把('M','F')//单引号我收到此错误消息:PLS-00103:遇到以下其中一项时遇到符号“M”:   *& = - +; < />在in是mod余数不是rem返回   返回<>或!=或〜=> =< =<>和或    喜欢LIKE2_ LIKE4_ LIKEC_之间使用|| multiset批量    成员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 个答案:

答案 0 :(得分:9)

假设您使用的是相对较新版本的Oracle,我将使用新的字符串转义语法

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'')) 
    )';         
但是,我会提醒说,动态创建对象通常是一个坏主意 - 通常有更好的方法来完成这类事情。

答案 1 :(得分:6)

oracle引擎需要'F','M'。由于它嵌入在一个字符串中,你必须使用类似pascal的转义作为引号,试试这个:

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 :(得分:2)

更改CHECK约束列表以使用单引号:

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

Oracle中的字符常量用单引号括起来,而不是双引号。