2011-12-04 13 views
3

読んでいただきありがとうございます。私は現在、架空の店舗について約10のエンティティのデータベースを作成しています。したがって、主体はCustomer_Orderであり、このトリガーの目的は、Customer_orderで行が挿入または更新されたときに、顧客の郵便番号がヌルでないことをチェックすることです。 nullの場合、トリガーは警告をスローする必要があります。Oracleトリガーステートメント条件が何らかの理由で満たされていない場合は、

CREATE OR REPLACE TRIGGER Check_Order 
BEFORE INSERT OR UPDATE ON Customer_Order 
for each row 
DECLARE ShipAddress customer.ship_address.post_code%TYPE; 
BEGIN 
IF (ShipAddress = '') then 
RAISE_APPLICATION_ERROR(-20103, 'Shipping Address is empty'); 
END IF; 
END; 
. 
run 

私は「エルス」はありません知っているが、私はそれがないテーブルを更新する以外に他のアクションを持っていません。 ShipAddressについて心配する必要はありません。より簡単な属性でこれを試しました。単にトリガーしません。行が挿入または更新されるため、条件を満たすことはできません。ステートメントレベルのトリガーの代わりにそれぞれを使用しているためですか?

答えて

6

Oracleは、空の文字列(長さがゼロの文字列)をNULLに変換します。したがって、あなたの列には''という値は決してありません。したがって、IF文は決して真実ではありません。

IF (ShipAddress IS NULL) then 
    RAISE_APPLICATION_ERROR(-20103, 'Shipping Address is empty'); 
END IF; 

しかし、あなたは本当に、本当にベンのアドバイスに従うと、単に代わりにそれをチェックするためにトリガーを使用しての、NOT NULLとしてその列を宣言する必要があります:あなたは、そのトリガーにNULLをチェックする必要があります。

編集

あなたがテーブルの上にチェック制約とNULLでないチェックを行うことができます。

CREATE TABLE FOO 
(
    shipping_address ship_addres, 
    CONSTRAINT check_post_code CHECK (shipping_address.post_code IS NOT NULL) 
) 
+0

ああ、私は参照してください。私はaddressTypeと呼ばれる型を作成したので、nullでないと宣言する方法を実際には理解できませんでした。私のシステムでは、すべての顧客と従業員( "Person"のサブタイプ)は、それ自身のさまざまな値を含むaddressTypeを継承しており、オブジェクトテーブルを作成せずにNOT NULLとして実際に設定する方法を決して決めることはできません。あなたが方法を知っているなら、それを分かち合う時間があればそれを感謝します。ご協力いただきありがとうございます! –

+0

@MoMoosa:あなたのタイプの属性を宣言する方法はありません。 –

1

オラクルは3値ロジックを使用しています(「PAYM0001」のような) nullは存在しません。等価演算子ではnullをテストできません。ヌルをテストするにはIF :new.ShipAddress is nullを使用してください。

ます。また、トリガーで誤っ列を参照している。そこは何も宣言する必要はないですし、あなたが:new:old値を参照する必要があります。Thisが良いリソースです。

shipaddressが決してnullにならないように、表に制約を入れることによって、NULLを許可しないほうがよいでしょう。 hereを参照してください。したがって、

alter table my_table modify shipaddress not null; 

テーブルの場所に追加します。しかし、テーブルを作成するときに制約を追加する方が良いでしょう。これを行うと、トリガーを評価する必要がないため、やや早いものになります。

EDIT:

shipaddressは、おそらくカンマ区切り完全なアドレス、というのリングを持っていますか?私は間違いなく、アドレスの各部分を別のものにすることをお勧めします。address1address2address3towncountypostcode。私はイギリス人なので、必要に応じてstatezipなどに変更してください。これにより、データのクエリや操作が大幅に簡単になります。

+0

は、私は、テーブルを変更してあると、それは非常にうまく機能、ありがとうございます。私はshipAddressについて説明しておかなければなりません。町、郡、郵便番号だけでなく、通りや番号が入っているaddressTypeのaddressTypeのものです。私は完全に同意する、私はアドレスのための単一の文字列ラインを持っている他の学生を見たので、少なくとも私はこの部分を右にしています。あなたの助けをありがとう! –

関連する問題