plsql oracle检查约束错误

Posted

技术标签:

【中文标题】plsql oracle检查约束错误【英文标题】:plsql oracle check in constraint error 【发布时间】: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")) 


    )';         

【问题讨论】:

【参考方案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 中的字符常量用单引号括起来,而不是双引号。

【讨论】:

以上是关于plsql oracle检查约束错误的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据导入时,提示违反唯一约束性?

Oracle - 在插入前触发检查约束

Oracle SQL 检查存在约束

oracle 如何设置检查约束

可以调试但不能检查或监视 Oracle 中巨大的 PlSql 包中的变量

Oracle错误集锦:PLSQL无法直连64位Oracle11g数据库