NUMBER(PRecision,scale)
實際值 | 數據類型 | 存儲值 |
1234567.89 | Number | 1234567.89 |
1234567.89 | Number(8) | 1234567 |
1234567.89 | Number(6) | 出錯 |
1234567.89 | Number(9,1) | 1234567.9 |
1234567.89 | Number(9,3) | 出錯 |
1234567.89 | Number(7,2) | 出錯 |
1234567.89 | Number(5,-2) | 1234600 |
1234511.89 | Number(5,-2) | 1234500 |
1234567.89 | Number(5,-4) | 1230000 |
1234567.89 | Number(*,1) | 1234567.9 |
0.012 | Number(2,3) | 0.012 |
0.23 | Number(2,3) | 出錯 |
8. 關于precision,scale也可以作如下表述
定點數的精度(p)和刻度(s)遵循以下規則:
1)當一個數的整數部分的長度> p-s時,Oracle就會報錯
2)當一個數的小數部分的長度> s時,Oracle就會舍入。
3)當s(scale)為負數時,Oracle就對小數點左邊的s個數字進行舍入。
4)當s > p時, p表示小數點后第s位向左最多可以有多少位數字,如果大于p則Oracle報錯,小數點后s位向右的數字被舍入
與int的區別
oracle本來就沒有int類型,為了與別的數據庫兼容,新增了int類型作為number類型的子集。int類型只能存儲整數;number可以存儲浮點數,也可以存儲整數;number(8,1)存儲小數位為1位,總長度為8的浮點數,如果小數位數不足,則用0補全;number(8)存儲總長度為8的整數;int相當于number(22),存儲總長度為22的整數。
NUMBER類型的子類a)oracle本來就沒有int類型,為了與別的數據庫兼容,新增了int類型作為number類型的子集。
b)int類型只能存儲整數;number可以存儲浮點數,也可以存儲整數。
c)在oracle數據庫建表的時候,decimal,numeric不帶精度,oracle會自動把它處理成INTEGER;帶精度,oracle會自動把它處理成number。
d)Oracle只用NUMBER(m,n)就可以表示任何復雜的數字數據。
e)decimal,numeric,int等都為SQL、DB2等數據庫的數據類型,ORACLE為了兼容才將其引入;但實際上在ORACLE內部還是以NUMBER的形式將其存入。
number自增
不同于MySQL可以直接設置自增,需要建立序列,和觸發器。例:
首先,創建一張表:
CREATE TABLE example(ID Number(4) NOT NULL PRIMARY KEY,NAME VARCHAR(25));
后,自定義一個序列(sequence):
CREATE SEQUENCE example_sequenceINCREMENT BY 1 -- 每次加幾個START WITH 1 -- 從1開始計數NOMAXVALUE -- 不設置最大值NOCYCLE -- 一直累加,不循環NOCACHE -- 不建緩沖區
再創建一個觸發器:
CREATE OR REPLACE TRIGGER example_tBEFORE INSERT ON exampleFOR EACH ROWBEGINSELECT example_sequence.nextval INTO :new.id FROM dual; END;
測試一下,插入數據
insert into example(name) values('張三');insert into example(id, name) values(111,'李四');輸入查詢語句:
select t.* from EXAMPLE t
結果是:
| id | name |
| 1 | 張三 |
| 111 | 李四 |
新聞熱點
疑難解答