6

次のエラーが表示されます: ORA-00904: "M": 無効な識別子 --> 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_ between using || multiset bulk member 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')) 
    )]';         

新しい構文を使用したくない場合は、二重引用符ではなく、2つの連続した一重引用符が必要になります。

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 に答える