2017-02-23 8 views
2
create sequence student_studentid_seq 
increment by 10 
start with 100 
nocycle; 

create table student 
(studentid number(10), 
name varchar2(30) not null, 
ss# number(9) unique, 
gpa number(2,3) not null, 
    constraint student_studentid_pk PRIMARY KEY (studentid), 
    constraint student_gpa_ck CHECK (GPA >= 0)); 

insert into student (studentid, name, ss#, gpa) 
       values(student_studentid_seq.NEXTVAL,'Draze Katan', 323456789,1); 

receiving error message: 
Error starting at line 29 in command: 
insert into student (studentid, name, ss#, gpa) 
       values(student_studentid_seq.NEXTVAL,'Draze Katan', 323456789,1) 
Error report: 
SQL Error: ORA-01438: value larger than specified precision allowed for this column 
01438. 00000 - "value larger than specified precision allowed for this column" 
*Cause: When inserting or updating records, a numeric value was entered 
      that exceeded the precision defined for the column. 
*Action: Enter a value that complies with the numeric column's precision, 
      or use the MODIFY option with the ALTER TABLE command to expand 
      the precision. 

エラーメッセージは次の制約のために表示されます:constraint student_gpa_ck CHECK(GPA> = 0)); insert文でGPA rawに '0'を入力すると、rawが挿入されますが、それ以上の場合はエラーメッセージが表示されます。私はCHECK制約を作成しましたが、エラーメッセージを受け取っています

これは私の運動の質問の1つですが、わかりません。間違いが完全解決ではないヒントが必要です。あなたが私を助けてくれたらどうか。

+0

なぜプライマリキーにnumber(10)を使用していますか?整数でなければなりません。番号は遅いです。 –

+0

@JoeLove番号が遅いですか?いくつかのサポートデータで詳しく説明できますか? – BobC

+1

なぜGPAの 'number(2,3)'ですか?それが問題です(チェック制約ではありません)。それはどういう意味ですか?あなたが3.84と2.33のような数字であることを意味するならば、あなたは 'number(3,2)'が必要です。 3は「3桁の有効数字」を意味し、2は「...最後の2つは小数点以下を意味する」を意味する。 – mathguy

答えて

5

テーブルの作成方法は、特にGPAの列に問題があります。

あなたはnumber(2, 3)を使用しています。これは、「2桁の数字と3桁の数字を持つ数字を作成する」のように見えます。

あなたは NUMBERデータタイプ、その属性および平均 number(2,3)のような何の事についてのより良い説明を見つける oracle documentation

は次の形式を使用して固定小数点数を指定します。

NUMBER(P 、s)ここで、

pは、有効数字または有効数字の最大数です。 数字です。最上位数字は、0-ゼロの最も左の数字です。 digその最下位桁は最も右の桁です。 オラクルは、精度が最大で の20進数100桁の数値の移植性を保証します。小数点の位置によっては、 の39または40の小数点に相当します。

は、スケールまたは小数点から 最下位桁までの桁数です。スケールは-84〜127の範囲で指定できます。

正のスケールは、小数点以下の小数点以下を含む小数点以下の桁数です。

負のスケールは、 小数点の左側にある有効数字の桁数です。ただし、最下位桁は含まれません。 負のスケールの場合、実際のデータは小数点の左側の指定された 個数に丸められているため、小数点以下の桁は の左側にあります。たとえば、 (10、-2)の指定は数百に丸めることを意味します。

スケールは、精度よりも大きい場合があります。最も一般的には、e表記が である場合です。 scaleがprecisionより大きい場合、精度は 小数点の右側の最大有効桁数を と指定します。たとえば、NUMBER(4,5)として定義された列は、小数点の後の最初の桁にゼロ を必要とし、小数点の後の5桁目の後にすべての値を小数点以下を丸めます。例えば

:あなたは2整数部の桁と小数点のための3が必要な場合は、1つの整数桁と2と番号が必要な場合

SQL> create table tabError(a number (2, 3)); 

Table created. 

SQL> insert into tabError values (1); 
insert into tabError values (1) 
          * 
ERROR at line 1: 
ORA-01438: value larger than specified precision allowed for this column 


SQL> insert into tabError values (0.1); 
insert into tabError values (0.1) 
          * 
ERROR at line 1: 
ORA-01438: value larger than specified precision allowed for this column 


SQL> insert into tabError values (0.01); 

1 row created. 

、あなたは、Mathguyさんのコメントによると、number(5, 3)を必要としますか、小数は、number(3,2)が必要です。

+1

Oracleはそのようなナンセンスの作成を拒否していませんか?奇妙な。 – dnoeth

+0

@dnoethこのような場合にOracleが何をするのかを詳しく説明する最新のリンクを追加しました。 – Aleksej

+1

@dnoeth - それはなぜナンセンスですか? 'NUMBER(2,3)'は、0.001から0.099までの数字の正しいデータ型です。小数点の右側に小数点以下3桁の「位取り」と、有効数字2桁の「精度」を意味します。 OPをこれを間違って使っている(違ったことを意味すると思っても)、ナンセンスにはなりません。 – mathguy

関連する問題