oracle - references - unique constraint plsql
plsql orĂ¡culo check in constraint error (3)
Cambie la lista de restricciones CHECK para usar comillas simples:
CONSTRAINT ck_gender CHECK(Gender in(''''F'''',''''M''''))
Las constantes de caracteres en Oracle están encerradas en comillas simples, no en comillas dobles.
Obtengo este error: ORA-00904: "M": identificador inválido -> si puse (''M'', ''F'') // cita simple, recibí este mensaje de error: PLS-00103: Encontré el símbolo "M" cuando se espera uno de los siguientes: * & = - +; </> en in es mod remainder no rem return return <> o! = o ~ => = <= <> y / o LIKE2_ LIKE4_ LIKEC_ entre en usando || miembro masivo multiset SUBMULTISET_ -> si elimino la restricción, la tabla se creará normalmente
este es mi código
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"))
)'';
El motor de oráculo espera ''F'', ''M''. Dado que está incrustado en una cadena, debe usar escape pascal para comillas, intente esto:
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''''))
)'';
Se ejecutará como lo desee.
Suponiendo que está utilizando una versión relativamente reciente de Oracle, utilizaría la nueva sintaxis de escape de cadenas
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''))
)]'';
Si no desea utilizar la nueva sintaxis, necesitará dos comillas simples consecutivas, no una comilla doble
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''''))
)'';
Sin embargo, advertiría que la creación dinámica de objetos generalmente es una mala idea; en general, hay mejores formas de lograr este tipo de cosas.