2016-11-15 8 views
1

トリガーの仕組みと、与えられたエクササイズで適切に書き込む方法を学びたいと思っています。私は、Oracleのバージョン4.2でSQL Developperを使用しています。トリガーオラクルの演算子LIKEを使用して文字列フォーマットを尊重する

私はこれらのフィールドを持つテーブルPERSONを持っています: 'matricule'、 'pmatricule'、 'typpers'。

「typpers」は、その人物が学生(E)、教授(P)またはその他(X)であることを示す手紙です。 'matricule'は3〜7の数字の連鎖で、 'matricule'は3〜6の数字の連鎖が続く 'p'の連鎖です。例: 'p145'、 'p123456'

テーブル「PERSON」に行を挿入するときに、「matricule」または「pmatricule」の形式が尊重されているかどうかをチェックする必要があります。

CREATE OR REPLACE TRIGGER new_matricule 
    BEFORE INSERT ON PERSONNE 
    FOR EACH ROW 

DECLARE 
    new_pmatricule PERSONNE.pmatricule%type; 
BEGIN 
    IF((:NEW.TYPPERS = 'P' OR :NEW.TYPPERS = 'X') AND :NEW.pmatricule NOT LIKE 'p%______') THEN 
    RAISE_APPLICATION_ERROR(-20100, 'pmatricule format is not good'); 
    END IF; 
END; 

私のトリガーは、私が「52P」などの「pmatricule」形式を挿入しようとしている場合は動作しますが、それはまた、私はこのような「P145」として挿入しようとしていたときにアクティブになります。

私の構文が十分ではないと思っていますが、私はそれを行うための適切な構文を見つけていません。

アイデアはありますか?

答えて

1

最初にinを使用して式の最初の部分の構文を単純化します。次に、文字数をカウントする場合は、'%'を省略してください。これは次のようなものです:

IF((:NEW.TYPPERS IN ('P', 'X') AND :NEW.pmatricule NOT LIKE 'p______') THEN 
    RAISE_APPLICATION_ERROR(-20100, 'pmatricule format is not good'); 
    END IF; 

これは、 "p"の後に6文字が続く必要があると言います。あなたのバージョンは「少なくとも6文字」となっています。

あなたはAPに続く2つの文字が必要な場合、それは次のようになります。

:NEW.pmatricule NOT LIKE '__p' 

「P」に続いて、任意の数は次のようになります。

:NEW.pmatricule NOT LIKE '%p' 

あなたは、より高度なパターンマッチングをしたい場合は、おそらくregexp_like()を使用します。はるかに汎用性があります。

EDIT:あなたのコメントに基づいて

、あなたがしたい:

where regexp_like(:NEW.pmatricule, '^p[0-9]{3,6}$') 

は、これはおそらく、条件を記述するための最も簡単な方法です。あなたの答えのための

where :NEW.pmatricule like 'p___' or 
     :NEW.pmatricule like 'p____' or 
     :NEW.pmatricule like 'p_____' or 
     :NEW.pmatricule like 'p______' 
+0

おかげで、私は私のせいを見たが、私が書くしようとしていることに続く「P」である:あなたが3-6 文字を意味する場合

、あなたが面倒を使用することができます少なくとも3つの数字と最大6つの数字。 この場合、regex_like()を使わないと簡単な構文はありませんか? –

+0

それは私が考えていた理由ですが、それはとても醜いです。しかし、あなたはその '_'を数字で置き換えることしかできないと確信していますか?あなたは '文字'と言うことができますし、文字は文字や数字です。 (二重の投稿を申し訳ありませんが、最初の回答は編集できません) –

+0

@MbrMbr。 。 。 '_ 'は*任意の*文字を置き換えることができます。私はその点でその答えがはっきりしていると思った。 –

関連する問題