4

私は初めて oracle を使用しています。経費に関する詳細を格納する ExpenseReport というテーブルがあります。

ApprUserNo IF ERStatus = 'PENDING' に Null を許可したい

CREATE TABLE ExpenseReport 
(
  ERNo           NUMBER(10) NOT NULL,
  ERDesc         VARCHAR2(255) NOT NULL,
  ERSubmitDate   DATE NOT NULL,
  ERStatusDate   DATE NOT NULL,
  ERStatus       VARCHAR2(8) DEFAULT 'PENDING' NOT NULL,
  SubmitUserNo   NUMBER(10) NOT NULL,
  ApprUserNo     NUMBER(10) NOT NULL CONSTRAINT BEN_Check CHECK (ERStatus LIKE('PENDING')),
  UsersUserNo    NUMBER(10) NOT NULL,
  AssetAssetNo   NUMBER(10) NOT NULL,
  PRIMARY KEY (ERNo),
  CONSTRAINT Check_ER_Date CHECK (ERStatusDate >= ERSubmitDate),
  CONSTRAINT ERStatus_Null_Exception CHECK (IF ERStatus = 'PENDING',AppUserNo = NULLABLE),
  CONSTRAINT ERStatus_Option CHECK (ERStatus = 'PENDING','APPROBED','DENIED')
)
4

2 に答える 2

8

制約を再形成する必要があります。

まず、フィールドに null を保持する場合は、他の規則に関係なく、null 許容フィールドである必要があります。

ApprUserNo     NUMBER(10)   NULL,   -- No Check Constrain

次に、 ApprUserNo を NULL にできないという制約を作成します。ErStatus = 'PENDING'

CONSTRAINT ERStatus_Null_Exception CHECK (AppUserNo IS NOT NULL OR ERStatus = 'PENDING'),
于 2012-04-04T10:47:37.837 に答える
0

これはそれを行う必要があります:

CONSTRAINT ERStatus_Null_Exception 
     CHECK (ERStatus <> 'PENDING' AND AppUserNo IS NOT NULL)



CONSTRAINT BEN_Check CHECK (ERStatus LIKE('PENDING'))
また、次のように 変更する必要があります
CONSTRAINT BEN_Check CHECK (ERStatus = 'PENDING')
。a)LIKEは関数ではなく、b)ワイルドカードなしのLIKEは意味がないためです。

次に、ここに別のエラーがあります
CONSTRAINT ERStatus_Option CHECK (ERStatus = 'PENDING','APPROBED','DENIED')

CONSTRAINT ERStatus_Option CHECK (ERStatus IN ('PENDING','APPROBED','DENIED'))

CREATETABLEおよびSQL条件の構文を文書化したOracleマニュアルの章を読み直してください。

于 2012-04-04T10:31:26.950 に答える