1

ユーザーが数値データ型 (電話番号) に 11 桁しか入力できないという制約を設定しようとしています。私はもう試した

alter table "booyeah" add constraint
"booyeah_CC1" check ( LENGTH("PHONE_NO") = 11)
/

alter table "booyeah" add constraint
"booyeah_CC1" check ( PRECISION("PHONE_NO") = 11)
/

しかし、エラーが発生しました。最初のものでは、文字の長さを検出していないためエラーが発生し続けましたが、2番目のものでは無効な識別子が返されました。

助けてくれてありがとう!

4

2 に答える 2

3

その列のデータ型を に設定しますvarchar(11)。毎回正確に 11 文字でなければならない場合、チェック制約により次のことが保証されますcheck (length(phone_no) = 11)。長さと「数値」(すべて数字、文字なし) を保証するには、次を使用します。

check (length(phone_no) = 11 and 
       regexp_like(phone_no, '^[[:digit:]]{11}$')
)

数値型を使用する必要がある場合 (これは悪い考えですが)、最善の策はおそらく数値 (11,0) です。

チェック制約は、有効な入力の範囲を制限するのに役立ちますが、先行ゼロを格納する数値型はありません。00125436754のようなものが有効な電話番号である場合、不要で回避可能なフープをジャンプする必要があります。

于 2013-05-16T01:16:14.423 に答える
0

You can add the following check constraint:

... check (length(n||'')=11)

This check constraint is sufficiently simple. And you don't have to change the data type from number to varchar2, and don't have to check the input contains character other than digits.

I created simple table and checked whether it works properly:

create table t (n number check (length(n||'')=11));

insert into t values (1234567890); -- 10 digits
=> ORA-02290: check constraint (USER_4_552B1.SYS_C001297489) violated : insert into t values (1234567890)

insert into t values (12345678901);
=> Record Count: 0; Execution Time: 1ms

insert into t values (123456789012); -- 12 digits
=> ORA-02290: check constraint (USER_4_552B1.SYS_C001297489) violated : insert into t values (123456789012)

Another way is to use log of base 10: (looks more complicated)

... check (trunc(log(10,phone_no)) = 10)

If the given number has 11 digits, its log value would be 10.xxxx.

于 2013-05-16T01:18:06.697 に答える