【问题标题】:plsql oracle check in constraint errorplsql oracle检查约束错误
【发布时间】:2011-02-24 22:14:53
【问题描述】:

我收到此错误:ORA-00904: "M": invalid identifier --> if I put ('M','F') //single quotes 我得到这个错误信息:PLS-00103: Encountered the symbol "M" when expecting 以下之一: * & = - + ; > at in 是 mod 余数不是 rem 返回 返回 或 != 或 ~= >= 和 or 喜欢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")) 


    )';         

【问题讨论】:

    标签: oracle plsql ora-00904 check-constraints


    【解决方案1】:

    假设您使用的是相对较新的 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'')) 
        )';         
    

    然而,我要提醒的是,动态创建对象通常是一个坏主意——通常有更好的方法来完成这类事情。

    【讨论】:

      【解决方案2】:

      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'')) 
          )';         
      

      它会随心所欲地运行。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多