2012-04-04 22 views
3

私は初めてoracleを使用していますが、費用に関する詳細を格納するExpenseReportというテーブルがあります。ORACLE Null値を許可する制約IF

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

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') 
) 
+0

ない限り、あなたの問題は何ですか? –

+0

私はApprUserNoをNullableにする必要があります。ERStatus = 'Pending' –

+0

これを実行しようとするとエラーが発生します。 –

答えて

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'), 
+0

DEMSありがとう、あなたは私のお尻を救った!みんなに乾杯!多くの愛。 –

0

このすべての午前中にソートするためにしようとしてきた、ヌルがいただければ幸いですApprUserNo IF ERStatus =「PENDING」 任意の助けのために許可されたい:

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

はTABLEおよびSQL条件を作成するための構文を文書のOracleマニュアルの章を再読み込みしてくださいする必要があります:

は、その後、あなたはここで別のエラーが発生しています。

+1

さらに、最初にフィールドをNULLにすることができます。 OPはそれが 'NOT NULL'として現在持っていますが、それはOPがそれにNULLsを必要とする場合に特有のものです... – MatBailie

+0

@Dems:良いキャッチ、私は列定義に注意を払っていませんでした。チェック制約。 –

+0

また、なぜあなたの最初の制約はありませんか(ERStatus = 'PENDING'またはAppUserNo IS NULL)?何か不足していますか? * – MatBailie

関連する問題