- mr ng nh nh t; ấ
7.3.Các Ki ud li uc ả 7.3.1 Ki u CHAR ể
7.3.1. Ki u CHAR ể
Ki u ể CHAR dùng đ khai báo m t chu i có chi u dài c đ nh, khi khai báo bi n ho c c t ki u ể ộ ỗ ề ố ị ế ặ ộ ể CHAR v iớ chi u dài ch đ nh thì t t c các m c tin c a bi n hay c t này đ u có cùng chi u dài đề ỉ ị ấ ả ụ ủ ế ộ ề ề ược ch đ nh. Cácỉ ị m c tin ng n h n Oracle s t đ ng thêm vào các kho ng tr ng cho đ chi u dài. Oracle không cho phépụ ắ ơ ẽ ự ộ ả ố ủ ề gán m c tin dài h n chi u dài ch đ nh đ i v i ki u ụ ơ ề ỉ ị ố ớ ể CHAR. Chi u dài t i đa cho phép c a ki u ề ố ủ ể CHAR là 255 byte
7.3.2. Ki u VARCHAR2 ể
Ki u ể VARCHAR2 dùng đ khai báo chu i ký t v i chi u dài thay đ i. Khi khai báo m t bi n ho c c tể ỗ ự ớ ề ổ ộ ế ặ ộ ki u ể VARCHAR2 ph i ch ra chi u dài t i đa, các m c tin ch a trong bi n hay c t ki u ả ỉ ề ố ụ ứ ế ộ ể VARCHAR2 có chi u dài th c s là chi u dài c a m c tin. Oracle không cho phép gán ề ự ự ề ủ ụ
Oracle c b n - SQL và PL/SQL ơ ả
m c tin dài h n chi u dài t i đa ch đ nh đ i v i ki u ụ ơ ề ố ỉ ị ố ớ ể VARCHAR2. Chi u dài t i đa ki u ề ố ể VARCHAR2 là 2000 byte.
7.3.3. Ki u VARCHAR ể
Hi n t i Oracle xem ki u ệ ạ ể VARCHAR2 và VARCHAR là nh nhau, tuy nhiên Oracle khuyên nên ư dùng VARCHAR2. Oracle d đ nh trong tự ị ương lai dùng ki u ể VARCHAR đ ch a các chu i v i ể ứ ỗ ớ chi u dài bi n đ i, nh ng trong phép so sánh s đề ế ổ ư ẽ ược ch đ nh theo nhi u ng nghĩa khác ỉ ị ề ữ nhau.
7.3.4. Ki u NUMBER ể
Ki u s c a Oracle dùng đ ch a các m c tin d ng s dể ố ủ ể ứ ụ ạ ố ương, s âm, s v i d u ch m đ ng. ố ố ớ ấ ấ ộ
NUMBER(p, s)
p S ch s trố ữ ố ước d u ch m th p phân (precision), p t 1 ấ ấ ậ ừ
đ n 38 ch s ế ữ ố
s S các ch s tính t d u ch m th p phân v bên ph i ố ữ ố ừ ấ ấ ậ ề ả
(scale), s t -84 đ n 127 ừ ế
NUMBER(p) S có d u ch m th p phân c đ nh v i precision b ng p và ố ấ ấ ậ ố ị ớ ằ
scale b ng 0 ằ
NUMBER S v i d u ch m đ ng v i precision b ng 38. Nh r ng ố ớ ấ ấ ộ ớ ằ ớ ằ
scale không được áp d ng cho s v i d u ch m đ ng. ụ ố ớ ấ ấ ộ
Ví d sau cho th y cách th c Oracle l u tr d li u ki u s tùy theo cách đ nh precision và ụ ấ ứ ư ữ ữ ệ ể ố ị scale khác nhau. D li u th c ữ ệ ự Ki u ể Giá tr l u tr ị ư ữ 7456123.89 NUMBER 7456123.89 7456123.89 NUMBER(9) 7456123 7456123.89 NUMBER(9,2) 7456123.89 7456123.89 NUMBER(9,1) 7456123.8 7456123.89 NUMBER(6) Không h p l ợ ệ 7456123.8 NUMBER(15,1) 7456123.8 7456123.89 NUMBER(7,-2) 7456100 7456123.89 NUMBER(-7,2) Không h p l ợ ệ 7.3.5. Ki u FLOAT ể
Dùng đ khai báo ki u s d u ch m đ ng, v i đ chính xác th p phân 38 hay đ chính xác nh phân là 126.ể ể ố ấ ấ ộ ớ ộ ậ ộ ị
FLOAT(b) Khai báo ki u d u ch m đ ng v i đ chính xác nh phân là b, b t 1 đ n 126. Có th chuy nể ấ ấ ộ ớ ộ ị ừ ế ể ể t đ chính xác nh ph n sang đ chính xác th p phân b ng cách nhân đ chính xác nh phân v i 0.30103 ừ ộ ị ậ ộ ậ ằ ộ ị ớ 7.3.6. Ki u LONG ể
Dùng đ khai báo ki u chu i ký t v i đ dài bi n đ i, chi u dài t i đa c a ki u ể ể ỗ ự ớ ộ ế ổ ề ố ủ ể LONG là 2 gigabyte. Ki uể
LONG thường được dùng đ ch a các văn b n. ể ứ ả Có m t s h n ch khi dùng ki u ộ ố ạ ế ể LONG
M t table không th ch a nhi u h n m t c t ki u ộ ể ứ ề ơ ộ ộ ể LONG
D li u ki u ữ ệ ể LONG không th tham gia vào các ràng bu c toàn v n, ngo i tr ki m tra ể ộ ẹ ạ ừ ể
NULL và khác NULL
Không th index m t c t ki u ể ộ ộ ể LONG
Không th truy n tham s ki u ể ề ố ể LONG cho hàm ho c th t c ặ ủ ụ Các hàm không th tr v d li u ki u ể ả ề ữ ệ ể LONG
Trong câu l nh SQL có truy c p các c t ki u ệ ậ ộ ể LONG, thì vi c c p nh t ho c khóa các ệ ậ ậ ặ b ng ch cho phép trong cùng m t CSDL ả ỉ ộ
Ngoài ra, các c t ki u ộ ể LONG không được tham gia trong các thành ph n sau c a câu l nh ầ ủ ệ SQL
Các m nh đ ệ ề WHERE, GROUP BY, ORDER BY, CONNECT BY ho c v i tác t ặ ớ ử
DISTINCT trong câu l nh ệ SELECT
Các hàm s d ng trong câu l nh SQL nh ử ụ ệ ưSUBSTR, INSTR
Trong danh sách l a ch n c a câu l nh ự ọ ủ ệ SELECT có s d ng m nh đ ử ụ ệ ềGROUP BYTrong danh sách l a ch n c a câu h i con, câu h i có s d ng các toán t t p h p ự ọ ủ ỏ ỏ ử ụ ử ậ ợ Trong danh sách l aự ch n c a câu l nh ọ ủ ệ CREATE TABLE AS SELECT
7.3.7. Ki u DATE ể
Dùng đ ch a d li u ngày và th i gian. M c dù ki u ngày và th i gian có th để ứ ữ ệ ờ ặ ể ờ ể ược ch a trong ki u ứ ể CHAR
và NUMBER.
V i giá tr ki u ớ ị ể DATE, nh ng thông tin đữ ượ ưc l u tr g m th k , năm, tháng, ngày, gi , phút, giây. Oracleữ ồ ế ỷ ờ không cho phép gán giá tr ki u ngày tr c ti p, đ gán giá tr ki u ngày, b n ph i dùng ị ể ự ế ể ị ể ạ ả TO_DATE để chuy n giá tr ki u chu i ký t ho c ki u s . ể ị ể ỗ ự ặ ể ố
N u gán m t giá tr ki u ngày mà không ch th i gian thì th i gian m c đ nh là 12 gi đêm, N u gán giá trế ộ ị ể ỉ ờ ờ ặ ị ờ ế ị ki u ngày mà không ch ra ngày, thì ngày m c đ nh là ngày đ u c a tháng. Hàm ể ỉ ặ ị ầ ủ SYSDATE cho bi t ngày vàế th i gian h th ng. ờ ệ ố
Tính toán đ i v i ki u ngày ố ớ ể
Đ i v i d li u ki u ngày, b n có th th c hi n các phép toán c ng và tr . Ví d : ố ớ ữ ệ ể ạ ể ự ệ ộ ừ ụ
SYSDATE+1 ngày hôm sau SYSDATE-7 cách đây m t tu n ộ ầ
SYSDATE+(10/1440) mười phút sau
Ngày Julian: Là giá tr s cho bi t s ngày k t ngày 1 tháng giêng năm 4712 trị ố ế ố ể ừ ước công nguyên. Ví d : ụ
SELECT TO_CHAR (TO_DATE('01-01-1992', 'MM-DD-YYYY'), 'J') JULIAN FROM DUAL; FROM DUAL;
K t qu : ế ả
JULIAN 2448623 2448623
Oracle c b n - SQL và PL/SQL ơ ả
7.3.8. Ki u RAW và ki u LONG RAW ể ể
Ki u ể RAW và LONG RAW dùng đ ch a các chu i byte, các d li u nh phân nh hình nh, âm thanh. Cácể ứ ỗ ữ ệ ị ư ả d li u ki u ữ ệ ể RAW ch có th gán ho c truy c p ch không đỉ ể ặ ậ ứ ược th c hi n các thao tác nh đ i v i chu iự ệ ư ố ớ ỗ ký t . ự
Ki u ể RAW gi ng nh ki u ố ư ể VARCHAR2 và ki u ể LONG RAW gi ng ki u ố ể LONG, ch khác nhau ch Oracleỉ ở ổ t đ ng chuy n đ i các giá tr ki u ự ộ ể ổ ị ể CHAR, VARCHAR2 và LONG gi a t p h p ký t c a CSDL và t p ký tữ ậ ợ ự ủ ậ ự c a các ng d ng. ủ ứ ụ
7.3.9. Ki u ROWID ể
M i m u tin trong CSDL có m t đ a ch có ki u ỗ ẫ ộ ị ỉ ể ROWID. ROWID bao g m các thành ph n: ồ ầ
block.row.file.
V i ớ
block Chu i h hexa cho bi t block ch a row ỗ ệ ế ứ
row Chu i h hexa cho bi t row trong block ỗ ệ ế
file Chu i h hexa cho bi t database file ch a block ỗ ệ ế ứ
Ví d : ụ
0000000F.0000.0002
Row đ u tiên trong block 15 c a data file th hai. ầ ủ ứ 7.3.10. Ki u MLSLABEL ể
Ki u MLSLABEL dùng đ ch a label d ng nh phân mà Oracle dùng đ đ m b o ho t đ ng c a b n thânể ể ứ ạ ị ể ả ả ạ ộ ủ ả h th ng. ệ ố
7.3.11. Chuy n đ i ki u ể ổ ể
Chuy n đ i m c đ nh ể ổ ặ ị
Nói chung m t bi u th c không th g m các giá tr thu c nhi u ki u khác nhau, tuy nhiên Oracle cho phépộ ể ứ ể ồ ị ộ ề ể chuy n đ i gi ã các ki u d li u. Oracle t đ ng chuy n ki u c a d li u trong m t s trể ổ ư ể ữ ệ ự ộ ể ể ủ ữ ệ ộ ố ường h p sau ợ
Khi INSERT ho c ặ UPDATE gán giá tr cho c t có ki u khác, Oracle s t đ ng chuy n ị ộ ể ẽ ự ộ ể giá tr sang ki u c a c t. ị ể ủ ộ
Khi s d ng các hàm ho c các toán t mà các tham s có ki u không tử ụ ặ ử ố ể ương thích thì Oracle s t đ ng chuy n ki u. ẽ ự ộ ể ể
Khi s d ng toán t so sánh mà các giá tr có các ki u khác nhau, Oracle s t đ ng ử ụ ử ị ể ẽ ự ộ chuy n ki u. ể ể
Ví d 1: ụ
SELECT ename FROM emp WHERE hiredate = '12-MAR-1993'
Oracle đã t đ ng chuy n chu i ự ộ ể ỗ '12-MAR-1993' sang ki u ể DATE trong phép so sánh Ví d 2: ụ
SELECT ename FROM emp WHERE ROWID = '00002514.0001.0001'
Oracle đã t đ ng chuy n chu i ự ộ ể ỗ '00002514.0001.0001' sang ki u ể ROWID trong phép so sánh
Ngườ ử ụi s d ng t chuy n đ i ự ể ổ
Oracle cung c p các hàm đ chuy n đ i ki u, ví d ấ ể ể ổ ể ụ
TO_NUMBER Chuy n sang ki u s ể ể ố
TO_CHAR Chuy n sang ki u ký t ể ể ự
TO_DATE Chuy n sang ki u ngày ể ể (xem ph n tra c u các hàm và th t c) ầ ứ ủ ụ 7.4.RÀNG BU C D LI U TRONG TABLE Ộ Ữ Ệ Các d ng constraint g m: ạ ồ NULL/NOTNULL UNIQUE PRIMARYKEY
FOREIGNKEY (Referential Key)
CHECK
7.4.1. NULL/NOT NULL
Là ràng bu c column tr ng ho c không tr ng. ộ ố ặ ố Ví d m nh đ ràng bu c: ụ ệ ề ộ
CREATE TABLE DEPT (
DEPTNO NUMBER(2) NOT NULL,
DNAME CHAR(14),
LOC CHAR(13),
CONSTRAINT DEPT_PRIMARY_KEY PRIMARY KEY (DEPTNO));
7.4.2. UNIQUE
Ch ra ràng bu c duy nh t, các giá tr c a column ch trong m nh đ ỉ ộ ấ ị ủ ỉ ệ ềUNIQUE trong các row c a table ph i có giá tr khác bi t. Giá tr null là cho phép nêu ủ ả ị ệ ị UNIQUE d a trên m t c t. ự ộ ộ Ví d : ụ
CREATE TABLE DEPT (
DEPTNO NUMBER(2),
DNAME CHAR(14),
LOC CHAR(13),
CONSTRAINT UNQ_DEPT_LOC UNIQUE(DNAME, LOC));
7.4.3. PRIMARY KEY
Ch ra ràng bu c duy nh t (gi ng ỉ ộ ấ ố UNIQUE), tuy nhiên khoá là d ng khoá ạ UNIQUE c p cao ấ nh t. M t table ch có th có m t ấ ộ ỉ ể ộ PRIMARY KEY. Các giá tr trong ị PRIMARY KEY ph i ả NOT NULL.
Oracle c b n - SQL và PL/SQL ơ ả
Cú pháp khi đặt CONSTRAINT ở mức TABLE
[CONSTRAINT constraint_name] PRIMARY KEY (column, Column..)
Cú pháp khi đặt CONSTRAINT ở mức COLUMN
[CONSTRAINT constraint_name] PRIMARY KEY
7.4.4. FOREIGN KEY ( Referential )
Ch ra m i liên h ràng bu c tham chi u gi a table này v i table khác, ho c trong chính 1 table. Nó ch raỉ ố ệ ộ ế ữ ớ ặ ỉ m i liên h cha-con và ch ràng bu c gi a ố ệ ỉ ộ ữ FOREIGN KEY b ng này v i ả ớ PRIMARY KEY ho c ặ UNIQUE
Key c a b ng khác. Ví d quan h gi a ủ ả ụ ệ ữ DEPT và EMP thông qua trường DEPTNO.
T khoá ừ ON DELETE CASCADE được h đ nh trong d ng khoá này đ ch khi d li u cha b xoá (trongỉ ị ạ ể ỉ ữ ệ ị b ng ả DEPT) thì d li u con cũng t đ ng b xoá theo (trong b ng ữ ệ ự ộ ị ả EMP).
7.4.5. CHECK
Ràng bu c ki m tra giá tr . ộ ể ị Ví d : ụ
CREATE TABLE EMP
(EMPNO NUMBER NOT NULL CONSTRAINT PK_EMP PRIMARY KEY, ENAME VARCHAR2(10) CONSTRAINT NN_ENAME NOT NULL ENAME VARCHAR2(10) CONSTRAINT NN_ENAME NOT NULL CONSTRAINT UPPER_ENAME CHECK (ENAME =
UPPER(ENAME)), JOB VARCHAR2(9), JOB VARCHAR2(9),
MGR NUMBER CONSTRAINT FK_MGR REFERENCES SCOTT.EMP(EMPNO), SCOTT.EMP(EMPNO),
HIREDATE DATE DEFAULT SYSDATE, SAL NUMBER(10,2) CONSTRAINT CK_SAL NUMBER(10,2) CONSTRAINT CK_SAL
CHECK(SAL>500),
COMM NUMBER(9,0) DEFAULT NULL,
DEPTNO NUMBER(2) CONSTRAINT NN_DEPTNO NOT NULL
CONSTRAINT FK_DEPTNO REFERENCES SCOTT.DEPT(DEPTNO);
7.5.L NH DDL CAN THI P T I TABLE Ệ Ệ Ớ7.5.1. Ch nh s a c u trúc table ỉ ử ấ