6

我收到此错误:ORA-00904: "M": invalid identifier --> if I put ('M','F') //单引号我收到此错误消息:PLS-00103: Encountered the symbol "M"当期待以下之一时:* & = - + ; </ > at in is mod 余数 not rem return 返回 <> or != or ~= >= <= <> and or like 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")) 


    )';         
4

3 回答 3

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

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

于 2011-02-24T22:33:34.957 回答
6

预言机引擎需要“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'')) 
    )';         

它会随心所欲地运行。

于 2011-02-24T22:29:24.617 回答
2

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

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

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

于 2011-02-24T22:28:50.127 回答