You are on page 1of 106

SQL v PL/SQL

C bn
Oracle c bn - SQL v PL/SQL

MC LC
MC LC ... ...1

CHNG 1. GII THIU CHUNG ... ...5


1.1. NGN NG SQL ... ..5
1.1.1. Lch s pht trin ca ngn ng SQL ... .5
1.1.2. Chun SQL ... ..5
1.2. CC KHI NIM C BN TRONG C S D LIU ... ...5
1.2.1. Cc thnh phn logic trong database... ..5
1.2.2. Cc i tng trong database ... ...6
1.2.3. Cc nhm lnh SQL c bn ... .6
1.3. C S D LIU THC HNH... ..7
1.3.1. M hnh d liu ... ..7
1.3.2. Cu trc bng d liu ... .7

CHNG 2. LNH TRUY VN C BN ... .9


2.1. CU LNH TRUY VN ... ..9
2.1.1. Quy tc vit lnh ... ...9
2.1.2. Cu lnh truy vn c bn ... ..9
2.1.3. Cc thnh phn khc ca mnh SELECT ... ..9
2.1.4. Phn bit gi tr d liu tr v ... ..10
2.1.5. Gi tr NULL ... ..11
2.2. SQL*PLUS, CNG C TNG TC LNH SQL VI DATABASE ... ...11
2.2.1. Cu lnh tng tc ca SQL*Plus ... .11
2.2.2. Phn nhm cu lnh trong SQL*Plus... ...12
2.2.3. Chi tit cc lnh SQL*Plus c bn ... .13
2.3. BI TP ... ..15

CHNG 3. TRUY VN D LIU C IU KIN ... ..17


3.1. CC GII HN TRONG TRUY VN D LIU ... ...17
3.1.1. Mnh WHERE... ...17
3.1.2. Cc ton t s dng trong mnh WHERE ... ..18
3.1.3. V d s dng cc ton t iu kin ... .19
3.2. SP XP D LIU TR V... ..20
3.2.1. Mnh ORDER BY ... ...20
3.2.2. Sp xp nhiu ct d liu tr v... ..20
3.3. BI TP ... ..21

CHNG 4. CC HM SQL ... ...23


4.1. TNG QUAN V HM SQL... ..23
4.1.1. Cu trc hm SQL ... .23
4.1.2. Phn loi hm SQL ... ...23
4.2. HM SQL THAO TC TRN TNG DNG D LIU... .24
4.2.1. Cc hm thao tc trn kiu d liu s... ..24
4.2.2. Cc hm thao tc trn kiu d liu k t... .26
4.2.3. Cc hm thao tc trn kiu d liu thi gian... .30
4.2.4. Cc hm chuyn i kiu ... ...32
4.3. HM THAO TC TRN TP HP ... ...34
4.3.1. Cc hm tc ng trn nhm ... ...34
4.3.2. Mnh GROUP BY ... ...35
4.4. MT S HM MI B SUNG TRONG Oracle9i ... ..36
4.4.1. Hm NULLIF ... .36
4.4.2. Hm COALSCE ... ..36
4.4.3. Cu lnh case ... ..36

Trang 1
Oracle c bn - SQL v PL/SQL

4.5. BI TP ... ..36


4.5.1. Hm trn tng dng d liu ... ..36
4.5.2. Hm trn nhm d liu ... ...39

CHNG 5. LNH TRUY VN D LIU M RNG... .40


5.1. KT HP D LIU T NHIU BNG ... ...40
5.1.1. Mi lin kt tng ng ... ..40
5.1.2. Mi lin kt khng tng ng ... .40
5.1.3. Mi lin kt cng ... .40
5.1.4. Lin kt ca bng vi chnh n (t thn)... .41
5.1.5. Cch biu din kt ni mi trong Oracle 9i ... ...41
5.1.6. Cc ton t tp hp ... ..42
5.2. LNH TRUY VN LNG ... ...43
5.2.1. Cu lnh SELECT lng nhau. .. ...43
5.2.2. Ton t SOME/ANY/ALL/NOT IN/EXITS ... ..43
5.3. CU TRC HNH CY ... .44
5.3.1. Cu trc hnh cy trong 1 table ... ...44
5.3.2. K thut thc hin ... ..44
5.3.3. Mnh WHERE trong cu trc hnh cy... ..45
5.4. BI TP ... ..46

CHNG 6. BIN RUNTIME ... ...50


6.1. D LIU THAY TH TRONG CU LNH ... .50
6.2. LNH DEFINE ... ..50
6.3. LNH ACCEPT ... ...51
6.4. BI TP ... ..51

CHNG 7. TABLE V CC LNH SQL V TABLE... ...52


7.1. LNH TO TABLE... 52
7.1.1. C php to bng ... 52
7.1.2. Tnh ton kch thc table (tham kho) ... 53
7.2. MT S QUY TC KHI TO TABLE ... 54
7.2.1. Quy tc t tn Object ... 54
7.2.2. Quy tc khi tham chiu n Object ... 54
7.3. Cc Kiu d liu c bn... 55
7.3.1. Kiu CHAR ... 55
7.3.2. Kiu VARCHAR2 ... 55
7.3.3. Kiu VARCHAR ... 56
7.3.4. Kiu NUMBER ... 56
7.3.5. Kiu FLOAT ... 56
7.3.6. Kiu LONG ... 56
7.3.7. Kiu DATE ... 57
7.3.8. Kiu RAW v kiu LONG RAW... 58
7.3.9. Kiu ROWID ... 58
7.3.10. Kiu MLSLABEL ... 58
7.3.11. Chuyn i kiu ... 58
7.4. RNG BUC D LIU TRONG TABLE ... 59
7.4.1. NULL/NOT NULL ... 59
7.4.2. UNIQUE ... 59
7.4.3. PRIMARY KEY ... 59
7.4.4. FOREIGN KEY ( Referential ) ... 60
7.4.5. CHECK ... 60
7.5. LNH DDL CAN THIP TI TABLE ... 60
7.5.1. Chnh sa cu trc table ... 60
7.5.2. Cc lnh DDL khc ... 61
7.5.3. Ch dn cho table ... 61
7.5.4. Thay i tn object... 62
7.5.5. Xa d liu ca table ... 62

Trang 2
Oracle c bn - SQL v PL/SQL

7.6. THNG TIN V TABLE TRONG T IN D LIU... ...62


7.7. BI TP ... ..63

CHNG 8. CC LNH THAO TC D LIU... ..64


8.1. THAO TC D LIU TRONG TABLE ... .64
8.1.1. Thm mi dng d liu ... ...64
8.1.2. Cp nht dng d liu ... .65
8.1.3. Lnh Merge... ...65
8.1.4. Xa dng d liu... .66
8.1.5. Li rng buc d liu ... ...66
8.2. LNH IU KHIN GIAO DCH... ..66
8.3. BI TP ... ..67

CHNG 9. SEQUENCE V INDEX... ...68


9.1. SEQUENCE... ...68
9.1.1. To Sequence... ..68
9.1.2. Thay i v hu sequence ... .69
9.2. INDEX... ...69
9.2.1. To index ... ...69
9.2.2. S dng index... ..69
9.3. BI TP ... ..70

CHNG 10. VIEWS ... ...71


10.1. VIEWS ... ...71
10.1.1. To view ... ..71
10.1.2. Xa cc view ... ..71
10.2. BI TP ... ...72

CHNG 11. QUYN V BO MT ... ..73


11.1. QUYN - PRIVILEGE ... .73
11.2. ROLE... ..74
11.3. SYNONYM... ...74

CHNG 12. GII THIU NGN NG PL/SQL... ..76


12.1. TNG QUAN V PL/SQL ... ...76
12.1.1. C php lnh PL/SQL ... ...76
12.1.2. Khi lnh PL/SQL ... ...76
12.2. LNH LP TRNH PL/SQL N GIN ... ...77
12.2.1. Lnh IF... ..77
12.2.2. Lnh lp LOOP khng nh trc ... ...78
12.2.3. Lnh lp LOOP c nh trc ... ...78
12.2.4. Lnh lp WHILE ... ...78
12.2.5. Lnh GOTO, nhy v iu kin ... .78
12.3. GII THIU CURSOR ... ...79
12.4. CC KIU D LIU THNG DNG... ..81
12.4.1. Kiu d liu Table ... ...81
12.4.2. Kiu d liu Record ... ...81
12.4.3. Sao kiu d liu mt dng ... ..82
12.4.4. Sao kiu d liu ca mt ct ... ..82
12.4.5. Lnh SELECT... INTO... ...82
12.5. BI TP ... ...83

CHNG 13. GII THIU PROCEDURE BUILDER ... ..84


13.1. CC THNH PHN TRONG PROCEDURE BUILDER ... ...84
13.1.1. Object Navigator ... ..84
13.1.2. Program Unit Editor... .85
13.1.3. Store Program Unit Editor ... ...85

Trang 3
Oracle c bn - SQL v PL/SQL

13.1.4. Database Trigger Edditor ... .85


13.2. CC HM, TH TC ... .86
13.2.1. To hm, th tc trn Client ... ...86
13.2.2. To hm, th tc trn Server ... .86
13.2.3. D li i vi cc hm, th tc ... ..87

CHNG 14. GII THIU CC TH TC, HM V PACKAGE ... ...88


14.1. TH TC ... ..88
14.1.1. To th tc ... ..88
14.1.2. Hu b th tc ... ...89
14.1.3. Cc bc lu gi mt th tc ... ...89
14.2. HM ... ...89
14.2.1. To hm... ...90
14.2.2. Thc hin mt hm ... .90
14.2.3. Li ch ca vic s dng hm ... ...91
14.2.4. Mt s hn ch khi s dng hm trong cu lnh SQL ... ..91
14.2.5. Hu b hm... .91
14.2.6. Hm v th tc ... ..92
14.3. PACKAGE... ...92
14.3.1. Cu trc ca package ... ...92
14.3.2. To package ... ..93
14.3.3. Hu package ... ..95
14.3.4. Li ch ca vic s dng package ... ..95
14.3.5. Mt s package chun ca Oracle ... ..96

CHNG 15. DATABASE TRIGGER ... .97


15.1. TO TRIGGER ... ..97
15.1.1. Phn loi trigger ... ...97
15.1.2. Lnh to trigger ... .98
15.1.3. S dng Procedure builder to trigger ... ...99
15.2. QUN L TRIGGER ... ...100
15.2.1. Phn bit database trigger ... ...100
15.2.2. Thay i trng thi ca database trigger ... ...101
15.2.3. Hu b trigger ... .101
15.2.4. Lu khi s dng trigger ... ..102

PH LC ... ...103
A - TI LIU THAM KHO ... .103
B - DANH MC CC HNH V... ..103

Trang 4
Oracle c bn - SQL v PL/SQL

Chng 1. GII THIU CHUNG


1.1.NGN NG SQL
1.1.1. Lch s pht trin ca ngn ng SQL
M hnh c s d liu (CSDL) quan h - RDBMS, do E.F Codd a ra vo u thp k 70. T n nay,
n lin tc pht trin tr thnh m hnh CSDL ph bin bc nht. M hnh quan h gm cc thnh phn sau:
Tp hp cc i tng v / hoc cc mi quan h Tp hp cc
x l tc ng ti cc quan h
Rng buc d liu m bo tnh chnh xc v nht qun.
SQL (Structured Query Language, c l "sequel") l tp lnh truy xut CSDL quan h.
Ngn ng SQL c IBM s dng u tin trong h qun tr CSDL System R vo gia
nhng nm 70. H ngn ng SQL u tin (SEQUEL2) c IBM cng b vo thng 11
nm 1976. Nm 1979, tp on Oracle gii thiu thng phm u tin ca SQL. SQL cng
c ci t trong cc h qun tr CSDL nh DB2 ca IBM v SQL/DS.
Ngy nay, SQL c s dng rng ri v uc xem l ngn ng chun truy cp CSDL
quan h.

1.1.2. Chun SQL


Nm 1989, vin tiu chun quc gia Hoa K (ANSI) cng nhn SQL l ngn ng chun truy cp CSDL
quan h trong vn bn ANSI SQL89.
Nm 1989, t chc tiu chun quc t (ISO) cng nhn SQL ngn ng chun truy cp CSDL quan h
trong vn bn ISO 9075-1989.
Tt c cc h qun tr CSDL ln trn th gii cho php truy cp bng SQL v hu ht theo chun ANSI.

1.2.CC KHI NIM C BN TRONG C S D LIU


1.2.1. Cc thnh phn logic trong database
Thnh phn Din gii
Table Cu trc lu tr c bn nht trong CSDL quan h (RDBMS), n bao
gm 1 hoc nhiu columns (ct d liu) vi 0 hoc nhiu rows (dng d liu).
Row T hp nhng gi tr ca Column trong bng. Mt row cn c gi
l 1 record (bn ghi).
Column Quy nh mt loi d liu trong bng. V d: loi d liu tn phng
ban c trong bng phng ban. Ta th hin th column ny thng qua tn column
v c th km theo mt vi thng tin khc v column nh kiu d liu, di
ca d liu.
Field Giao ca column v row. Field chnh l ni cha d liu. Nu khng
c d liu trong field ta ni field c gia tr l NULL.
Primary Key L mt column hoc mt tp cc column xc nh tnh duy nht ca
cc rows trong bng. V d DEPTNO l Primary Key ca bng DEPT
v n c dng xc nh duy nht mt phng ban trong bng
DEPT m i din l mt row d liu.

Trang 5
Oracle c bn - SQL v PL/SQL

Primary Key nht thit phi c s liu.

Foreign Key L mt column hoc mt tp cc columns c tham chiu ti chnh


bng hoc mt bng khc.
Foreign Key xc nh mi quan h gia cc bng.
Constraints L cc rng buc i vi d liu trong cc bng thuc database. V
d: Foreign Key, Primary Key...

V d: minh ho cc thnh phn logic trong database

EMP
DEPT
EMPNO ENAME EMP DEPT DEPTNO
DEPTNO DNAME
7369 SMITH 20

Row 7499 ALLEN 30 10 ACCOUNTING

7521 WARD 30 20 RESEARCH


7566 JONES 20 30 SALES
7654 MARTIN 30
40 OPERATIONS
7698 BLAKE 30
Foreign key
7782 CLARK 10 Primary key

Column

Hnh v 1. Minh ho cc thnh phn logic trong database

1.2.2. Cc i tng trong database


i tng Din gii
Table Cu trc lu tr c bn nht trong CSDL quan h (RDBMS), gm
row v column
View L cu trc logic hin th d liu t 1 hoc nhiu bng
Sequence Lt sinh gi tr cho cc primary key
Index Tng tnh thc thi cho cu lnh truy vn
Synonym Tn tng ng ca i tng
Program unit Tp hp cc cu lnh thc hin c vit bi ngn ng SQL v
PL/SQL, bao gm Procedure, function, package...

1.2.3. Cc nhm lnh SQL c bn


Tn lnh Din gii
SELECT L lnh thng dng nht, dng ly, xem d liu trong CSDL.

INSERT L 3 lnh dng nhp thm nhng row mi, thay i ni dung
UPDATE d liu trn cc row hay xo cc row trong table. Nhng lnh ny
DELETE c gi l cc lnh thao tc d liu DML (Data Manipulation
Language)

Trang 6
Oracle c bn - SQL v PL/SQL

CREATE L 3 lnh dng thit lp, thay i hay xo b cu trc d liu


ALTER nh l table, view, index. Nhng lnh ny c gi l cc lnh nh ngha d
DROP liu DDL (Data Definition Language)
RENAME
TRUNCATE
COMMIT Qun l vic thay i d liu bng cc lnh DML. Vic thay i d liu c
ROLLBACK th c nhm li thnh cc transaction.
SAVE POINT
2 lnh ny dng gn hoc hu cc quyn truy nhp vo CSDL Oracle v
GRANT cc cu trc bn trong n. Nhng lnh ny c gi l cc lnh iu khin d
REVOKE liu DCL (Data Control Language)

1.3.C S D LIU THC HNH


1.3.1. M hnh d liu
DEPT EMP

SALGRADE

DUMMY BONUS

Hnh v 2. M hnh d liu thc hnh

1.3.2. Cu trc bng d liu


Bng DEPT

Tn ct Kiu iu kin Din gii


DEPTNO NUMBER(2) PRIMARY KEY M phng ban
DNAME VARCHAR2(14) Tn phng ban
LOC VARCHAR2(13) a ch

Bng SALGRADE

Tn ct Kiu iu kin Din gii


GRADE NUMBER PRIMARY KEY Mc lng
LOSAL NUMBER Gi tr thp nht
HISAL NUMBER Gi tr cao nht

Trang 7
Oracle c bn - SQL v PL/SQL

Bng EMP

Tn ct Kiu iu kin
Din gii
EMPNO NUMBER(4) PRIMARY KEY
M nhn vin
ENAME VARCHAR2(10)
Tn nhn vin
JOB VARCHAR2 (9)
Ngh nghip
MGR NUMBER(4) FOREIGN KEY
(EMP.EMPNO) M ngi qun l
HIREDATE DATE Ngy gia nhp cng ty
SAL NUMBER(7,2) Lng
COMM NUMBER(7,2) Thng
DEPTNO NUMBER(2) NOT FOREIGN KEY M phng ban
NULL, (DEPT.DEPTNO)

Trang 8
Oracle c bn - SQL v PL/SQL

Chng 2. LNH TRUY VN C BN


2.1.CU LNH TRUY VN
2.1.1. Quy tc vit lnh
Cc cu lnh truy vn c biu din theo cc quy tc sau:
Cc lnh trong cu lnh SQL thuc loi khng phn bit ch vit hoa hay thng. Ni dung
ca mt cu lnh SQL c th c tri di trn nhiu dng. Cc t kho khng c php vit
tt hay phn cch trn nhiu dng Cc mnh thng thng c t trn nhiu dng khc
nhau
r rng trong vic th hin cu lnh, ta nn s dng cc du TAB khi vit lnh Ta c th
s dng cc k t c bit nh: +, -, \, *,... biu din gi tr trong cu
lnh.
Lnh kt thc bi du chm phy (;).

2.1.2. Cu lnh truy vn c bn


C php:
SELECT [DISTINCT ] {*, column [alias],...}
FROM table;
Vi:
SELECT Hin th ni dung ca mt hay nhiu ct
DISTINCT Phn bit ni dung gia cc dng d liu tr v
Ly tt cc cc ct trong bng
column Tn ct d liu cn tr v
alias Phn tiu ca ct d liu tr v
FROM table Tn bng cha d liu truy vn
V d:
SELECT
FROM emp;

Cu trc ca lnh truy vn gm c hai phn:


Mnh chn la bao gm Lnh SELECT v tn ct d liu tr v Mnh
biu din ni cha bao gm FROM v tn bng.

2.1.3. Cc thnh phn khc ca mnh SELECT Trong mnh SELECT


cn c th a vo cc thnh phn khc:
Biu thc ton hc
Column alias
Cc column c ghp chui
Literal

Biu thc ton hc


Trong mnh SELECT biu thc ton hc c th cc gi tr (column hoc hng s), cc ton t, cc hm.
Cc ton t c dng l (+), (-), (*), (/). u tin ca cc ton t ging trong phn s hc.
V d:

Trang 9
Oracle c bn - SQL v PL/SQL

SELECT ename, sal *12, comm FROM emp;


SELECT ename, (sal+250)*12 FROM emp;

Tiu ca ct (column alias)


Trong mnh SELECT, column alias l phn nhn hin th ca column khi ly s liu ra. Trong column
alias khng c c du cch v vit cch sau tn column mt du cch. Column alias c chp nhn c
du cch khi c t trong du nhy kp ( ).
V d: (ANUAL chnh l column alias)
SELECT ename, SAL*12 ANUAL, comm
FROM emp;

Ghp tip cc ct d liu


Ton t ghp tip chui (||) cho php ghp tip d liu trong cc ct khc nhau ca cng mt dng d liu
vi nhau thnh mt chui. Ta c th c nhiu ton t ghp chui trong cng mt column alias.
V d:
SELECT empno||ename EMPLOYEE
FROM emp;

Ghp tip chui k t


Trong mnh SELECT, ta c th thc hin ghp tip bt k k t no, biu thc hay s no m khng phi
l column hoc column alias.
V d:
SELECT empno || ename || WORK IN DEPARTMENT
|| deptno Employee Detail
FROM emp;

2.1.4. Phn bit gi tr d liu tr v


Trong thc t nhiu khi gi tr d liu trn cc dng d liu kt xut trng nhau. Gy nhiu bt tin. c
th ly c ch cc dng d liu phn bit vi nhau. Ta s dng mnh DISTINCT trong cu lnh truy
vn.
V d:
SQL> SELECT deoptno FROM dept;
DEPTNO

10
30
10
20

14 rows selected.

SQL> SELECT DISTINCT deoptno FROM dept;


DEPTNO

10
30
20
3 rows selected.

Trang 10
Oracle c bn - SQL v PL/SQL

2.1.5. Gi tr NULL
Ct c gi tr rng (NULL) l ct cha c gn gi tr, ni cch khc n cha c khi to gi tr. Cc ct
vi bt c kiu d liu no cng c th c tr NULL, tr khi c n l kha hay c rng buc ton vn NOT
NULL. Trong biu thc c bt k gi tr NULL no kt qu cng l NULL.
V d:
SELECT ename, sal*12 + comm ANUAL_SAL
FROM emp;

NULL trong cc hm ca SQL


Trong cc hm lm vic vi tng ct hay hm v hng (scalar function). Cc hm loi ny tr v tr null
khi c tham s NULL, tr hm NVL v TRANSLATE c th tr v gi tr thc.
C php ca hm NVL:
NVL (DATECOLUMN,01-01-2001)
NVL(NUMBERCOLUMN, 9)
NVL(CHARCOLUMN,STRING)
NVL(comm,0) tr v tr 0 khi comm l null

SELECT ename, sal*12 + NVL(comm,0) ANUAL_SAL FROM emp;

Trong cc hm lm vic vi nhm cc ct (group function): Hu ht cc hm lm vic trn nhm b qua tr


null, v d nh khi s dng hm AVG tnh trung bnh cho mt ct c cc gi tr 1000, NULL, NULL,
NULL, 2000. Khi trung bnh c tnh l (1000+2000)/2=1500, nh vy tr null b b qua ch
khng phi xem l tr 0.

NULL trong cc biu thc so snh, iu kin


kim tra c phi NULL hay khng dng cc ton t IS NULL hoc IS NOT NULL. Nu trong biu
thc so snh c tr null tham gia v kt qu ca biu thc ph thuc vo tr null th kt qu l khng xc
nh, tuy nhin trong biu thc DECODE, hai gi tr null c xem l bng nhau trong php so snh.
Oracle xem cc biu thc vi kt qu khng xc nh tng ng vi FALSE. (V d: comm = NULL)
c kt qu khng xc nh v do biu thc so snh xem nh cho kt qu FALSE. Trong cu lnh sau
khng c mu tin no c chn
SELECT * FROM emp WHERE comm=NULL;

Nu mun chn cc nhn vin c comm l NULL th phi dng ton t IS NULL
SELECT * FROM emp WHERE comm IS NULL;

2.2.SQL*PLUS, CNG C TNG TC LNH SQL VI DATABASE


2.2.1. Cu lnh tng tc ca SQL*Plus
Oracle h tr cng c SQL*Plus cho php ngi s dng c th tng tc trc tip vi Oracle Server thng
qua cc cu lnh SQL v PL/SQL.
Theo ngi s dng c th tng tc vi Oracle Server thng qua hai loi cu lnh:
Cu lnh SQL
Cu lnh ca bn thn chng trnh SQL*Plus

Trang 11
Oracle c bn - SQL v PL/SQL

Hnh v 3. Cu lnh ca SQL*Plus

Khc bit gia lnh SQL v SQL*Plus

SQL
SQL*Plus
L ngn ng giao tip vi Oracle Server
Nhn dng lnh SQL v gi lnh ln
trong vic truy xut d liu
Server
Cu lnh da trn b k t chun ASCII
Tu thuc vo tng phin bn ca Oracle Khng
Thao tc trn cc d liu c trong cc bng
thao tc vi d liu trong database
c nh ngha trong database
Cu lnh c np vo b nh m trn
mt hoc nhiu dng Cu lnh c ti trc tip khng thng qua b
m
Cu lnh khng c vit tt
Cu lnh c th vit tt

C s dng k t kt thc lnh khi thc hin Khng i hi phi c k t kt thc lnh
S dng cc hm trong vic nh dng d S dng cc lnh nh dng d liu ca
liu chnh SQL*Plus

2.2.2. Phn nhm cu lnh trong SQL*Plus


Cc lnh SQL*Plus c th phn thnh nhm chnh sau:

Nhm lnh Din gii


Mi trng Tc ng v gy nh hng ti mi trng lm vic ca SQL*Plus
trong phin lm vic hin ti.
nh dng d liu nh dng li d liu tr v t server
Thao tc file Lu gi, np v chy cc file scrips
Thc hin lnh Gi cc lnh SQL c trong b m ln server
Son tho Sa i li lnh SQL c trong b m

Trang 12
Oracle c bn - SQL v PL/SQL

Tng tc Cho php ngi dng c th to cc bin s dng trong cu lnh


SQL v thao tc vi cc bin nh: nhp d liu, kt xut d liu.
Cc lnh khc Cc lnh khc cho php kt ni ti c s d liu v hin th cc ct
d liu theo nh nh dng.

2.2.3. Chi tit cc lnh SQL*Plus c bn


Kt ni ti CSDL
C php:
Conn[ect] <user_name>/<password>[@<database>];
Vi:
user_name Tn truy nhp
password Mt khu truy nhp
database Tn database truy nhp
V d:
Conn Tester/tester@DB1;

Hin th cu trc bng d liu


C php:
Desc[ribe] <table_name>;
Vi:
table_name Tn bng cn hin th cu trc
V d:
Desc Dept;
Name Null? Type

DEPTNO NOT NULL NUMBER(2)


DNAME VARCHAR2(14)
LOC VARCHAR2(13)

Lnh son tho

Tn lnh Din gii


A[PPEND] text a thm on text vo dng hin ti
C[HANGE] /old/new Chuyn on text c thnh on text mi trong dng hin
ti
C[HANGE] /text/ Xo on text trong dng hin ti
CL[EAR] BUFF[ER] Xo tt c cc dng trong SQL buffer
DEL Xo dng hin ti
DEL n Xo dng n
DEL m n Xo dng t m n n
I[NPUT] Thm mt s dng nht nh
I[NPUT] text Thm dng c cha text
L[IST] Lit k ton b cc dng trong SQL buffer

Trang 13
Oracle c bn - SQL v PL/SQL

L[IST] n Lit k dng n


L[IST] m n Lit k dng m n n
R[UN] Hin th v chy lnh trong buffer
N Nhy n dng n
N text Thay dng n bi on text
0 text Chn 1 dng trc dng 1

Lnh thao tc file

Tn lnh Din gii


SAVE filename [.ext] Ghi ni dung bufer thnh file. APPEND ghi thm vo file.
[REP[LACE]|APP[END]]
REPLACE chn ln ni dung file c.
GET filename [.ext] Ghi ni dung file vo buffer. Mc nh phn ui l .sql Chy cc
STA[RT] filename [.ext] lnh trong file
@ filename [.ext]
Ging lnh Start
ED[IT] Son tho ni dung bufffer c tn l afiedt.buf chy ni dung
buffer dng lnh /
ED[IT]filename [.ext ] Son tho ni dung file
SPO[OL] filename [.ext ] Ct kt qu hin th trn mn hnh ra file. Vd:
[OFF|OUT]
SPOOL result.sql

SPOOL OFF
EXIT
Thot khi SQL*Plus

Lnh nh dng ct d liu


C php:

COLUMN [{column | alias} [option]]

Tn lnh Din gii


CLE[AR] Xo nh dng ca column
FOR[MAT] format Chuyn nh dng ca ct d liu
HEA[DING] text t nhn co column
JUS[TIFY] align Cn tri - left , phi - right, gia - center cho nhn
NOPRI[NT] n column
NUL[L] text Hin th text nu gi tr ca column l NULL
PRI[NT} Hin th column
TRU[NCATED] Xo chui ti cui dng u tin khi hin th
WRA[PPED] Ph cui chui ca dng tip theo

V d 1: Chnh nh dng v nhn ca column

Trang 14
Oracle c bn - SQL v PL/SQL

COLUMN ename HEADING Employee|Name FORMAT A15


COLUMN sal JUSTIFY LEFT FORMAT $ 99,990.00 COLUMN
hiredate FORMAT A9 NULL Not hired
V d 2: Hin th nh dng hin ti ca column
COLUMN
COLUMN ename
V d 3: Xo nh dng hin ti ca column
COLUMN ename CLEAR
CLEAR COLUMN

Cc loi nh dng

nh dng Din gii V d Kt qu


An Hin th di nht n k t dng cho cc column
dng k t hoc dng ngy
9 Hin th s, khng bao gm s 0 999999 1234
0 Hin th c s 0 099999 01234
$Hin thi $ $9999 $1234
L Hin th k t L L9999 L1234
Hin th du thp phn 9999.99 1234.00
, Hin th du phn chia hng nghn 9,999 1,234

2.3.BI TP
1. Chn ton b thng tin trong bng SALGRADE
GRADE LOSAL HISAL

1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999

2. Chn ton b thng tin trong bng EMP


EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

7839 KING PRESIDENT 17-11-1981 5000 10


7698 BLAKE MANAGER 7839 01-05-1981 2850 30
7782 CLARK MANAGER 7839 09-06-1981 2450 10
7566 JONES MANAGER 7839 02-04-1981 2975 20
7654 MARTIN SALESMAN 7698 28-09-1981 1250 1400 30
7499 ALLEN SALESMAN 7698 20-02-1981 1600 300 30
7844 TURNER SALESMAN 7698 08-09-1981 1500 0 30
7900 JAMES CLERK 7698 03-12-1981 950 30
7521 WARD SALESMAN 7698 22-02-1981 1250 500 30
7902 FORD ANALYST 7566 03-12-1981 3000 20
7369 SMITH CLERK 7902 17-12-1980 800 20
7788 SCOTT ANALYST 7566 09-12-1982 3000 20
7876 ADAMS CLERK 7788 12-01-1983 1100 20
7934 MILLER CLERK 7782 23-01-1982 1300 10

Trang 15
Oracle c bn - SQL v PL/SQL

3. Hin th mi loi ngh nghip


JOB

ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN

4. Hin th tn nhn vin v thu nhp trong mt nm (REMUNERATION)


ENAME REMUNERATION

KING 60000
BLAKE 34200
CLARK 29400
JONES 35700
MARTIN 16400
ALLEN 19500
TURNER 18000
JAMES 11400
WARD 15500
FORD 36000
SMITH 9600
SCOTT 36000
ADAMS 13200
MILLER 15600
14 rows selected.

5. Hin th theo ni dung di y Who,


what and when

KING HAS HELP THE POSITION OF PRESIDENT IN DEPT 10 SINCE 17-11-1981 BLAKE
HAS HELP THE POSITION OF MANAGER IN DEPT 30 SINCE 01-05-1981 CLARK HAS
HELP THE POSITION OF MANAGER IN DEPT 10 SINCE 09-06-1981 JONES HAS HELP
THE POSITION OF MANAGER IN DEPT 20 SINCE 02-04-1981 MARTIN HAS HELP THE
POSITION OF SALESMAN IN DEPT 30 SINCE 28-09-1981 ALLEN HAS HELP THE
POSITION OF SALESMAN IN DEPT 30 SINCE 20-02-1981 TURNER HAS HELP THE
POSITION OF SALESMAN IN DEPT 30 SINCE 08-09-1981 JAMES HAS HELP THE
POSITION OF CLERK IN DEPT 30 SINCE 03-12-1981 WARD HAS HELP THE POSITION
OF SALESMAN IN DEPT 30 SINCE 22-02-1981 FORD HAS HELP THE POSITION OF
ANALYST IN DEPT 20 SINCE 03-12-1981
SMITH HAS HELP THE POSITION OF CLERK IN DEPT 20 SINCE 17-12-1980
SCOTT HAS HELP THE POSITION OF ANALYST IN DEPT 20 SINCE 09-12-1982
ADAMS HAS HELP THE POSITION OF CLERK IN DEPT 20 SINCE 12-01-1983
MILLER HAS HELP THE POSITION OF CLERK IN DEPT 10 SINCE 23-01-1982
14 rows selected.

6. Hin th cu trc bng emp;

7. Thay i nhn v nh dng hin th ca ct sal v hiredate trong bng emp;

Trang 16
Oracle c bn - SQL v PL/SQL

Chng 3. TRUY VN D LIU C IU KIN


3.1.CC GII HN TRONG TRUY VN D LIU
Trong phn ln cc trng hp ly d liu t database, ta ch cn ly mt phn d liu ch khng cn ly tt
c. hn ch cc d liu tr v khng cn thit, ta c th s dng mnh iu kin trong cu lnh truy
vn.

Hnh v 4. Hn ch d liu tr v

3.1.1. Mnh WHERE


C php:
SELECT [DISTINCT ] {*, column [alias],...}
FROM table
[WHERE condition (s)];
Vi:
column tn ct d liu tr v
alias tiu ca ct d liu tr v
table tn bng truy vn d liu
condition mnh iu kin lc d liu tr v

Mnh WHERE dng t iu kin cho ton b cu lnh truy vn. Trong mnh WHERE c th c cc
thnh phn:
Tn column
Ton t so snh
Tn column, hng s hoc danh sch cc gi tr

V d:
SELECT DEPTNO, JOB, ENAME, SAL
FROM EMP
WHERE SAL BETWEEN 1000 AND 2000 ;

Trang 17
Oracle c bn - SQL v PL/SQL

Truy vn d liu vi nhiu iu kin


Mnh WHERE cho php ghp c nhiu iu kin thng qua cc ton t logic AND/OR. Ton t AND
yu cu d liu phi tho mn c 2 iu kin. Ton t OR cho php d liu tho mn 1 trong 2 iu kin.
V d:
SELECT DEPTNO, JOB, ENAME, SAL
FROM EMP
WHERE SAL BETWEEN 1000 AND 2000
AND JOB = MANAGER;

SELECT DEPTNO, JOB, ENAME, SAL


FROM EMP
WHERE SAL BETWEEN 1000 AND 2000
OR JOB = MANAGER;

SELECT DEPTNO, JOB, EMPNO, ENAME, SAL


FROM EMP
WHERE SAL > 1500
AND JOB = MANAGER
OR JOB =SALESMAN;

SELECT DEPTNO, JOB, EMPNO, ENAME, SAL


FROM EMP
WHERE SAL > 1500
AND (JOB = MANAGER
OR JOB =SALESMAN);

3.1.2. Cc ton t s dng trong mnh WHERE Ton t so


snh

Ton t
Din gii
=
Ton t bng hay tng ng
!=, ^=, '+, <\>
Ton t khc hay khng tng ng
>
Ton t ln hn
<
Ton t nh hn
>=
Ton t ln hn hoc bng
<=
Ton t nh hn hoc bng

Cc ton t ca SQL

Ton t
Din gii
[NOT] BETWEEN x AND y
[Khng] ln hn hoc bng x v nh hn hoc bng y Thuc bt k gi
IN (danh sch):
tr no trong danh sch
x [NOT] LIKE y
ng nu x [khng] ging khung mu y
Cc k t dng trong khun mu:
Du gch di (_) : Ch mt k t bt k
Du phn trm (%) : Ch mt nhm k t bt k
IS [NOT] NULL
Kim tra gi tr rng
EXISTS
Tr v TRUE nu c tn ti

Trang 18
Oracle c bn - SQL v PL/SQL

Cc ton t logic

Ton t Din gii


NOT Ph nh mnh
AND Yu cu d liu phi tho mn c 2 iu kin
OR Cho php d liu tho mn 1 trong 2 iu kin

Cp u tin khi thc hin i vi cc loi ton t

Cp u tin
Ton t
1
Cc ton t so snh
2
3 NOT
4 AND
OR

3.1.3. V d s dng cc ton t iu kin


[NOT] BETWEEN x AND y
V d chn nhn vin c lng nm trong khong 2000 v 3000
SELECT * FROM emp WHERE sal BETEEN 2000 AND 3000;

IN (danh sch)
Chn nhn vin c lng bng mt trong 2 gi tr 1400 hoc 3000
SELECT * FROM emp WHERE sal IN (1400, 3000);

Tm tn phng ban nu phng c nhn vin lm vic.


SELECT dname FROM dept WHERE EXISTS
(SELECT * FROM emp WHERE dept.deptno = emp.deptno);

x [NOT] LIKE y
Tm nhn vin c tn bt u bng chui SMITH
SELECT * FROM emp WHERE
ename LIKE 'SMITH_';

chn nhng nhn vin c tn bt u bng 'SM'


SELECT * FROM emp WHERE ename LIKE 'SM%';

tm nhng nhn vin c tn c chui 'A_B'


SELECT ename FROM emp WHERE ename LIKE '%A\_B%'; ESCAPE '\'

V k hiu "_" dng i din cho mt k t bt k nn nu khng c mnh ESCAPE, cu lnh trn s
tm tt c cc nhn vin tn AAB, ABB, ACB, v.v...
Nu mun k hiu "_" mang ngha nguyn thy, tc l khng cn i din cho k t bt k na, ta t du
"\" trc k hiu. ng thi khai bo thm mnh ESCAPE "\"

Trang 19
Oracle c bn - SQL v PL/SQL

Ta cng c th dng mt k t bt k thay cho "\". Chng hn mnh sau c cng kt qu vi mnh trn
SELECT ename FROM emp WHERE ename LIKE '%A^_B%'; ESCAPE '^';

Ta gi cc k t nh "\" hay "^" ni trn l cc k t ESCAPE.

IS [NOT] NULL
V d:
SELECT * FROM emp WHERE comm IS NULL ;

3.2.SP XP D LIU TR V
3.2.1. Mnh ORDER BY
C php:
SELECT [DISTINCT ] {*, column [alias],...}
FROM table;
[WHERE condition]
[ORDER BY expr/position [DESC/ASC]];

Mnh ORDER BY dng sp xp s liu c hin th v phi t v tr sau cng ca cu lnh truy
vn.
V d:
SELECT ENAME, JOB, SAL*12, DEPTNO
FROM EMP
ORDER BY ENAME;

Mnh ORDER BY mc nh sp xp theo th t tng dn ASC[ENDING]


S thp trc
Ngy nh trc
K t theo bng ch ci

sp xp theo th t ngc li (gim dn) t t kho DESC[ENDING] sau column cn sp th t.


Vi d:
SELECT ENAME, JOB, HIREDATE
FROM EMP
ORDER BY HIREDATE DESC ;

3.2.2. Sp xp nhiu ct d liu tr v


Mnh Order cn c th sp xp nhiu column. Cc column cn sp xp c vit th t sau mnh
ORDER BY v cch bi du phy (,). Column no gn mnh ORDER BY hn c mc u tin khi sp
xp cao hn. Ch nh cch thc sp xp ASC/DESC c vit sau column cch bi mt du cch.
V d:
SELECT DEPTNO, JOB, ENAME, SAL

Trang 20
Oracle c bn - SQL v PL/SQL

FROM EMP
ORDER BY DEPTNO, SAL DESC ;

Order gi tr NULL
Ring i vi gi tr NULL, nu sp xp theo th t ASCENDING s nm cc v tr cui cng.

Ch : C th ch nh sp xp theo th t cc column trong mnh SELECT.


V d:
SELECT DEPTNO, JOB, ENAME, SAL
FROM EMP
ORDER BY 2;

3.3.BI TP
1. Chn nhn vin trong bng EMP c mc lng t 1000 n 2000 (chn cc trng
ENAME, DEPTNO, SAL).
ENAME DEPTNO SAL

ALLEN 30 1600
WARD 30 1250
MARTIN 30 1250
TURNER 30 1500
ADAMS 20 1100
MILLER 10 1300

2. Hin th m phng ban, tn phng ban, sp xp theo th t tn phng ban.


DEPTNO DNAME

10 ACCOUNTING
40 OPERATIONS
20 RESEARCH
30 SALES

3. Hin th danh sch nhng nhn vin lm ti phng 10 v 20 theo th t A,B,C


EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

7876 ADAMS CLERK 7788 12-01-1983 1100 20


7782 CLARK MANAGER 7839 09-06-1981 2450 10
7902 FORD ANALYST 7566 03-12-1981 3000 20
7566 JONES MANAGER 7839 02-04-1981 2975 20
7839 KING PRESIDENT 17-11-1981 5000 10
7934 MILLER CLERK 7782 23-01-1982 1300 10
7788 SCOTT ANALYST 7566 09-12-1982 3000 20
7369 SMITH CLERK 7902 17-12-1980 800 20

4. Hin th tn v ngh nghip nhng nhn vin lm ngh th k (cleck) ti phng 20.
ENAME JOB

SMITH CLERK
ADAMS CLERK

Trang 21
Oracle c bn - SQL v PL/SQL

5. Hin th tt c nhng nhn vin m tn c cc k t TH v LL.


ENAME

SMITH
ALLEN
MILLER

6. Hin th tn nhn vin, ngh nghip, lng ca nhng nhn vin c gim c qun
l.
ENAME JOB SAL

SMITH CLERK 800


ALLEN SALESMAN 1600
WARD SALESMAN 1250
JONES MANAGER 2975
MARTIN SALESMAN 1250
BLAKE MANAGER 2850
CLARK MANAGER 2450
SCOTT ANALYST 3000
TURNER SALESMAN 1500
ADAMS CLERK 1100
JAMES CLERK 950
FORD ANALYST 3000
MILLER CLERK 1300

13 rows selected.

7. Hin th tn nhn vin, m phng ban, ngy gia nhp cng ty sao cho gia nhp cng
ty trong nm 1983.
ENAME DEPTNO HIREDATE

ADAMS 20 12-JAN-83

8. Hin th tn nhn vin, lng mt nm (ANUAL_SAL ), thng sao cho lng ln


hn thng v ngh nghip l SALEMAN, sp theo th t lng gim dn v tn tng
dn.
ANUAL_SAL COMM

19200 300
18000 0
15000 500

Trang 22
Oracle c bn - SQL v PL/SQL

Chng 4. CC HM SQL
4.1.TNG QUAN V HM SQL
4.1.1. Cu trc hm SQL
Hm SQL l mt c im lm tng kh nng s dng cu lnh SQL. Hm SQL c th nhn nhiu tham s
vo v tr v ch mt gi tr.

Hnh v 5. Cu trc hm SQL


Hm SQL c mt s c im sau:
Thc hin vic tnh ton ngay trn d liu
C th thao tc, thay i ngay trn tng mc d liu tr v Hoc cng c th
thao tc trn nhm cc d liu tr v
C th nh dng li cc d liu tr v c kiu s, hay kiu thi gian C th
chuyn i kiu d liu tr v

4.1.2. Phn loi hm SQL


Hm SQL c th phn ra lm hai loi:
Hm tc ng trn tng dng d liu: Gi tr tr v tng ng vi tng d liu u
vo ti mi dng d liu.
Hm tc ng trn nhm cc dng d liu: Gi tr tr v tng ng vi cc php thao
tc trn nhm d liu tr v.

Trang 23
Oracle c bn - SQL v PL/SQL

Hnh v 6. Phn loi hm SQL

4.2.HM SQL THAO TC TRN TNG DNG D LIU


4.2.1. Cc hm thao tc trn kiu d liu s
u vo v u ra l cc gi tr kiu s

Mt s hm SQL hay dng

Hm SQL Din gii


ROUND(n[,m]) Cho gi tr lm trn ca n (n cp m, mc nhin m=0)
TRUNC(n[,m]) Cho gi tr n ly m ch s tnh t chm thp phn
CEIL(n) Cho s nguyn nh nht ln hn hoc bng n
FLOOR(n) Cho s nguyn ln nht bng hoc nh hn n
POWER(m,n) Cho ly tha bc n ca m
EXP(n) Cho gi tr ca en
SQRT(n) Cho cn bc 2 ca n, n>=0
SIGN(n) Cho du ca n.
n<0 c SIGN(n)= -1
n=0 c SIGN(n)= 0
n>0 c SIGN(n)= 1
ABS(n) Cho gi tr tuyt i
MOD(m,n) Cho phn d ca php chia m cho n

Mt s hm kiu s tham kho khc

Hm SQL
Din gii
LOG(m,n)
Cho logarit c s m ca n
SIN(n)
Tr v cosin ca n (n tnh bng radian)

Trang 24
Oracle c bn - SQL v PL/SQL

COS(n) Cho cosin ca n (n tnh bng radian) Tr v


TAN(n) cotang ca n (n tnh bng radian)

V d hm ROUND(n[,m])

SELECT ROUND(4.923,1),
ROUND(4.923),
ROUND(4.923,-1),
ROUND(4.923,2)
FROM DUMMY;

ROUND(4.923,1) ROUND(4.923) ROUND(4.923,-1) ROUND(4.923,2)

4.9 5 0 4.92

V d hm TRUNC(n[,m])
SELECT TRUNC (4.923,1),
TRUNC (4.923),
TRUNC (4.923,-1),
TRUNC (4.923,2)
FROM DUMMY;

TRUNC(4.923,1) TRUNC(4.923) TRUNC(4.923,-1) TRUNC(4.923,2)

4.9 4 0 4.92

V d hm CEIL(n)
SELECT CEIL (SAL), CEIL(99.9),CEIL(101.76), CEIL(-11.1)
FROM EMP
WHERE SAL BETWEEN 3000 AND 5000;

CEIL(SAL) CEIL(99.9) CEIL(101.76) CEIL(-11.1)

5000 100 102 -11


3000 100 102 -11
3000 100 102 -11

V d hm FLOOR(n)
SELECT FLOOR (SAL), FLOOR (99.9), FLOOR (101.76), FLOOR (-11.1)
FROM EMP
WHERE SAL BETWEEN 3000 AND 5000;

FLOOR(SAL) FLOOR(99.9) FLOOR(101.76) FLOOR(-11.1)

5000 99 101 -12


3000 99 101 -12
3000 99 101 -12

V d hm POWER(m,n)
SELECT SAL, POWER(SAL,2), POWER(SAL,3), POWER(50,5)
FROM EMP
WHERE DEPTNO =10;

SAL POWER(SAL,2) POWER(SAL,3) POWER(50,5)

Trang 25
Oracle c bn - SQL v PL/SQL

5000 25000000 1.2500E+11 312500000


2450 6002500 1.4706E+10 312500000
1300 1690000 2197000000 312500000

V d hm EXP(n)
SELECT EXP(4) FROM DUMMY;

EXP(4)

54.59815

V d hm SQRT(n)
SELECT SAL, SQRT(SAL), SQRT(40), SQRT (COMM)
FROM EMP
WHERE DEPTNO =10;

SAL SQRT(SAL) SQRT(40) SQRT(COMM)

5000 70.7106781 6.32455532


2450 49.4974747 6.32455532
1300 36.0555128 6.32455532

V d hm SIGN(n)
SELECT SAL-NVL(COMM,0), SIGN(SAL-NVL(COMM,0)),
NVL(COMM,0)-SAL, SIGN(NVL(COMM,0)-SAL)
FROM EMP
WHERE DEPTNO =30

SAL-NVL(COMM,0)SIGN(SAL-NVL(COMM,0))NVL(COMM,0)-SAL SIGN(NVL(COMM,0)
SAL)

2850 1 -2850 -1
-150 -1 150 1
1300 1 -1300 -1
1500 1 -1500 -1
950 1 -950 -1
750 1 -750 -1

4.2.2. Cc hm thao tc trn kiu d liu k t


Hm SQL thao tc trn kiu d liu l k t

Hm SQL
Din gii
CONCAT(char1, char2)
Cho kt hp ca 2 chui k t, tng t nh s
dng ton t ||
INITCAP(char)
Cho chui vi k t u cc t l k t
hoa
LOWER(char)
Cho chui k t vit thng (khng vit
hoa)
LPAD(char1, n [,char2])
Cho chui k t c chiu di bng n. Nu chui
char1 ngn hn n th thm vo bn tri chui
char2 cho n k t. Nu chui char1 di hn n
th gi li n

Trang 26
Oracle c bn - SQL v PL/SQL

k t tnh t tri sang


LTRIM(char1, n [,char2])
B cc k t trng bn tri
NLS_INITCAP(char) Cho chui vi k t u cc t l ch hoa, cc
ch cn li l ch thng
REPLACE(char,search_string[,replacem Thay tt c cc chui search_string c trong
ent_string])
chui char bng chui
replacement_string.
RPAD(char1, n [,char2])
Ging LPAD(char1, n [,char2]) nhng
cn phi.
RTRIM(char1, n [,char2]) B cc k t trng bn phi
SOUNDEX(char) Cho chui ng m ca char.
SUBSTR(char, m [,n]) Cho chui con ca chui char ly t v tr m v
phi n k t, nu khng ch n th ly cho n
cui chui
TRANSLATE(char, from, to) Cho chui trong mi k t trong chui
from thay bng k t tng ng trong
chui to, nhng k t trong chui from
khng c tng ng trong chui to s b
loi b.
UPPER(char) Cho chui ch hoa ca chui char
ASCII(char) Cho k t ASCII ca byte u tin ca chui
char
INSTR(char1, char2 [,n[,m]]) Tm v tr chui char2 trong chui
char1 bt u t v tr n, ln xut hin
th m.
LENGTH(char) Cho chiu di ca chui char

V d hm LOWER(char)

SELECT LOWER(DNAME), LOWER(SQL COURSE) FROM DEPT;

LOWER(DNAME) LOWER('SQL

accounting sql course


research sql course
sales sql course
operations sql course

V d hm UPPER(char)
SELECT ENAME FROM EMP WHERE ENAME = UPPER(Smith);

ENAME

SMITH

V d hm INITCAP(char)
SELECT INITCAP(DNAME), INITCAP(LOC) FROM DEPT;

INITCAP(DNAME) INITCAP(LOC)
Trang 27
Oracle c bn - SQL v PL/SQL

Accounting New York


Research Dallas
Sales Chicago
Operations Boston

V d hm CONCAT(char1, char2)
SELECT CONCAT(ENAME, JOB) JOB FROM EMP WHERE EMPNO = 7900;

JOB

JAMES CLERK

V d hm LPAD(char1, n [,char2])
SELECT LPAD(DNAME,20,*), LPAD(DNAME,20), LPAD(DEptno,20, )
FROM DEPT;

LPAD(DNAME,20,'*') LPAD(DNAME,20) LPAD(DEPTNO,20,'')

***ACCOUNTING ACCOUNTING 10
***RESEARCH RESEARCH 20
***SALES SALES 30
***OPERATIONS OPERATIONS 40

V d hm RPAD(char1, n [,char2])
SELECT RPAD(DNAME,20,*), RPAD(DNAME,20), RPAD(DEptno,20, )
FROM DEPT;

RPAD(DNAME,20,'*') RPAD(DNAME,20) RPAD(DEPTNO,20,'')

ACCOUNTING *** ACCOUNTING 10


RESEARCH *** RESEARCH 20
SALES *** SALES 30
OPERATIONS *** OPERATIONS 40

V d hm SUBSTR(char, m [,n])
SELECT SUBSTR(ORACLE,2,4), SUBSTR(DNAME,2), SUBSTR(DNAME,3,5)
FROM DEPT;

SUBS SUBSTR(DNAME, SUBST

RACL CCOUNTING COUNT


RACL ESEARCH SEARC
RACL ALES LES
RACL PERATIONS ERATI

V d hm INSTR(char1, char2 [,n[,m]])


SELECT DNAME, INSTR(DNAME, A), INSTR(DNAME,ES),
INSTR(DNAME,C,1,2)
FROM DEPT;

DNAME INSTR(DNAME,'A') INSTR(DNAME,'ES')


INSTR(DNAME,'C',1,2)

ACCOUNTING 1 0 3

Trang 28
Oracle c bn - SQL v PL/SQL

RESEARCH 5 2 0
SALES 2 4 0
OPERATIONS 5 0 0

V d hm LTRIM(char1, n [,char2])
SELECT DNAME, LTRIM(DNAME,A), LTRIM(DNAME,AS),
LTRIM(DNAME,ASOP)
FROM DEPT;

DNAME LTRIM(DNAME,'A LTRIM(DNAME,'A LTRIM(DNAME,'A

ACCOUNTING CCOUNTING CCOUNTING CCOUNTING


RESEARCH RESEARCH RESEARCH RESEARCH
SALES SALES LES LES
OPERATIONS OPERATIONS OPERATIONS ERATIONS

V d hm RTRIM(char1, n [,char2])
SELECT DNAME, RTRIM(DNAME,A), RTRIM(DNAME,AS),
RTRIM(DNAME,ASOP)
FROM DEPT;

DNAME RTRIM(DNAME,'A RTRIM(DNAME,'A RTRIM(DNAME,'A

ACCOUNTING ACCOUNTING ACCOUNTING ACCOUNTING


RESEARCH RESEARCH RESEARCH RESEARCH
SALES SALES SALES SALES
OPERATIONS OPERATIONS OPERATIONS OPERATIONS

V d hm SOUNDEX(char)
SELECT ENAME, SOUNDEX(ENAME)
FROM EMP
WHERE SOUNDEX(ENAME)= SOUNDEX(FRED);

ENAME SOUN

FORD F630

V d hm LENGTH(char)
SELECT LENGTH(SQL COURSE), LENGTH(DEPTNO), LENGTH(DNAME)
FROM DEPT;

LENGTH('SQLCOURSE') LENGTH(DEPTNO) LENGTH(DNAME)

10 2 14
10 2 14
10 2 14
10 2 14

V d hm TRANSLATE(char, from, to)


SELECT ENAME, TRANSLATE(ENAME,'C','F'), JOB,
TRANSLATE(JOB,'AR','IT')
FROM EMP
WHERE DEPTNO = 10;

ENAME TRANSLATE( JOB TRANSLATE

Trang 29
Oracle c bn - SQL v PL/SQL

KING KING PRESIDENT PTESIDENT


CLARK FLARK MANAGER MINIGET
MILLER MILLER CLERK CLETK

V d hm REPLACE(char,search_string[,replacement_string])
SELECT JOB, REPLACE(JOB, SALESMAN, SALESPERSON), ENAME,
REPLACE(ENAME, CO,PR)
FROM EMP
WHERE DEPTNO =30 OR DEPTNO =20;

JOB REPLACE(JOB,'SALESMAN', ENAME REPLACE(ENAME,'CO','

MANAGER MANAGER BLAKE BLAKE


MANAGER MANAGER JONES JONES
SALESMAN SALESPERSON MARTIN MARTIN
SALESMAN SALESPERSON ALLEN ALLEN
SALESMAN SALESPERSON TURNER TURNER
CLERK CLERK JAMES JAMES
SALESMAN SALESPERSON WARD WARD
ANALYST ANALYST FORD FORD
CLERK CLERK SMITH SMITH
ANALYST ANALYST SCOTT SPRTT
CLERK CLERK ADAMS ADAMS

V d cc hm lng nhau:
SELECT DNAME, LENGHT(DNAME), LENGHT(TRANSLATE,DNAME, AS,A))
FROM DEPT;

DNAME LENGTH(DNAME) LENGTH(TRANSLATE(DNAME,'AS','A'))

ACCOUNTING 14 14
RESEARCH 14 13
SALES 14 12
OPERATIONS 14 13

4.2.3. Cc hm thao tc trn kiu d liu thi gian Hm SQL


thao tc trn kiu d liu l thi gian.

Hm SQL
Din gii
MONTH_BETWEEN(d1, d2)
Cho bit s thng gia ngy d1 v d2. Cho ngy d
ADD_MONTHS(d,n)
thm n thng.
NEXT_DAY(d, char )
Cho ngy tip theo ngy d c th ch bi char. Cho
LAST_DAY(d)
ngy cui cng trong thng ch bi d.

V d hm MONTH_BETWEEN(d1, d2)
SELECT MONTHS_BETWEEN( SYSDATE, HIREDATE),
MONTHS_BETWEEN('01-01-2000','05-10-2000')
FROM EMP
WHERE MONTHS_BETWEEN( SYSDATE,HIREDATE)>240;

MONTHS_BETWEEN(SYSDATE,HIREDATE) TWEEN('01-01-2000','05-10-2000')

Trang 30
Oracle c bn - SQL v PL/SQL

241.271055 -9.1290323
241.206539 -9.1290323
243.367829 -9.1290323

V d hm ADD_MONTHS(d,n)
SELECT HIREDATE, ADD_MONTHS(HIRE,3), ADD_MONTHS(HIREDATE,-3)
FROM EMP
WHERE DEPTNO=20;

HIREDATE ADD_MONTHS ADD_MONTHS

02-04-1981 02-07-1981 02-01-1981


03-12-1981 03-03-1982 03-09-1981
17-12-1980 17-03-1981 17-09-1980
09-12-1982 09-03-1983 09-09-1982
12-01-1983 12-04-1983 12-10-1982

V d hm NEXT_DAY(d, char )
SELECT HIREDATE, NEXT_DAY(HIREDATE,FRIDAY), NEXT_DAY(HIREDATE,6)
FROM EMP
WHERE DEPTNO = 10;

HIREDATE NEXT_DAY(H NEXT_DAY(H

17-11-1981 20-11-1981 20-11-1981


09-06-1981 12-06-1981 12-06-1981
23-01-1982 29-01-1982 29-01-1982
V d hm LAST_DAY(d)
SELECT SYSDATE, LAST_DAY(SYSDATE), HIREDATE, LAST_DAY(HIREDATE),
LAST_DAY(15-01-2001)
FROM EMP
WHERE DEPTNO =20;

SYSDATE LAST_DAY(S HIREDATE LAST_DAY(H LAST_DAY('

28-03-2001 31-03-2001 02-04-1981 30-04-1981 31-01-2001 28-


03-2001 31-03-2001 03-12-1981 31-12-1981 31-01-2001 28-03-
2001 31-03-2001 17-12-1980 31-12-1980 31-01-2001 28-03-
2001 31-03-2001 09-12-1982 31-12-1982 31-01-2001 28-03-
2001 31-03-2001 12-01-1983 31-01-1983 31-01-2001

Mt s hm khc c th p dng cho kiu ngy

Hm SQL
Din gii
ROUND(date1)
Tr v ngy date 1 ti thi im gia tra 12:00 AM
ROUND(date1,MONTH)
Nu date 1 nm trong na thng u tr v ngy u tin ca thng,
ngc li s tr v ngy u tin ca thng sau.
ROUND(date1,YEAR) Nu date 1 nm trong na nm u tr v ngy u tin
ca thng, ngc li s tr v ngy u tin ca nm
sau.
TRUNC(date1, MONTH) Tr v ngy u tin ca thng cha date1 Tr v ngy u tin ca
TRUNC(date1, YEAR) nm cha date1

Trang 31
Oracle c bn - SQL v PL/SQL

4.2.4. Cc hm chuyn i kiu


Hm SQL Din gii
TO_CHAR(number|date,
fmt) Chuyn kiu s v ngy v kiu k t.
TO_NUMBER(char)
Chuyn k t c ni dung s sang s
TO_DATE(chsr,fmt)
Chuyn k t sang kiu ngy vi nh dng t trong
fmt.
DECODE(EXPR, SEARCH1,
RESULT1, SEARCH2, So snh biu thc expr vi gi tr search nu ng tr v gi tr
RESULT2, DEFAULT): result nu khng tr v gi tr default.
NVL(COL|VALUE, VAL)
Chuyn gi tr COL|VALUE thnh val nu null. Tr gi tr
Greatest(col|value1,
col|value2) ln nht trong dy gi tr.

V d:

SELECT To_char (sysdate, day, ddth month yyyy) from dummy;

SELECT EMPNO, ENAME, HIREDATE


FROM EMP
WHERE HIREDATE = TO_DATE (June 4, 1984, month dd, yyyy);

INSERT INTO EMP (EMPNO, DEPTNO, HIREDATE


VALUES (777, 20, TO_DATE(19-08-2000, DD-MM-YYYY);

SELECT ENAME, JOB,


DECODE (JOB, CLERK,WWORKER,MANAGER,BOSS,UNDEFINED)
DECODED_JOB
FROM EMP;

SELECT GREATEST(1000,2000), GREATEST(SAL,COMM) FROM EMP


WHERE DEPTNO = 10;

Cc khun dng ngy

Hm SQL Din gii


SCC hoc CC Th k; S ch ngy BC
YYYY hoc SYYYY Nm; S ch ngy BC
YYY, YY, Y Ch nm vi 3,2,1 k t s
IYYY, IYY, IY, I Ch nm theo chun ISO
SYEAR, YEAR Ch nm theo cch pht m ca ngi anh;
Q Qu trong nm
MM Gi tr thng vi 2 s (01-12)
MONTH Tn y ca thng theo ting anh, di 9
MON Thng vi 3 k t vin tt (JAN, FEB...)
WW, W Tun trong nm hoc trong thng
DDD, DD, D Ngy trong nm, thng hoc tun
DAY Ch th trong tun
DY Ch th trong tun vi 3 k t vit tt

Trang 32
Oracle c bn - SQL v PL/SQL

Ngy Julian; bt u t ngy 31/12/4713 trc cng


J nguyn
AM, PM Ch nh sng, chiu
HH, HH12 HH24 Ch gi trong ngy (1-12) hoc (0-23)
MI Pht (0-59)
SS Giy (0-59)
SSSSS S giy n na m (0-86399)
/ . , - c t ng thm khi t trong khun dng
on k t t trong nhy p c t ng thm khi
char
t trong khun dng
TH Thm phn th t (1st, 2nd, 4th )
SP Pht m s ( FOUR vi DDSP)
SPTH, THSP Pht m v chuyn sang dng th t ( First, second, ...)
RR Ngy chuyn giao thin nin k vi cc nm <1999.

Nm 0-49 50-99
Nm hin t 0-49 th k hin ti Th k sau
50-99 Th k trc Th k hin ti

Mt s khun dng s
Din gii V d Kt qu
K t

9
Xc nh hin th 1 s 999999 1234

0 Hin th c s 0 u nu di khun 001234


099999
dng ln hn s hin c
$1234
$Thm k t tin t $999999
L FF1234
Thm k t tin t bn a L999999
1234.00
Du thp phn 999999.99
, 1,234
Du phn cch phn nghn 999,999
MI Du m bn phi ( vi cc gi tr m) 999999MI 1234-
PR Thm ngoc nhn vo cc gi tr m 999999PR <1234>

EEE Chuyn sang hin th s E 99.9999RRRR 1.234E+03


V Nhn vi 10 n, n l s cc s 9 t sau V 9999V99 123400
B Hin th c gi tr 0 nu = 0. B9999.99 1234.00
Trang 33
Oracle c bn - SQL v PL/SQL

4.3.HM THAO TC TRN TP HP


4.3.1. Cc hm tc ng trn nhm
Cc hm tc ng trn nhm cc dng d liu hay tc ng ln mt tp hp cc cc dng d liu bao gm:

Hm SQL
Din gii
AVG([DISTINCT/ALL] n)
Gi tr trung bnh ca n,khng k tr null S
COUNT([DISTINCT/ALL] expr)
row c expr khc null
MAX([DISTINCT/ALL] expr)
Gi tr ln nht ca expr
MIN([DISTINCT/ALL] expr)
Gi tr nh nht ca expr
STDDVE([DISTINCT/ALL] n)
Phng sai ca n khng k tr null Tng ca
SUM([DISTINCT/ALL] n)
ca n khng k tr null Variance ca n khng
VARIANCE([DISTINCT/ALL] n)
k tr null

Ch : Tt c cc hm trn nhm mu tin u b qua gi tr NULL tr hm COUNT. Dng hm NVL


chuyn i v tnh gi tr NULL.
C 2 cch dng cc cc hm ny
Tc ng trn ton b cc dng d liu ca cu lnh truy vn
Tc ng trn mt nhm d liu cng tnh cht ca cu lnh truy vn. Cng tnh cht
c ch bi mnh :
[GROUP BY expr]
[HAVING condition]

V d: Tc ng trn ton b cc dng d liu ca cu lnh truy vn:


Tnh mc lng trung bnh ca ton b nhn vin
Select AVG(SAL)
FROM EMP;

Tnh mc lng thp nht ca nhn vin lm ngh CLERK


Select MIN(SAL)
FROM EMP
WHERE JOB =CLERK:

V d: Tc ng trn mt nhm d liu cng tnh cht ca cu lnh truy vn.


Tnh mc lng trung bnh ca tng loi ngh nghip
SELECT JOB, AVG(SAL)
FROM EMP
GROUP BY JOB;

Ch : Ch c cng t trong mnh SELECT cc hm nhm hoc cc column t trong mnh


GROUP BY.
V d:
ng: SELECT MAX(SAL), JOB
FROM EMP
GROUP BY JOB;

Trang 34
Oracle c bn - SQL v PL/SQL

Sai: SELECT MAX(SAL), JOB


FROM EMP;

4.3.2. Mnh GROUP BY


C php:
SELECT [DISTINCT ] {*, column [alias],...}
FROM table;
[WHERE condition]
[GROUP BY expr]
[HAVING condition]
[ORDER BY expr/position [DESC/ASC]]

Mnh GROUP BY s nhm cc dng d liu c cng gi tr ca expr. V d:


GROUP BY JOB ngha l s nhm cc ngh ging nhau.

Mnh HAVING l t iu kin ca nhm d liu. Mnh ny khc mnh WHERE ch mnh
WHERE t iu kin cho ton b cu lnh SELECT.
V d:
SELECT JOB, MAX(SAL)
FROM EMP
WHERE JOB !=MANAGER
GROUP BY JOB;

JOB MAX(SAL)

ANALYST 3000
CLERK 1300
PRESIDENT 5000
SALESMAN 1600

SELECT JOB, MAX(SAL)


FROM EMP
GROUP BY JOB
HAVING COUNT(*)>3;

JOB MAX(SAL)

CLERK 1300
SALESMAN 1600

SELECT JOB, MAX(SAL)


FROM EMP
HAVING MAX(SAL)>=3000
GROUP BY JOB;

JOB MAX(SAL)

ANALYST 3000
PRESIDENT 5000

Trang 35
Oracle c bn - SQL v PL/SQL

4.4.MT S HM MI B SUNG TRONG Oracle9i


4.4.1. Hm NULLIF
C php:
NULLIF(expr1, expr2)
Hm tr v gi tr NULL nu biu thc th nht bng biu thc th 2. Trong trng hp ngc li, n tr v
gi tr ca biu thc th nht.

4.4.2. Hm COALSCE
C php:
COALESCE(expr1, expr2, expr3, ...)
Tr v gi tr ca tham s u tin khc null

4.4.3. Cu lnh case


V d:
Case cu lnh
SELECT ENAME, EXTRACT(YEAR FROM HIREDATE) AS YEAR_OF_HIRE,
(CASE EXTRACT(YEAR FROM HIREDATE)
WHEN 2002 THEN 'NEW HIRE'
WHEN 1997 THEN 'FIVE YEARS SERVICE'
WHEN 1992 THEN 'TEN YEARS SERVICE'
ELSE 'NO AWARD THIS YEAR'
END ) AS AWARD
FROM EMP;

CASE biu thc


SELECT ENAME, SAL,
(CASE
WHEN JOB = DBA THEN SAL * 1.5
WHEN HIREDATE < SYSDATE - TO_YMINTERVAL(05-00) THEN SAL
* 1.25
WHEN DEPTNO IN (40,30,10) THEN SAL * 1.1
ELSE SAL * .9
END ) AS NEW_SAL
FROM EMP;

4.5.BI TP
4.5.1. Hm trn tng dng d liu
1. Lit k tn nhn vin, m phng ban v lng nhn vin c tng 15% (PCTSAL).
DEPTNO ENAME PCTSAL

10 KING 5000
30 BLAKE 2850
10 CLARK 2450
20 JONES 2975

Trang 36
Oracle c bn - SQL v PL/SQL

30 MARTIN 1250
30 ALLEN 1600
30 TURNER 1500
30 JAMES 950
30 WARD 1250
20 FORD 3000
20 SMITH 800
20 SCOTT 3000
20 ADAMS 1100
10 MILLER 1300

2. Vit cu lnh hin th nh sau:


EMPLOYEE_AND_JOB

KING*** *PRESIDENT
BLAKE*** **MANAGER
CLARK*** **MANAGER
JONES*** **MANAGER
MARTIN******SALESMAN
ALLEN*** *SALESMAN
TURNER******SALESMAN
JAMES*** *CLERK
WARD*** **SALESMAN
FORD*** ***ANALYST
SMITH*** *CLERK
SCOTT*** **ANALYST
ADAMS*** *CLERK
MILLER*** ***CLERK

3. Vit cu lnh hin th nh sau:


EMPLOYEE

KING (President)
BLAKE (Manager)
CLARK (Manager)
JONES (Manager)
MARTIN (Salesman)
ALLEN (Salesman)
TURNER (Salesman)
JAMES (Clerk)
WARD (Salesman)
FORD (Analyst)
SMITH (Clerk)
SCOTT (Analyst)
ADAMS (Clerk)
MILLER (Clerk)

4. Vit cu lnh hin th nh sau:


ENAME DEPTNO JOB

BLAKE 30 Manager
MARTIN 30 Salesperson
ALLEN 30 Salesperson
TURNER 30 Salesperson
JAMES 30 Clerk
WARD 30 Salesperson

Trang 37
Oracle c bn - SQL v PL/SQL

5. Tm ngy th 6 u tin cch 2 thng so vi ngy hin ti hin th ngy di dng 09


February 1990.

6. Tm thng itn v tn nhn vin, ngy gia nhp cng ty ca nhn vin phng s 20,
sao cho hin th nh sau:
ENAME DATE_HIRED

JONES april,SECOND 1981


FORD december,THIRD 1981
SMITH december,SEVENTEENTH 1980
SCOTT december,NINTH 1982
ADAMS january,TWELFTH 1983

7. Hin th tn nhn vin, ngy gia nhp cng ty, ngy xt nng lng (sau ngy gia
nhp cng ty 1 nm), sp xp theo th t ngy xt nng lng.
ENAME HIREDATE REVIEW

SMITH 17-12-1980 17-12-1981


ALLEN 20-02-1981 20-02-1982
WARD 22-02-1981 22-02-1982
JONES 02-04-1981 02-04-1982
BLAKE 01-05-1981 01-05-1982
CLARK 09-06-1981 09-06-1982
TURNER 08-09-1981 08-09-1982
MARTIN 28-09-1981 28-09-1982
KING 17-11-1981 17-11-1982
JAMES 03-12-1981 03-12-1982
FORD 03-12-1981 03-12-1982
MILLER 23-01-1982 23-01-1983
SCOTT 09-12-1982 09-12-1983
ADAMS 12-01-1983 12-01-1984

8. Hin th tn nhn vin v lng di dng


ENAME SALARY

ADAMS BELOW 1500


ALLEN 1600
BLAKE 2850
CLARK 2450
FORD 3000
JAMES BELOW 1500
JONES 2975
KING 5000
MARTIN BELOW 1500
MILLER BELOW 1500
SCOTT 3000
SMITH BELOW 1500
TURNER On Target
WARD BELOW 1500

9. Cho bit th ca ngy hin ti

10. a chui di dng nn/nn, kim tra nu khng khun dng tr li l YES, ngc li
l NO. Kim tra vi cc chui 12/34, 01/1a, 99\88
VALUE VALID?

Trang 38
Oracle c bn - SQL v PL/SQL

12/34 YES

11. Hin th tn nhn vin, ngy gia nhp cng ty, ngy lnh lng sao cho ngy lnh
lng phi vo th 6, nhn vin ch c nhn lng sau t nht 15 ngy lm vic ti
cng ty, sp xp theo th t ngy gia nhp cng ty.

4.5.2. Hm trn nhm d liu


1. Tm lng thp nht, ln nht v lng trung bnh ca tt c cc nhn vin

2. Tm lng nh nht v ln ca mi loi ngh nghip

3. Tm xem c bao nhiu gim c trong danh sch nhn vin.

4. Tm tt c cc phng ban m s nhn vin trong phng >3

5. Tm ra mc lng nh nht ca mi nhn vin lm vic cho mt gim c no


sp xp theo th t tng dn ca mc lng.

Trang 39
Oracle c bn - SQL v PL/SQL

Chng 5. LNH TRUY VN D LIU M RNG


5.1.KT HP D LIU T NHIU BNG
5.1.1. Mi lin kt tng ng
Mi lin kt tng ng c th hin trong mnh WHERE.
lin kt trong mnh WHERE phi ch r tn ca cc column v mnh c t tng ng.
V d:
emp.deptno =dept.deptno

Cc column trng tn phi c ch r column nm bng no thng qua tn hoc qua alias. Tn trng
ny c th t trong cc mnh khc nh SELECT, ORDER BY..
V d:
SELECT DEPT.DEPTNO, ENAME,JOB, DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
ORDER BY DEPT.DEPTNO;

SELECT A.DEPTNO, A.ENAME, A.JOB, B.DNAME


FROM EMP A, DEPT B
WHERE A.DEPTNO = B.DEPTNO
ORDER BY A.DEPTNO;

5.1.2. Mi lin kt khng tng ng


Mi lin kt tng ng c th hin trong mnh WHERE.
lin kt trong mnh WHERE phi ch r tn ca cc column v mnh c t khng tng ng.
V d:
WHERE E.SAL BETWEEN S. LOSAL AND S.HISAL

Cc column trng tn phi c ch r column nm bng no thng qua tn hoc qua alias. Tn trng
ny c th t trong cc mnh khc nh SELECT, ORDER BY..
V d:
SELECT E.ENAME,E.JOB, S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S. LOSAL AND S.HISAL;

Ch : iu kin lin kt ng l s cc bng - 1 = s cc iu kin lin kt

5.1.3. Mi lin kt cng


Mi lin kt cng tr v c cc gi tr NULL trong biu thc iu kin. Du (+) v no tnh thm cc gi
tr NULL v .
Mt cu lnh select ch t c 1 mi lin kt cng, du (+) t bn phi column lin kt

Trang 40
Oracle c bn - SQL v PL/SQL

Trong mnh WHERE ca mi lin kt cng khng c dng ton t IN hoc OR ni cc iu kin lin
kt khc.
V d:
SELECT E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO (+)=D.DEPTNO
AND D.DEPTNO IN (30, 40);

ENAME DEPTNO DNAME

BLAKE 30 SALES
MARTIN 30 SALES
ALLEN 30 SALES
TURNER 30 SALES
JAMES 30 SALES
WARD 30 SALES
40 OPERATIONS

5.1.4. Lin kt ca bng vi chnh n (t thn)


C th lin kt bng vi chnh n bng cch t alias.
V du:
Select e.ename emp_name, e.sal emp_sal,
m.ename mgr_name, m.sal mgr_sal
from emp e, emp m
where e.mgr = m.empno
and e.sal <m.sal;

EMP_NAME EMP_SAL MGR_NAME MGR_SAL

BLAKE 2850 KING 5000


CLARK 2450 KING 5000
JONES 2975 KING 5000
MARTIN 1250 BLAKE 2850
ALLEN 1600 BLAKE 2850
TURNER 1500 BLAKE 2850
JAMES 950 BLAKE 2850
WARD 1250 BLAKE 2850
SMITH 800 FORD 3000
ADAMS 1100 SCOTT 3000
MILLER 1300 CLARK 2450

5.1.5. Cch biu din kt ni mi trong Oracle 9i Tch -cc


CROSS JOIN (Cartesian Product)
SELECT E.ENAME, D.DNAME
FROM EMP E CROSS JOIN DEPT D;

Kt ni t nhin NATURAL JOIN (Equijoin on All Identically Named Columns).


SELECT E.ENAME, D.DNAME
FROM EMP E NATURAL JOIN DEPT D;

Mnh USING (Tng t nh Natural Join, nhng cho php ch r tn ct c s dng trong php kt
ni).

Trang 41
Oracle c bn - SQL v PL/SQL

SELECT E.ENAME, D.DNAME


FROM EMP E JOIN DEPT D USING (DEPTNO);

Mnh ON (Ch r tn ct tham gia trong php kt ni)


SELECT E.ENAME, D.DNAME
FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO);

Kt ni tri LEFT OUTER JOIN


SELECT E.ENAME, D.DNAME
FROM EMP E LEFT OUTER JOIN DEPT D ON (E.DEPTNO = D.DEPTNO);

Kt ni tri RIGHT OUTER JOIN


SELECT E.ENAME, D.DNAME
FROM EMP E RIGHT OUTER JOIN DEPT D ON (E.DEPTNO= D.DEPTNO);

Kt ni FULL OUTER JOIN (All records from both tablesIdentical to a union of left outer join and right
outer join)
SELECT E.ENAME, D.DNAME
FROM EMP E FULL OUTER JOIN DEPT D ON (E.DEPTNO = D.DEPTNO);

5.1.6. Cc ton t tp hp
Tn ton t Din gii
UNION Kt hp kt qu ca nhiu cu hi vi nhau, ch gi li mt i din cho cc mu tin
trng nhau.

UNION ALL Kt hp kt qu ca nhiu cu hi vi nhau, cc mu tin trng nhau


cng c lp li
INTERSET
Ly phn giao cc kt qu ca nhiu cu hi
MINUS Ly kt qu c trong cu hi th nht m khng c trong cu hi th hai (cu hi sau
ton t MINUS)

V d:

Select job from emp where deptno = 10


Union
Select job from emp where deptno = 30;

JOB

CLERK
MANAGER
PRESIDENT
SALESMAN

Trang 42
Oracle c bn - SQL v PL/SQL

5.2.LNH TRUY VN LNG


5.2.1. Cu lnh SELECT lng nhau.
Trong mnh WHERE
Tm nhng nhn vin lm cng ngh vi BLAKE
select ename, job
from emp
where job = (select job from emp where ename = BLAKE);

ENAME JOB

BLAKE MANAGER
CLARK MANAGER
JONES MANAGER

Trong mnh HAVING


Tm nhng phng c mc lng trung bnh ln hn phng 30

SELECT DEPTNO, AVG(SAL) FROM EMP


HAVING AVG(SAL) > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO =30)
GROUP BY DEPTNO;

DEPTNO AVG(SAL)

10 2916.66667
20 2175

5.2.2. Ton t SOME/ANY/ALL/NOT IN/EXITS


Tn ton t Din gii
NOT IN Khng thuc
ANY v SOME So snh mt gi tr vi mi gi tr trong mt danh sch hay trong kt qu tr v
ca cu hi con, phi sau ton t =
ALL So snh mt gi tr vi mi gi tr trong danh sch hay trong kt qu tr v ca
cu hi con.
EXISTS Tr v TRUE nu c tn ti.

V d:

SELECT * FROM emp


WHERE sal = ANY (SELECT sal FROM emp WHERE deptno=30);

SELECT * FROM emp


WHERE sal >= ALL (select distinct sal
From emp
Where deptno =30)
Order by sal desc;

SELECT ENAME, SAL, JOB, DEPTNO


FROM EMP
WHERE SAL > SOME (SELECT DISTINCT SAL
FROM EMP
WHERE DEPTNO =30)

Trang 43
Oracle c bn - SQL v PL/SQL

ORDER BY SAL DESC;

Tm nhng ngi c nhn vin


SELECT EMPNO, ENAME, JOB, DEPTNO
FROM EMP E
WHERE EXISTS (SELECT EMPNO FROM EMP WHERE EMP.MGR = E.EMPNO);

5.3.CU TRC HNH CY


5.3.1. Cu trc hnh cy trong 1 table
Trong mt table ca CSDL Oracle c th hin cu trc hnh cy. V d trong bng EMP cu trc th hin cp
qun l.
Root node: l node cp cao nht
Child node: l node con hay khng phi l root node Parent
node: l node c node con
Leaf node: l node khng c node con

Level (cp)
Level l mt ct gi cha cp trong cu trc hnh cy. V d.
SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR is NULL;

LEVEL DEPTNO EMPNO ENAME JOB SAL

1 10 7839 KING PRESIDENT 5000


2 30 7698 BLAKE MANAGER 2850
3 30 7654 MARTIN SALESMAN 1250
3 30 7499 ALLEN SALESMAN 1600
3 30 7844 TURNER SALESMAN 1500
3 30 7900 JAMES CLERK 950
3 30 7521 WARD SALESMAN 1250
2 10 7782 CLARK MANAGER 2450
3 10 7934 MILLER CLERK 1300
2 20 7566 JONES MANAGER 2975
3 20 7902 FORD ANALYST 3000
4 20 7369 SMITH CLERK 800
3 20 7788 SCOTT SALEMAN 3300
4 20 7876 ADAMS CLERK 1100

5.3.2. K thut thc hin


C th nh ngha quan h tha k trong cu hi bng mnh STAR WITH v CONNECT BY trong cu
lnh SELECT, mi mu tin l mt node trong cy phn cp. Ct gi LEVEL cho bit cp ca mu tin hay cp
ca node trong quan h tha k.
C php:
SELECT [DISTINCT/ALL] [expr [c_ias]]
FROM [table/view/snapshot] [t_alias]
[WHERE condition]
[START WITH condition CONNECT BY PRIOR condition]
[GROUP BY expr] [HAVING condition]
[UNION/UNION ALL/INTERSET/MINUS select command]

Trang 44
Oracle c bn - SQL v PL/SQL

[ORDER BY expr/position [DESC/ASC]]


Vi:
START WITH c t im u ca hnh cy. Khng th column
gi level mnh ny.
CONNECT BY Ch column trong mi lin h tnh cy.
PRIOR nh hng cu trc. Nu prior xut hin trc mgr,
Mgr s c tm trc sau n empno, y l hnh
cy hng ln. Nu prior xut hin trc empno,
empno s c tm trc sau n empno, y l
hnh cy hng xung.

V d:
SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR MGR = EMPNO
START WITH empno = 7876;

LEVEL DEPTNO EMPNO ENAME JOB SAL

1 20 7876 ADAMS CLERK 1100


2 20 7788 SCOTT SALEMAN 3300
3 20 7566 JONES MANAGER 2975
4 10 7839 KING PRESIDENT 5000

5.3.3. Mnh WHERE trong cu trc hnh cy


Mnh WHERE v CONNECT BY c th c dng ng thi trong cu trc hnh cy. Nu
mnh WHERE loi tr mt s row ca cu trc hnh cy th ch nhng row c loi
tr. Nu iu kin t trong mnh CONNECT BY th ton b nhnh ca row b loi tr.
V d 1:
SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL
FROM EMP WHERE ENAME != SCOTT
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL;

LEVEL DEPTNO EMPNO ENAME JOB SAL

1 10 7839 KING PRESIDENT 5000


2 30 7698 BLAKE MANAGER 2850
3 30 7654 MARTIN SALESMAN 1250
3 30 7499 ALLEN SALESMAN 1600
3 30 7844 TURNER SALESMAN 1500
3 30 7900 JAMES CLERK 950
3 30 7521 WARD SALESMAN 1250
2 10 7782 CLARK MANAGER 2450
3 10 7934 MILLER CLERK 1300
2 20 7566 JONES MANAGER 2975
3 20 7902 FORD ANALYST 3000
4 20 7369 SMITH CLERK 800
4 20 7876 ADAMS CLERK 1100

V d 2:
SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO = MGR AND ENAME != SCOTT

Trang 45
Oracle c bn - SQL v PL/SQL

START WITH MGR IS NULL;

LEVEL DEPTNO EMPNO ENAME JOB SAL

1 10 7839 KING PRESIDENT 5000


2 30 7698 BLAKE MANAGER 2850
3 30 7654 MARTIN SALESMAN 1250
3 30 7499 ALLEN SALESMAN 1600
3 30 7844 TURNER SALESMAN 1500
3 30 7900 JAMES CLERK 950
3 30 7521 WARD SALESMAN 1250
2 10 7782 CLARK MANAGER 2450
3 10 7934 MILLER CLERK 1300
2 20 7566 JONES MANAGER 2975
3 20 7902 FORD ANALYST 3000
4 20 7369 SMITH CLERK 800

5.4.BI TP
1. Hin th ton b tn nhn vin v tn phng ban lm vic sp xp theo tn phng
ban.

2. Hin th tn nhn vin, v tr a l, tn phng vi iu kin lng >1500.


ENAME LOC DNAME

KING NEW YORK ACCOUNTING


BLAKE CHICAGO SALES
CLARK NEW YORK ACCOUNTING
JONES DALLAS RESEARCH
ALLEN CHICAGO SALES
FORD DALLAS RESEARCH
SCOTT DALLAS RESEARCH

3. Hin th tn nhn vin, ngh nghip, lng v mc lng.


ENAME JOB SAL GRADE

JAMES CLERK 950 1


SMITH CLERK 800 1
ADAMS CLERK 1100 1
MARTIN SALESMAN 1250 2
WARD SALESMAN 1250 2
MILLER CLERK 1300 2
ALLEN SALESMAN 1600 3
TURNER SALESMAN 1500 3
BLAKE MANAGER 2850 4
CLARK MANAGER 2450 4
JONES MANAGER 2975 4
FORD ANALYST 3000 4
SCOTT ANALYST 3000 4
KING PRESIDENT 5000 5

4. Hin th tn nhn vin, ngh nghip, lng v mc lng, vi iu kin mc


lng=3.
ENAME JOB SAL GRADE

ALLEN SALESMAN 1600 3


TURNER SALESMAN 1500 3

Trang 46
Oracle c bn - SQL v PL/SQL

5. Hin th nhng nhn vin ti DALLAS


ENAME LOC SAL

JONES DALLAS 2975


FORD DALLAS 3000
SMITH DALLAS 800
SCOTT DALLAS 3000
ADAMS DALLAS 1100

6. Hin th tn nhn vin , ngh nghip, lng, mc lng, tn phng lm vic tr nhn
vin c ngh l cleck v sp xp theo chiu gim.
ENAME JOB SAL GRADE DNAME

MARTIN SALESMAN 1250 2 SALES


WARD SALESMAN 1250 2 SALES
ALLEN SALESMAN 1600 3 SALES
TURNER SALESMAN 1500 3 SALES
BLAKE MANAGER 2850 4 SALES
CLARK MANAGER 2450 4 ACCOUNTING
JONES MANAGER 2975 4 RESEARCH
FORD ANALYST 3000 4 RESEARCH
SCOTT ANALYST 3000 4 RESEARCH
KING PRESIDENT 5000 5 ACCOUNTING

7. Hin th chi tit v nhng nhn vin kim c 36000 $ 1 nm hoc ngh l cleck.
(gm cc trng tn, ngh, thu nhp, m phng, tn phng, mc lng)
ENAME JOB ANUAL_SAL DNAME GRADE

JAMES CLERK 11400 SALES 1


SMITH CLERK 9600 RESEARCH 1
ADAMS CLERK 13200 RESEARCH 1
MILLER CLERK 15600 ACCOUNTING 2
FORD ANALYST 36000 RESEARCH 4
SCOTT ANALYST 36000 RESEARCH 4

8. Hin th nhng phng khng c nhn vin no lm vic.


DEPTNO DNAME LOC

40 OPERATIONS BOSTON

9. Hin th m nhn vin, tn nhn vin, m ngi qun l, tn ngi qun l


EMP_NAME EMP_SAL MGR_NAME MGR_SAL

BLAKE 2850 KING 5000


CLARK 2450 KING 5000
JONES 2975 KING 5000
MARTIN 1250 BLAKE 2850
ALLEN 1600 BLAKE 2850
TURNER 1500 BLAKE 2850
JAMES 950 BLAKE 2850
WARD 1250 BLAKE 2850
FORD 3000 JONES 2975
SMITH 800 FORD 3000
SCOTT 3000 JONES 2975
ADAMS 1100 SCOTT 3000
MILLER 1300 CLARK 2450

Trang 47
Oracle c bn - SQL v PL/SQL

10. Nh cu 9 hin th thm thng tin v ng KING.


EMP_NAME EMP_SAL MGR_NAME MGR_SAL

KING 5000
BLAKE 2850 KING 5000
CLARK 2450 KING 5000
JONES 2975 KING 5000
MARTIN 1250 BLAKE 2850
ALLEN 1600 BLAKE 2850
TURNER 1500 BLAKE 2850
JAMES 950 BLAKE 2850
WARD 1250 BLAKE 2850
FORD 3000 JONES 2975
SMITH 800 FORD 3000
SCOTT 3000 JONES 2975
ADAMS 1100 SCOTT 3000
MILLER 1300 CLARK 2450

11. Hin th ngh nghip c tuyn dng vo nm 1981 v khng c tuyn dng vo
nm 1994.

12. Tm nhng nhn vin gia nhp cng ty trc gim c ca h.

13. Tm tt c cc nhn vin, ngy gia nhp cng ty, tn nhn vin, tn ngi gim c
v ngy gia nhp cng ty ca ngi gim c y.
EMP_NAME EMP_SAL MGR_NAME MGR_SAL

BLAKE 2850 BLAKE 2850


MARTIN 1250 BLAKE 2850
ALLEN 1600 BLAKE 2850
TURNER 1500 BLAKE 2850
JAMES 950 BLAKE 2850
WARD 1250 BLAKE 2850
CLARK 2450 CLARK 2450
MILLER 1300 CLARK 2450
JONES 2975 JONES 2975
FORD 3000 JONES 2975
SMITH 800 JONES 2975
SCOTT 3300 JONES 2975
ADAMS 1100 JONES 2975
13 rows selected.

14. Tm nhng nhn vin kim c lng cao nht trong mi loi ngh nghip.
JOB MAX(SAL)

ANALYST 3000
CLERK 1300
MANAGER 2975
PRESIDENT 5000
SALESMAN 1600

15. Tm mc lng cao nht trong mi phng ban, sp xp theo th t phng ban.
ENAME JOB DEPTNO SAL

KING PRESIDENT 10 5000

Trang 48
Oracle c bn - SQL v PL/SQL

SCOTT SALEMAN 20 3300


BLAKE MANAGER 30 2850

16. Tm nhn vin gia nhp vo phng ban sm nht


ENAME HIREDATE DEPTNO

CLARK 09-06-1981 10
SMITH 17-12-1980 20
ALLEN 20-02-1981 30

17. Hin th nhng nhn vin c mc lng ln hn lng TB ca phng ban m h lm


vic.
EMPNO ENAME SAL DEPTNO

7839 KING 5000 10


7566 JONES 2975 20
7902 FORD 3000 20
7788 SCOTT 3300 20
7698 BLAKE 2850 30
7499 ALLEN 1600 30

18. Hin th tn nhn vin, m nhn vin, m gim c, tn gim c, phng ban lm
vic ca gim c, mc lng ca gim c.
EMP_NUMBER EMP_NAME EMP_SAL MGR_NUMBER MGR_NAME MGR_DEPT MGR_GRADE

7698 BLAKE 2850 7698 BLAKE 30 4


7654 MARTIN 1250 7698 BLAKE 30 4
7499 ALLEN 1600 7698 BLAKE 30 4
7844 TURNER 1500 7698 BLAKE 30 4
7900 JAMES 950 7698 BLAKE 30 4
7521 WARD 1250 7698 BLAKE 30 4
7782 CLARK 2450 7782 CLARK 10 4
7934 MILLER 1300 7782 CLARK 10 4
7566 JONES 2975 7566 JONES 20 4
7902 FORD 3000 7566 JONES 20 4
7369 SMITH 800 7566 JONES 20 4
7788 SCOTT 3300 7566 JONES 20 4
7876 ADAMS 1100 7566 JONES 20 4
13 rows selected.

Trang 49
Oracle c bn - SQL v PL/SQL

Chng 6. BIN RUNTIME


6.1.D LIU THAY TH TRONG CU LNH
Dng (&) ch phn thay th trong cu lnh.
Nu dng (&&) ch bin thay th th sau cu lnh bin thay th vn cn tn ti V d 1:
SELECT * FROM emp
WHERE &Condition

Enter value for condition: sal > 1000

Khi ny cu lnh trn tng ng vi:


SELECT * FROM emp
WHERE sal > 1000

V du 2:
Select ename, deptno, job
From emp
Where deptno = &&depno_please;

6.2.LNH DEFINE
Khai bo v gn tr cho cc bin, v d khai bo bin condition c gi tr 'sal > 1000'
DEFINE condition = 'sal > 1000'

Khi cu lnh sau khng yu cu nhp vo gi tr cho codition


SELECT * FROM emp
WHERE &Condition

loi b bin ra khi b nh dng lnh UNDEFINE. V d:


UNDEFINE condition

lit k cc bin khai bo dng lnh DEFINE m khng ch bin, v d


DEFINE
DEFINE CONDITION = 'SAL > 1000'
V d:
DEFINE REM=SAL*12+NVL(COMM,0)

SELECT ENAME, JOB, &REM


FROM EKP ORDER BY & REM;

Trang 50
Oracle c bn - SQL v PL/SQL

6.3.LNH ACCEPT
Khai bo v gn tr cho bin vi dng hin th
ACCEPT variable [NUMBER/CHAR] [PROMPT/NOPROMPT 'text'] HIDE

V d:
ACCEPT Salary NUMBER PROMPT 'Salary figure: '
Salary figure : 3000

T kho hide cho php che chui nhp liu, hay dng khi nhp password.
ACCEPT password CHAR PROMPT 'Enter password: ' HIDE
Password : ***

6.4.BI TP
1. Hin th tn nhn vin, ngy gia nhp cng ty vi iu kin ngy gia nhp cng ty
nm trong khong hai bin runtime c nhp vo t bn phm (&first_date,
&last_date).

2. Hin th tn nhn vin, ngh nghip, lng, m gim c, m phng ban vi iu


kin ngh nghip bng mt bin c nhp vo t bn phm. (&job)

3. nh ngha mt bin tnh thu nhp mt nm ca nhn vin. Dng bin ny tm


nhng nhn vin c thu nhp ln hn hoc bng $30000.

4. nh ngha mt bin l khong thi gian nhn vin lm trong cng ty. Hin th tn
nhn vin v qung thi gian nhn vin lm vic vi iu kin nhn vin l mt
bin c nhp vo t bn phm.
ENAME LENGTH OF SERVICE

KING 19 YEAR 4 MONTHS

Trang 51
Oracle c bn - SQL v PL/SQL

Chng 7. TABLE V CC LNH SQL V TABLE


7.1.LNH TO TABLE
7.1.1. C php to bng
to mt bng mi dng lnh CREATE TABLE. C
php:
CREATE TABLE tablename
(column [datatype][DEFAULT expr][column_constraint]..)
[PCTFREE integer][PCTUSED integer]
[INITRANS integer][MAXTRANS integer]
[TABLESPACE tablespace]
[STORAGE storage_clause]
[AS subquery]
Vi:
tablename Tn table cn to
column Tn column trong table
[datatype] Kiu d liu ca column
[DEFAULT expr] Gi tr mc nh ca column trong trng hp
NULL l expr
[column_constraint] Rng buc ca bn thn column
[table_constraint] Rng buc ca ton bng
[PCTFREE integer] Phn trm khng gian cn trng
[PCTUSED integer] Phn trm khng gian s dng
[INITRANS integer] S bn ghi khi to
[MAXTRANS integer] S bn ghi ln nht
[TABLESPACE tablespace]
Ch nh TABLESAPCE cho bng
[STORAGE storage_clause]
Ghi mnh lu tr, n v mc nh l KB trong
cc cc chn la l: INITIAL - dung lng khi
to; NEXT - dung lng tng tip theo; MINEXTENTS
- % m rng nh nht;
MAXEXTENTS- % m rng ln nht; PCTINCREASE - Tc
tng hng nm.
[AS subquery] To bng c cu trc ging mnh truy vn

V d 1:
CREATE TABLE EMP
EMPNO NUMBER NOT NULL CONSTRAINT PK_EMP PRIMARY KEY,
ENAME VARCHAR2(10) CONSTRAINT NN_ENAME NOT NULL
CONSTRAINT UPPER_ENAME CHECK (ENAME=UPPER(ENAME)),
JOB VARCHAR2(9),
MGR NUMBER CONSTRAINT FK_MGR REFERENCES
SCOTT.EMP(EMPNO),
HIREDATE DATE DEFAULT SYSDATE, 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))
PCTFREE 5 PCTUSED 75

V du 2:
CREATE TABLE SALGRADE1

Trang 52
Oracle c bn - SQL v PL/SQL

(GRADE NUMBER CONSTRAINT PK_SALGRADE PRIMARY KEY,


LOSAL NUMBER,
HISAL NUMBER)
TABLESPACE USER
STORAGE (INITIAL 6144 NEXT 6144
MINEXTENTS 1 MAXEXTENTS 5 PCTINCREASE 5)

V d 3:
CREATE TABLE DEPT10
AS
SELECT EMPNO, ENAME, JOB, SAL
FROM EMP WHERE DEPTNO =10;

V d 4:
CREATE TABLE EMP_SAL (NAME, SALARY,GRADE)AS
SELECT ENAME, SAL, GRADE
FROM EMP, SALGARDE
WHERE EMP.SAL BETWEEN LOSAL AND HISAL ;

to mt table mi, chng ta cn phi chun b mt s thng tin sau:


Table phi c chun ha.
Nhng column m cho php null nn nh ngha sau tit kim ni lu tr. Gp cc
table li nu c th.
Ch nh cc thng s pcfree v pctused C th ch
nh 2 thng s initstran, maxtrans C th ch nh
tablespace cho table
C th c lng kch thc table, v cc thng s cho storage.

7.1.2. Tnh ton kch thc table (tham kho)


1. Tnh ton khong a cn thit cho data block header. Tnh theo
cng thc sau:
BLOCK HEADER = (FIXED HEADER + VARIABLE TRANSACTION HEADER) +
(TABLE DIRECTORY + ROW DIRECTORY)

Trong :
fixed header = 57 bytes
variable transaction header = 23*gi tr ca thng s instrans
table directory =4
row directory = 2* s lng row trong block.

2. Tnh ton khong a trng cha d liu ca data block. Tnh theo cng thc sau:
Khong a trng cha data =(block size -total block header) -
(block size -(fixed header+ variable transaction
header))*(pctree/100)

C th bit block size bng cch dng lnh


show parameters db_block_size.

Trang 53
Oracle c bn - SQL v PL/SQL

3. Tnh ton khong a trng kt hp bng gi tr ca mi row.

4. Tnh ton kch thc trung bnh ca row:


Kch thc trung bnh ca row = row header +A+B+C
A = Tng chiu di ca cc ct <= 250 byte
B = Tng chiu di ca cc ct > 250 byte
C = Khong a trng kt hp

5. Quyt nh s row trung bnh cho mt block:


avg rows /block = available space/average row size

6. Tnh ton s lng block


Block = s row / s row trung bnh cho mt block

7.2.MT S QUY TC KHI TO TABLE


7.2.1. Quy tc t tn Object
Tn di t 1 n 30 k t, ngoi tr tn CSDL khng qu 8 k t v tn lin kt c
th di n 128 k t
Tn khng cha du nhy (")
Khng phn bit ch hoa ch thng
Tn phi bt u bng k t ch trong b k t ca CSDL
Tn ch c th cha k t s trong tp k t ca CSDL. C th dng cc k t _, $, #.
Oracle khng khuyn khch dng cc k t $ v #.
Tn khng c trng vi cc t dng bi Oracle (xemphu lc 1) Tn
khng c cch khong trng
Tn c th t trong cp du nhy kp, khi tn c th bao gm cc k t bt k,
c th bao gm khong trng, c th dng cc t kha ca Oracle, phn bit ch
hoa ch thng.
Tn phi duy nht trong "khng gian tn" nht nh. Cc object thuc cng khng
gian tn phi c tn khc nhau.

Cc b danh ca ct, b danh bng, tn ngi s dng, mt khu mc d khng phi l cc object hoc cc
thnh phn con ca object nhng cng phi c t tn theo cc quy tc trn, ngoi tr
B danh ct, b danh bng ch tn ti khi thc hin cc lnh SQL v khng c lu tr trong CSDL, do vy
khng p dng quy tc 9 v khng gian tn.
Mt khu khng thuc v khng gian tn no v do cng khng p dng quy tc 9. Nn t tn
theo mt quy tc t tn thng nht

7.2.2. Quy tc khi tham chiu n Object C php chung


khi tham chiu n cc object
S chung khi tham chiu cc object hoc thnh phn ca cc object
Schema.Object.Part.@dblink

Trong :
object Tn object

Trang 54
Oracle c bn - SQL v PL/SQL

schema Schema cha object


part Thnh phn ca object
dblink Tn CSDL cha object

Oracle gii quyt vic tham chiu cc Object


Khi tham chiu n mt object trong cu lnh SQL, Oracle phn tch cu lnh v v xc nh cc object
trong khng gian tn. Sau khi xc nh cc object, Oracle thc hin cc thao tc m cu lnh quy nh trn
object. Nu tn object truy cp khng thuc khng gian tn th cu lnh khng c thc hin v c thng
bo li.
Cu lnh sau thm mt mu tin vo bng DEPT
INSERT INTO Dept VALUES (50, 'SUPPOR', 'PARIS')

Theo ng cnh ca cu lnh, Oracle xc nh bng DEPT c th l:


Mt table trong schema ca bn
Mt view trong schema ca bn
ng ngha ring cho table hoc view
ng ngha chung cho table hoc view

Tham chiu n cc object khng thuc quyn s hu


tham chiu n cc object khng thuc schema hin thi, phi ch ra tn ca schema cha object mun
truy cp
schema.object

V d: xa table EMP trong schema SCOTT


DROP TABLE scott.emp

Tham chiu cc object t xa


truy cp n mt CSDL xa, sau tn object phi ch ra tn lin kt CSDL (database link) ca CSDL cha
object mun truy cp. Database link l mt schema object, Oracle dng thm nhp v truy xut CSDL t
xa.

7.3.Cc Kiu d liu c bn


7.3.1. Kiu CHAR
Kiu CHAR dng khai bo mt chui c chiu di c nh, khi khai bo bin hoc ct kiu CHAR vi
chiu di ch nh th tt c cc mc tin ca bin hay ct ny u c cng chiu di c ch nh. Cc mc
tin ngn hn Oracle s t ng thm vo cc khong trng cho chiu di. Oracle khng cho php gn
mc tin di hn chiu di ch nh i vi kiu CHAR. Chiu di ti a cho php ca kiu CHAR l 255 byte

7.3.2. Kiu VARCHAR2


Kiu VARCHAR2 dng khai bo chui k t vi chiu di thay i. Khi khai bo mt bin hoc ct kiu
VARCHAR2 phi ch ra chiu di ti a, cc mc tin cha trong bin hay ct kiu VARCHAR2 c chiu di
thc s l chiu di ca mc tin. Oracle khng cho php gn

Trang 55
Oracle c bn - SQL v PL/SQL

mc tin di hn chiu di ti a ch nh i vi kiu VARCHAR2. Chiu di ti a kiu VARCHAR2 l 2000


byte.

7.3.3. Kiu VARCHAR


Hin ti Oracle xem kiu VARCHAR2 v VARCHAR l nh nhau, tuy nhin Oracle khuyn nn
dng VARCHAR2. Oracle d nh trong tng lai dng kiu VARCHAR cha cc chui vi
chiu di bin i, nhng trong php so snh s c ch nh theo nhiu ng ngha khc
nhau.

7.3.4. Kiu NUMBER


Kiu s ca Oracle dng cha cc mc tin dng s dng, s m, s vi du chm ng.
NUMBER(p, s)
p S ch s trc du chm thp phn (precision), p t 1
n 38 ch s
s S cc ch s tnh t du chm thp phn v bn phi
(scale), s t -84 n 127

NUMBER(p) S c du chm thp phn c nh vi precision bng p v


scale bng 0

NUMBER S vi du chm ng vi precision bng 38. Nh rng


scale khng c p dng cho s vi du chm ng.

V d sau cho thy cch thc Oracle lu tr d liu kiu s ty theo cch nh precision v
scale khc nhau.

D liu thc Kiu Gi tr lu 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) Khng hp l
7456123.8 NUMBER(15,1) 7456123.8
7456123.89 NUMBER(7,-2) 7456100
7456123.89 NUMBER(-7,2) Khng hp l

7.3.5. Kiu FLOAT


Dng khai bo kiu s du chm ng, vi chnh xc thp phn 38 hay chnh xc nh phn l 126.
FLOAT(b) Khai bo kiu du chm ng vi chnh xc nh phn l b, b t 1 n 126. C th chuyn t
chnh xc nh phn sang chnh xc thp phn bng cch nhn chnh xc nh phn vi 0.30103

7.3.6. Kiu LONG


Dng khai bo kiu chui k t vi di bin i, chiu di ti a ca kiu LONG l 2 gigabyte. Kiu
LONG thng c dng cha cc vn bn.
C mt s hn ch khi dng kiu LONG

Trang 56
Oracle c bn - SQL v PL/SQL

Mt table khng th cha nhiu hn mt ct kiu LONG


D liu kiu LONG khng th tham gia vo cc rng buc ton vn, ngoi tr kim tra
NULL v khc NULL
Khng th index mt ct kiu LONG
Khng th truyn tham s kiu LONG cho hm hoc th tc Cc
hm khng th tr v d liu kiu LONG
Trong cu lnh SQL c truy cp cc ct kiu LONG, th vic cp nht hoc kha cc
bng ch cho php trong cng mt CSDL

Ngoi ra, cc ct kiu LONG khng c tham gia trong cc thnh phn sau ca cu lnh
SQL
Cc mnh WHERE, GROUP BY, ORDER BY, CONNECT BY hoc vi tc t
DISTINCT trong cu lnh SELECT
Cc hm s dng trong cu lnh SQL nh SUBSTR, INSTR
Trong danh sch la chn ca cu lnh SELECT c s dng mnh GROUP BY Trong danh
sch la chn ca cu hi con, cu hi c s dng cc ton t tp hp Trong danh sch la chn
ca cu lnh CREATE TABLE AS SELECT

7.3.7. Kiu DATE


Dng cha d liu ngy v thi gian. Mc d kiu ngy v thi gian c th c cha trong kiu CHAR
v NUMBER.
Vi gi tr kiu DATE, nhng thng tin c lu tr gm th k, nm, thng, ngy, gi, pht, giy. Oracle
khng cho php gn gi tr kiu ngy trc tip, gn gi tr kiu ngy, bn phi dng TO_DATE chuyn
gi tr kiu chui k t hoc kiu s.
Nu gn mt gi tr kiu ngy m khng ch thi gian th thi gian mc nh l 12 gi m, Nu gn gi tr
kiu ngy m khng ch ra ngy, th ngy mc nh l ngy u ca thng. Hm SYSDATE cho bit ngy v
thi gian h thng.
Tnh ton i vi kiu ngy
i vi d liu kiu ngy, bn c th thc hin cc php ton cng v tr. V d:
SYSDATE+1 ngy hm sau
SYSDATE-7 cch y mt tun
SYSDATE+(10/1440) mi pht sau

Ngy Julian: L gi tr s cho bit s ngy k t ngy 1 thng ging nm 4712 trc cng nguyn.
V d:
SELECT TO_CHAR (TO_DATE('01-01-1992', 'MM-DD-YYYY'), 'J') JULIAN
FROM DUAL;

Kt qu:
JULIAN

2448623

Trang 57
Oracle c bn - SQL v PL/SQL

7.3.8. Kiu RAW v kiu LONG RAW


Kiu RAW v LONG RAW dng cha cc chui byte, cc d liu nh phn nh hnh nh, m thanh. Cc d
liu kiu RAW ch c th gn hoc truy cp ch khng c thc hin cc thao tc nh i vi chui k t.
Kiu RAW ging nh kiu VARCHAR2 v kiu LONG RAW ging kiu LONG, ch khc nhau ch Oracle t
ng chuyn i cc gi tr kiu CHAR, VARCHAR2 v LONG gia tp hp k t ca CSDL v tp k t ca
cc ng dng.

7.3.9. Kiu ROWID


Mi mu tin trong CSDL c mt a ch c kiu ROWID. ROWID bao gm cc thnh phn:
block.row.file.

Vi
block Chui h hexa cho bit block cha row
row Chui h hexa cho bit row trong block
file Chui h hexa cho bit database file cha block
V d:
0000000F.0000.0002

Row u tin trong block 15 ca data file th hai.

7.3.10. Kiu MLSLABEL


Kiu MLSLABEL dng cha label dng nh phn m Oracle dng m bo hot ng ca bn thn h
thng.

7.3.11. Chuyn i kiu


Chuyn i mc nh
Ni chung mt biu thc khng th gm cc gi tr thuc nhiu kiu khc nhau, tuy nhin Oracle cho php
chuyn i gi cc kiu d liu. Oracle t ng chuyn kiu ca d liu trong mt s trng hp sau
Khi INSERT hoc UPDATE gn gi tr cho ct c kiu khc, Oracle s t ng chuyn
gi tr sang kiu ca ct.
Khi s dng cc hm hoc cc ton t m cc tham s c kiu khng tng thch th
Oracle s t ng chuyn kiu.
Khi s dng ton t so snh m cc gi tr c cc kiu khc nhau, Oracle s t ng
chuyn kiu.

V d 1:
SELECT ename FROM emp WHERE hiredate = '12-MAR-1993'

Oracle t ng chuyn chui '12-MAR-1993' sang kiu DATE trong php so snh

V d 2:
SELECT ename FROM emp WHERE ROWID = '00002514.0001.0001'

Trang 58
Oracle c bn - SQL v PL/SQL

Oracle t ng chuyn chui '00002514.0001.0001' sang kiu ROWID trong php so


snh

Ngi s dng t chuyn i


Oracle cung cp cc hm chuyn i kiu, v d
TO_NUMBER Chuyn sang kiu s
TO_CHAR Chuyn sang kiu k t
TO_DATE Chuyn sang kiu ngy

(xem phn tra cu cc hm v th tc)

7.4.RNG BUC D LIU TRONG TABLE


Cc dng constraint gm:
NULL/NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY (Referential Key)
CHECK

7.4.1. NULL/NOT NULL


L rng buc column trng hoc khng trng.
V d mnh rng buc:
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 rng buc duy nht, cc gi tr ca column ch trong mnh UNIQUE trong cc row
ca table phi c gi tr khc bit. Gi tr null l cho php nu UNIQUE da trn mt ct.
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 rng buc duy nht (ging UNIQUE), tuy nhin kho l dng kho UNIQUE cp cao
nht. Mt table ch c th c mt PRIMARY KEY. Cc gi tr trong PRIMARY KEY phi NOT
NULL.

Trang 59
Oracle c bn - SQL v PL/SQL

C php khi t CONSTRAINT mc TABLE


[CONSTRAINT constraint_name] PRIMARY KEY (column,
Column..)

C php khi t CONSTRAINT mc COLUMN


[CONSTRAINT constraint_name] PRIMARY KEY

7.4.4. FOREIGN KEY ( Referential )


Ch ra mi lin h rng buc tham chiu gia table ny vi table khc, hoc trong chnh 1 table. N ch ra
mi lin h cha-con v ch rng buc gia FOREIGN KEY bng ny vi PRIMARY KEY hoc UNIQUE
Key ca bng khc. V d quan h gia DEPT v EMP thng qua trng DEPTNO.
T kho ON DELETE CASCADE c h nh trong dng kho ny ch khi d liu cha b xo (trong
bng DEPT) th d liu con cng t ng b xo theo (trong bng EMP).

7.4.5. CHECK
Rng buc kim 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
CONSTRAINT UPPER_ENAME CHECK (ENAME =
UPPER(ENAME)),
JOB VARCHAR2(9),
MGR NUMBER CONSTRAINT FK_MGR REFERENCES
SCOTT.EMP(EMPNO),
HIREDATE DATE DEFAULT SYSDATE, 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.LNH DDL CAN THIP TI TABLE


7.5.1. Chnh sa cu trc table
Dng lnh ALTER TABLE chnh sa cu trc bng. C
php:
ALTER TABLE tablename [ADD/MODIFY/DROP options
([column [column constraint) [ENABLE clause]
[DISABLE clause]

Trong :
ADD Thm column hay constraint.
MODIFY Sa i kiu cc column
DROP B constraint.
ENABLE/DISABLE Che khut hoc a vo s dng cc CONSTRAINT m
khng xa hn
Ch :

Trang 60
Oracle c bn - SQL v PL/SQL

Kh dng mnh MODIFY khng th chuyn tnh cht ca COLUMN c ni dung l


NULL chuyn thnh NOT NULL;
Khng th a thm mt ct NOT NUL nu table c s liu. Phi thm ct NULL,
in y s liu, sau chuyn thnh NOT NULL.
Khng th chuyn i kiu khc nhau nu column cha s liu Khng th dng mnh
MODIFY nh ngha cc CONSTRAINT tr rng buc
NULL/NOT NULL. Mun sa CONSTRAINT cn xo chng sau ADD thm vo.

V d 1:
ALTER TABLE emp ADD (spouse_name CHAR(10);

V d 2:
ALTER TABLE emp MODIFY (ename CHAR(25);

V d 3:
ALTER TABLE emp DROP CONSTRAINT emp_mgr;
ALTER TABLE DROP PRIMARY KEY;

V d 4:
ALTER TABLE dept DISABLE CONSTRAINT dept_prim;

7.5.2. Cc lnh DDL khc


Xa table
Dng lnh DROP TABLE xo bng.
C php:
DROP TABLE table_name [CASCADE CONSTRAINTS]
Trong :
CASCADE CONSTRAINTS xa tt c cc rng buc ton vn lin quan
n table b xa.

V d:
DROP TALE emp

Khi drop table th:


Xa tt c d liu
View v synonymlin quan vn cn nhng khng c gi tr Cc
giao dch cha gii quyt xong s c commit Ch ngi to ra table
hay DBA mi c th xa table

7.5.3. Ch dn cho table


Dng lnh COMMENT ch thch.
V d:

Trang 61
Oracle c bn - SQL v PL/SQL

COMMENT ON TABLE EMP IS THONG TIN NHAN VIEN;


COMMENT ON COLUMN EMP.EMPNO IS MA SO NHAN VIEN;

7.5.4. Thay i tn object


Dng lnh RENAME thay i tn object.
C php:
RENAME old TO new
Trong :
old Tn c
new Tn mi

V d:
RENAME emp TO employee

7.5.5. Xa d liu ca table


Dng lnh TRUNCATE TABLE xa d liu ca table, xa tt c cc row trong table. C php:
TRUNCATE TABLE table_name [REUSE STORAGE]

Trong :
REUSE STORAGE gi li khung cha, ch xa d liu

7.6.THNG TIN V TABLE TRONG T IN D LIU


Trung tm ca c s d liu Oracle l data dictionary. Data dictionary t ng c to ra khi c s d liu
Oracle c to. Oracle cp nht ln data dictionary bng cc lnh DDL (Data Define Language). Cc table
ca t in d liu c to ra bng lnh CREATE DATABASE v ch c to t user SYS. Cc view trong
t in d liu chc cc thng tin di dng d nhn hn bng.
C cc dng view l:
USER_xxx: l nhng i tng thuc user. V d cc bng c to bi user
ALL_xxx: l tt c cc i tng m user c quyn truy nhp
DBA_xxx: tt c cc i tng trong database
V$: Cc thc thi ca Server.

Ngoi ra cn c cc view quan trng khc l:


DICTIONARY: Thng tin v ton b cc table, view, snapshot trong t in d liu
TABLE_PRIVILEGES: Thng tin v vic gn quyn trn cc i tng IND: ng ngha ca
USER_INDEX.

Mun hin th ton b thng tin v cc table, view, snapshot trong t in d liu dng lnh
SELECT * FROM DICTIONARY;

Trang 62
Oracle c bn - SQL v PL/SQL

Hin th cu ca USER_OBJECT
DESCRIBE USER_OBJECT;

Hin th tt c cc bng m user s hu:


SELECT OBJECT_NAME
FROM USER_OBJECT
WHERE OBJECT_TYPE = TABLE;

SELECT * FROM TAB;

SELECT TABLE_NAME FROM USER_TABLE;

Hin th tt c cc loi i tng trong t in d liu:


SELECT DISTINCT OBJECT_TYPE
FROM USER_OBJECTS;

7.7.BI TP
1. To bng PROJECT vi cc column c ch ra di y, PROJID l promary key, v
P_END_DATE > P_START_DATE.
Column name Data Type Size.

PROJID NUMBER 4
P_DESC VARCHAR2 20
P_START_DATE DATE
P_END_DATE DATE
BUDGET_AMOUNT NUMBER 7,2
MAX_NO_STAFF NUMBER 2

2. To bng ASSIGNMENTS vi cc column c ch ra di y, ng thi ct


PROJID l foreign key ti bng PROJECT, ct EMPNO l foreign key ti bng EMP.
Column name Data Type Size.

PROJID NUMBER 4 NOT NULL


EMPNO NUMBER 4 NOT NULL
A_START_DATE DATE
A_END_DATE DATE
BILL_AMOUNT NUMBER 4,2
ASSIGN_TYPE VARCHAR2 2

3. Thm column COMMENTS kiu LONG vo bng PROJECTS. Thm column HOURS kiu
NUMBER vo bng ASSIGNMENTS.

4. S dng view USER_OBJECTS hin th tt c cc i tng user s hu.

5. Thm rng buc duy nht (UNIQUE) cho 2 column PROJECT_ID v EMPNO ca bng
ASSIGNMENTS.

6. Xem cc thng tin v cc rng buc trong USER_CONSTRAINTS.

7. Xem trong USER hin ti c tt c bao nhiu bng.

Trang 63
Oracle c bn - SQL v PL/SQL

Chng 8. CC LNH THAO TC D LIU


8.1.THAO TC D LIU TRONG TABLE
8.1.1. Thm mi dng d liu
chn mt row vo table dng lnh INSERT. C
php:
INSERT INTO tablename ([column, column, ...])
VALUES (value, value ...);
V d:
INSERT INTO dept (depno, dname, loc)
VALUES (50, 'MARKETING', 'SAN JOSE')

Chp d liu t table khc


INSERT INTO table [(column, column...)]
SELECT select_list
FROM table(s)
V d:
INSERT INTO emp_tmp (ename, sal)
SELECT ename, sal FROM emp WHERE sal > 1000

Bt u t phin bn Oracle 9i, ta c th thm mi dng d liu v t gi tr mc nh thng qua t kho


DEFALT
V d:
INSERT INTO EMP (EMPNO, ENAME, DEPTNO)
VALUES (8000,MIKE,DEFAULT);

Oracle 9i cn cho php thc hin lnh INSERT trn ng thi nhiu table khc nhau, ch s dng mt cu
lnh DML.
V d:
Lnh INSERT khng iu kin (UNCONDITIONAL)
INSERT ALL
INTO T1 (C1, C2, ...) VALUES (C1, C2, ...)
INTO T2 (C1, C2, ...) VALUES (C1, C2, ...)

SELECT C1, C2, ... FROM T9;

Lnh INSERT khng iu kin (CONDITIONAL)


INSERT [ALL|FIRST]
WHEN c1 = 1 THEN INTO T1 (C1, C2, ...) VALUES (C1, C2, ...)
WHEN c1 = 2 THEN INTO T2 (C1, C2, ...) VALUES (C1, C2, ...)
WHEN c2 = 3 THEN INTO T3 (C1, C2, ...) VALUES (C1, C2, ...)

SELECT C1, C2, ... FROM T9;

Trang 64
Oracle c bn - SQL v PL/SQL

FIRST: insert cho cu lnh u tin c gi tr iu kin ng


ALL: insert cho mi cu lnh c gi tr iu kin l ng

8.1.2. Cp nht dng d liu


chnh sa d liu dng lnh UPDATE.
C php:
UPDATE table [alias]
SET column [,column...] = [expr, subquery]
[WHERE condition]
V d 1:
UPDATE emp
SET job = 'SALEMAN', hiredate = sysdate, sal = sal * 1.1
WHERE ename = 'SCOTT';
V d 2:
UPDATE emp
SET comm = (SELECT comm FROM commission C
WHERE C.empno = emp.empno)
WHERE empno IN (SELECT empno FROM commission);
V d 3:
UPDATE emp a
SET deptno =
(SELECT deptno FROM dept
WHERE loc = 'BOSTON'),
(sal, comm) = (SELECT
1.1*AVG(sal),1.5*AVG(comm)
FROM emp b
WHERE a.deptno = b.deptno)
WHERE deptno IN
(SELECT deptno FROM dept
WHERE loc = 'DALLAS' OR loc = 'DETROIT');

Ta cng c th s dng mnh DEFAULT trong cu lnh cp nht d liu V d:


UPDATE EMP SET COMM = DEFAULT;

Ch thch:
- Cp nht cc nhn vin Dallas hoc Detroit
- Thay DEPTNO ca cc nhn vin ny bng DEPTNO ca Boston - Thay lng
mi nhn vin bng lng trung bnh ca b phn * 1.1 - Thay commission ca
mi nhn vin bng commission trung bnh ca b
phn * 1.5

8.1.3. Lnh Merge


Lnh MERGE l mt c im rt hay ca Oracle 9i. N cn c gi l lnh UPSERT, tc l c kh nng
va thc hin vic Update, va thc hin lnh Insert tu vo bn ghi ch c tn ti hay khng.
C php:
MERGE INTO T1

Trang 65
Oracle c bn - SQL v PL/SQL

USING T2 ON (T1.C9=T2.C9)
WHEN MATCHED THEN UPDATE SET T1.C1=T2.C2, T1.C2=T2.C2 ...
WHEN NOT MATCHED THEN INSERT (C1,C2, ...) VALUES (C1,C2,
...);

8.1.4. Xa dng d liu


xa dng dng lnh DELETE.
C php:
DELETE FROM table [WHERE condition]
V d:
DELETE FROM emp
WHERE deptno = 10;

8.1.5. Li rng buc d liu


Thng thng khi thc hin cc lnh thao tc d liu hay gp phi cc li rng buc ton vn d liu. Cc
li ny xut hin khi c cc rng buc trc m d liu nhp vo, chnh sa hay khi xo i khng m
bo cc iu kin ton vn. M li: ORA_02292: INTEGRITY CONSTRAINT. Sau bo tn ca
Constraint b li.

8.2.LNH IU KHIN GIAO DCH


Mt cu lnh SQL c th gm
Lnh DML thao tc d liu
Lnh DDL nh ngha d liu
Lnh DCL iu khin truy nhp d liu

Mt giao dch bt u khi mt lnh SQL c thc hin Mt giao


dch kt thc mt trong cc trng hp sau:
COMMIT hoc ROLLBACK
Cc lnh DDL v DCL thc hin (t ng commit) Li,
thot khi SQL*Plus, h thng b down.

C php:
Kt thc giao dch hin ti, thc hin cc chuyn i d liu
COMMIT

Xc nh im savepoint ca giao dch


SAVEPOINT name

Quay li d liu im SAVEPOINT hoc ton b giao dch.


ROLLBACK [TO SAVEPOINT name]

Trang 66
Oracle c bn - SQL v PL/SQL

T ng COMMIT khi thc hin cc lnh Insert, update, delete.


SET AUTO[COMMIT] ON/OFF

V d:
INSERT INTO DEPT
VALUES (50,TESTING,LAS VEGAS);

SAVEPOINT INSERT_DONE;

UPDATE DEPT
SET DNAME = MARKETING;

ROLLBACK TO INSERT_DONE ;

UPDATE DEPT SET DNAME = MARKETING


WHERE DNAME =SALES;

COMMIT;

8.3.BI TP
1. Thm d liu vo bng PROJECTS.
PROJID 1 2
P_DESC WRITE C030 COURSE PROOF READ NOTES
P_START_DATE 02-JAN-88 01-JAN-89
P_END_DATE 07-JAN-88 10-JAN-89
BUDGET_AMOUNT 500 600
MAX_NO_STAFF 1 1

2. Thm d liu vo bng ASSIGNMENTS.


PROJID 1 1 2
EMPNO 7369 7902 7844
A_START_DATE 01-JAN-88 04-JAN-88 01-JAN-89
A_END_DATE 03-JAN-88 07-JAN-88 10-JAN-89
BILL_RATE 50.00 55.00 45.50
ASSIGN_TYPE WR WR PF
HOURS 15 20 30

3. Cp nht trng ASIGNMENT_TYPE t WT thnh WR.

4. Nhp thm s liu vo bng ASSIGNMENTS.

Trang 67
Oracle c bn - SQL v PL/SQL

Chng 9. SEQUENCE V INDEX


9.1.SEQUENCE
9.1.1. To Sequence
Sequence l danh sch tun t ca con s, v c to bi Oracle sever. Sequence dng to kha chnh
mt cch t ng cho d lu.
Sequence thng dng to kha chnh trong sinh m t ng. C th dng chung cho nhiu i tng.
Con s sequence ny c chiu di ti a l 38 s.
to sequence, dng lnh CREATE SEQUENCE
C php:
CREATE SEQUENCE sequence_name
INCREMENT BY integer
START WITH integer
[MAXVALUE integer]
[MINVALUE integer]
[CYCLE/NO CYCLE];

Vi:
INCREMENT BY Ch nh khong cch ca dy s tun t
START WITH Ch nh s u tin ca dy s tun t
MAXVALUE Gi tr ln nht ca dy tun t
MINVALUE Gi tr nh nht ca dy tun t
CYCLE/NO CYCLE Dy tun t c quay vng khi n im cui.
Mc nh l NO CYCLE

V d:
CREATE SEQUENCE sample_sequence
INCREMENT 1
STRAT WITH 2
MAXVALUE 100;

lm vic vi cc sequence, dng lnh SQL vi cc ct gi sau


CURRVAL Cho gi tri hin thi ca sequence
NEXTVAL Tng gi tri hin thi ca sequence v cho
gi tr sau khi tng phi xc nh tn
sequence trc currval v nextval

sequence.CURRVAL
sequence.NEXTVAL

truy cp cc sequence khng thuc schema hin thi, th phi ch ra tn schema


schema.sequence.CURRVAL
schema.sequence.NEXTVAL

truy cp cc sequence t xa, th cn phi ch ra datalink


schema.sequence.CURRVAL@dblink
schema.sequence.NEXTVAL@dblink

Trang 68
Oracle c bn - SQL v PL/SQL

S dng sequence
CURRVAL v NEXTVAL c th c s dng trong cc trng hp sau:
Trong danh sch la chn ca cu lnh SELECT
Trong mnh VALUES ca cu lnh INSERT
Trong mnh SET ca cu lnh UPDATE
Khng c s dng CURRVAL v NEXTVAL trong cc trng hp sau Trong
cu hi con
Trong cc view v snapshot
Trong cu lnh SELECT c tc t DISTINCT
Trong cu lnh SELECT c s dng GROUP BY hay ORDER BY
Trong cu lnh SELECT c s dng cc php ton tp hp nh UNION,
INTERSET, MINUS
Trong mnh WHERE ca cu lnh SELECT
Ga tr DEFAULT ca ct trong cu lnh CREATE TABLE hay ALTER TABLE
Trong iu kin ca rng buc CHECK

9.1.2. Thay i v hu sequence


Thay i sequence:
ALTER SEQUENCE sequence_name
INCREMENT BY integer
START WITH integer
[MAXVALUE integer]
[MINVALUE integer]
[CYCLE/NO CYCLE];

Hu sequence:
DROP SEQUENCE sequence_name ;

9.2.INDEX
9.2.1. To index
Index l mt cu trc c s d liu, c sever s dng tm mt row trong bng mt
cch nhanh chng. Index bao gm mt key value (mt ct (column) trong hng (row)) v
ROWID.
C php:
CREATE [UNIQUE]] INDEX index_name
ON TABLE ( column [,column...]);

9.2.2. S dng index


Ta s dng index trong mt s trng hp sau:
Dng index query cho nhanh.
Dng Index khi m vic ly d liu <15% s row trong bng. Index
nhng column no dng ni gia cc bng ln nhau. Khng nn dng
Index cho cc bng no ch c vi row.
Primaryv unique key ( kha chnh v kha duy nht) t ng c index, nhng nn
c index cho foreign key( kha ngoi).

Trang 69
Oracle c bn - SQL v PL/SQL

S lng index cho mt table l khng gii hn. Tuy nhin nu c qu nhiu index s gy nh hng n s
liu khi m d liu trong table b thay i th t theo index. V d: Thm mt row vo bng tt c cc Index
s c update. Nn chn la gia yu cu query, v insert, update c mt index hp l. i vi cc kho
PRIMARY KEY v UNIQUE KEY t kho UNIQUE c t ng thm khi to INDEX.
V d:
CREATE INDEX i-ENAME ON EMP (ENAME);

Xo INDEX bng lnh:


DROP INDEX index_name ;

9.3.BI TP
1. To Index trn ct PROJID cho bng ASSIGNMENT.

2. Hin th danh sch ca nhn vin thuc s qun l ca ngi c tn l 1 bin c


nhp t bn phm
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

7698 BLAKE MANAGER 7839 01-05-1981 2850 30


7654 MARTIN SALESMAN 7698 28-09-1981 1250 1400 30
7499 ALLEN SALESMAN 7698 20-02-1981 1600 300 30
7844 TURNER SALESMAN 7698 08-09-1981 1500 0 30
7900 JAMES CLERK 7698 03-12-1981 950 30
7521 WARD SALESMAN 7698 22-02-1981 1250 500 30

Trang 70
Oracle c bn - SQL v PL/SQL

Chng 10. VIEWS


10.1.VIEWS
10.1.1. To view
View l mt table logic, view khng phi l ni lu tr d liu mc vt l. Cc thnh phn ca view da
trn table hoc l trn view khc. Mi tc ng ln view u gy nh hng ti table ca view , v ngc
li. nh ngha mt view dng query trn mt bng hay mt view no .
C php:
CREATE [OR REPLACE] [FORCE] VIEW view_name [(column, column,...)]
AS
SELECT statement
[WITH CHECK OPTION [CONSTRAINT constraint_name]];

Trong :
OR REPLACE to view chn ln view cng tn
FORCE to view c khi table hay view no
khng tn ti trong cu lnh SELECT.
column, column Tn cc column ca view
WITH CHECK OPTION Nu c lnh insert hoc update ln vie, ql
s kim tra iu kin ph hp trong mnh where
ca view. Nu khng d liu s ch kim tra cc
rng buc ton vn ca bng.
CONSTRAINT Ch ra tn ca iu kin kim tra.

V d 1:
CREATE VIEW emp_view
AS
SELECT empno, ename, sal FROM emp WHERE deptno = 10;

V d 2:
CREATE VIEW dept_summary
(name, minsal, maxsal, avsal)
AS
SELECT dname, min(sal), max(sal), avg(sal) FROM emp, dept
FROM emp, dept
WHERE emp.deptno = dept.deptno
GROUP BY dname;

V d 3:
CREATE VIEW dept_view
AS
SELECT eame, sal*12 Annsal
FROM emp
WHERE deptno = 20
WITH CHECK OPTIION CONSTRAINT dept_check;

10.1.2. Xa cc view
Ch nhng ngi to view mi c quyn DROP

Trang 71
Oracle c bn - SQL v PL/SQL

DROP VIEW dept_view;

View c th thc hin cc lnh SQL sau:


SELECT
INSERT (insert trn view cng nh hng ln table)
Update (nh hng ln table)
Comment

Tuy nhin c nhng rng buc sau:


Khng th insert, update trn view, khi query ca view cha cc ton t join, set,
distinct, group by, group.
Khng th no insert, update trn view, nu nh trong view c dng with check
option.
Khng th no insert trn view, trn table c nhng ct not Null m khng dng
default value ( bi v trong trng hp ny view s c t colunm hn table table.
Nn insert 1 row vo view, thc cht l insert row vo table s khng hp l).
Khng th no insert trn view, nu view ny c dng biu thc decode.
Nhng query ca view khng th no tham kho vo 2 column gi nextval, currval
(nextval, currval dng cho sequence).

10.2.BI TP
1. To view c hin th nh sau:
select * from aggredates;

DEPTNO AVERAGE MAXIMUN MINIMUN SUM NO_SALS NO_COMMS

10 2916.66667 5000 1300 8750 3 0


20 2235 3300 800 11175 5 0
30 1566.66667 2850 950 9400 6 4

2. To view nhp s liu vo bng ASIGNMENT vi cc iu kin sau:


PROJID <2000, P_START_DATE<P_END_DATE
Cc gi tr c th chp nhn ca assign_type l PS, WT hoc ED
EMPNO c gi tr NOT NULL
BILL_RATE < 50 Vi ASSIGN_TYPE L PS
BILL_RATE < 60 Vi ASSIGN_TYPE L WT
BILL_RATE < 70 Vi ASSIGN_TYPE L ED

3. nh ngha bng MESSAGES c cu trc


Column name Data Type

NUMCOL1 NUMBER(9,2)
NUMCOL2 NUMBER(9,2)
CHARCOL1 VARCHAR2(60)
CHARCOL2 VARCHAR2(60)
DATECOL1 DATE
DATECOL2 DATE

Trang 72
Oracle c bn - SQL v PL/SQL

Chng 11. QUYN V BO MT


11.1.QUYN - PRIVILEGE
Privileges l cc quyn hn c thc hin cc thao tc hoc thc hin vic truy nhp n cc i tng d
liu. Trong Oracle bn s khng th thc hin c cc thao tc m khng c cc quyn tng ng. Cc
quyn hn ny c gn cho User c th thc hin cc thao tc trn cc i tng ch nh. Vic gn
quyn c thc hin bi ngi qun tr c s d liu.
Gn quyn hoc loi b: thc hin gn quyn cho mt i tng dng lnh Grant loi b quyn hn dng
Revoke (hoc bng cc cng c h tr khc nh Oracle Enterprise manager)
Cc quyn bao gm:
Bo mt CSDL
Bo mt h thng
Bo mt d liu
Quyn h thng: Quyn truy nhp v CSDL
Quyn trn i tng: Thao tc ni dung ca cc i tng CSDL Schema
l tp howpjc c i tng nh tables, view...

CSDL: Khi ci t xong h qun tr CSDL Oracle mc nh c 2 user.


SYS: C quyn cao nht. Mt khu l change_on_install
SYSTEM: C quyn thp hn SYS. Mt khu l MANAGER

Quyn h thng
Trong cc quyn h thng quyn DBA l ln nht. DBA c quyn
CREATE USER : To user mi
DROP USER :Xo user
DROP ANY TABLE :Xo table
BACKUP ANY TABLE :To cc backup table.

Lnh to user ca ngi c quyn DBA nh sau:


CREATE USER user_name
IDENTIFY BY password;

Quyn trn i tng:


CREATE SESION: Truy nhp vo CSDL
CREATE TABLE: to bng trong user
CREATE SEQUENCE: To sequence CREATE
VIEW: To view
CREATE PROCEDURE: To procedure

Gn quyn

Trang 73
Oracle c bn - SQL v PL/SQL

GRANT privilege[,privilege...] TO user [,user...]

Xo quyn
REVOKE privilege[,privilege...] FROM user [,user...]

11.2.ROLE
Role l tn ca mt nhm cc quyn hn. N c to qun l quyn hn cho cc ng dng hoc nhm
cc User. Vic dng role cho php qun l thng nht trn cc i tng, tng tnh mm do trong qun tr,
d dng thay i. V d hai i tng X, Y c quyn trn role A tc l role A c quyn g th X, Y c quyn
tng ng khi role A b thay i quyn hn th X, Y cng b thay i quyn hn theo.

Lnh to Role
C php:
CREATE ROLE role [IDENTIFY BY password];

Gn privilege cho Role


Gn Role c cc i tng
Mt s Role hay dng:
CONNECT
RESOURCE

Lnh gn v xo Role ging nh lnh gn v xo Privilege. Chi tit xem trong phn qun tr Oracle.

11.3.SYNONYM
Synonyms l b danh cho mi i tng ca Oracle. Cc i tng ca Oracle l table, view, snapshot,
sequence, procedure, function, package v cc synonym khc. C php
CREATE PUBLIC SYNONYM synonym_name
FROM [OWNER.]object_name;

Dng Synonyms c nhng li im sau:


Khng tn thm ni lu tr khc bi v n c ct trn t in d liu. Lm n
gin on chng trnh SQL.
Tng tnh bo mt cho database.
C th cho php mi ngi (public) truy xut cc i tng ca Oracle.

V d: Chng ta c mt table EMPLY trong schema emp_01


Khi lp trnh th phi truy xut theo emp_01. EMPLY, tn di nh vy th on chng trnh s di s d lm
ln. Nn chng ta phi dng synonym
CREATE SYNONYM EMP FOR EMP_01.EMPLY;

Trang 74
Oracle c bn - SQL v PL/SQL

C th to mt synonym cho php mi ngi c th tham kho ti


CREATE PUBLIC EMP FOR EMP_01.EMPLY;

Tnh bo mt l v synonym l b danh, nn ngi s dng dng b danh ny s khng on c thm thng
tin g.

Trang 75
Oracle c bn - SQL v PL/SQL

Chng 12. GII THIU NGN NG PL/SQL


12.1.TNG QUAN V PL/SQL
12.1.1. C php lnh PL/SQL
Mi lnh SQL kt thc bng du (;)
Lnh nh ngha CSDL (DDL) khng c s dng trong PL/SQL
Lnh SELECT tr v nhiu dng c th gy exception
Lnh DML c th tc ng trn nhiu dng
V d:
x := 1;
INSERT INTO emp (id, name)
VALUES (50, GARNOR);
BEGIN
SELECT name FROM dept INTO :DEPT.NAME;
EXCEPTION
WHEN others THEN
Message(SQLERRM);
END;

UPDATE emp
SET sal := sal*1.2
WHERE dept_id = 10;

12.1.2. Khi lnh PL/SQL


Ngn ng PL/SQL t chc cc lnh theo tng khi lnh. Mt khi lnh PL/SQL cng c th c cc khi lnh
con khc trong n.
Cu trc y ca mt khi lnh PL/SQL bao gm:
DECLARE /* Phn khai bo - Khng bt buc */
Khai bo cc bin s dng trong phn thn
BEGIN /* Phn thn */
on lnh thc hin;
EXCEPTION /* Phn x l li - Khng bt buc */
X l li xy ra;
END;

V d1:
DECLARE
empno NUMBER(4):=7788;
BEGIN
UPDATE emp
SET sal = 9000
WHERE empno = 0001;
END;

V d 2:
DECLARE
v_deptno NUMBER(2);
v_loc VARCHAR2(15);
BEGIN

Trang 76
Oracle c bn - SQL v PL/SQL

SELECT deptno, loc INTO v_deptno, v_loc


FROM dept
WHERE dname = 'SALES';
EXCEPTION
WHEN others THEN
Message(SQLERRM);
END;

12.2.LNH LP TRNH PL/SQL N GIN


12.2.1. Lnh IF
Thc hin cu lnh theo iu kin.
C php:
IF <iu kin 1> THEN
Cng vic 1;
[ELSIF <iu kin 2> THEN
Cng vic 2;
]

[ELSE
Cng vic n + 1;
]
END IF;
V d 1:
IF ename = 'SCOTT' THEN
beam_me_up := 'YES';
COMMIT;
ELSE
beam_me_up := 'NO';
ROLLBACK;
END IF;

V d 2:
IF choice= 1 THEN
action := 'Run payroll';
ELSIF choice=2 THEN
action:='Run';
ELSIF choice=3 THEN
action:='Backup';
ELSE
action:='Invalid';
END IF;

Trang 77
Oracle c bn - SQL v PL/SQL

12.2.2. Lnh lp LOOP khng nh trc


Trong lnh lp ny, s ln lp tu thuc vo iu kin kt thc vng lp v khng xc nh c ngay ti
thi im bt u vng lp.
C php:
LOOP
Cng vic;
EXIT WHEN iu kin;
END LOOP;

V d:
x := 0;
y := 1000;
LOOP
x := x + 1;
y := y - x;
EXIT x > y;
END LOOP;

12.2.3. Lnh lp LOOP c nh trc


Ngay khi bt u vng lp, ta xc nh c s ln lp. C php:
LOOP Index IN Cn di .. Cn trn
Cng vic;
END LOOP;

V d:
x := 0;
LOOP Index IN 1 .. 100
x := x + 1;
END LOOP;

12.2.4. Lnh lp WHILE


C php:
WHILE iu kin LOOP
Cng vic;
END LOOP;
V d:
WHILE length(:Address) < 50 LOOP
:Address := :Address || ;
END LOOP;

12.2.5. Lnh GOTO, nhy v iu kin


C php:
GOTO Nhn;

Trang 78
Oracle c bn - SQL v PL/SQL

V d:
BEGIN
<<Nhn>>
cng vic;

GOTO Nhn;

END;

12.3.GII THIU CURSOR


Cursor l kiu bin c cu trc, cho php ta x l d liu gm nhiu dng. S dng ph thuc vo cu lnh
truy vn d liu sau n. Trong qu trnh x l, ta thao tc vi cursor thng qua tng dng d liu. Dng d
liu ny c nh v bi mt con tr. Vi vic dch chuyn con tr, ta c th ly c ton b d liu tr v.
Cc bc s dng bin cursor:
Khai bo --> m cursor --> ly d liu x l --> ng cursor
Khai bo:
CURSOR Tn cursor( danh sch bin) IS Cu
lnh truy vn;
V d1:
CURSOR c_Dept IS
SELECT deptno, dname
FROM dept
WHERE deptno>10;
V d2:
CURSOR c_Dept(p_Deptno NUMBER) IS
SELECT deptno, dname
FROM dept
WHERE deptno>10;
M cursor:
OPEN Tn cursor | Tn cursor( danh sch bin);
V d1:
OPEN c_Dept;
V d2:
OPEN c_Dept(10);
Ly d liu:
FETCH Tn cursor INTO Tn bin;
V d:
FETCH c_Dept INTO v_Dept;
ng cursor:
CLOSE Tn cursor;
V d:
CLOSE c_Dept;
Cc thuc tnh:
%isopen tr li gi tr True nu cursor ang m

Trang 79
Oracle c bn - SQL v PL/SQL

%notfound tr li gi tr True nu lnh fetch hin thi tr


li khng c row
%found tr li gi tri true cho n khi fetch khng cn
row no
%rowcount tr li s row c thc hin bng lnh fetch

V d1:
DECLARE
-- Khai bo cursor truy vn d liu
CURSOR c_Emp IS
SELECT *
FROM emp
WHERE dept_id = 10;

-- Khai bo bin cursor tng ng cha dng d liu


v_Emp c_EMP%rowtype;

BEGIN
-- M cursor
OPEN c_Emp;
LOOP
-- Ly dng d liu t cursor
FETCH c_Emp INTO v_Emp;

-- Thot khi vng lp nu ly ht d liu trong cursor


EXIT WHEN c_Emp%notfound;

-- B sung d liu vo Emp_ext theo d liu ly c t


cursor
INSERT INTO Emp_ext (empno, ename, job)
VALUES (v_Emp.empno, v_Emp.ename, v_Emp.job); END
LOOP;
-- ng cursor
CLOSE c_Emp;
END;

V d 2:
DECLARE
-- Khai bo cursor, c cho php cp nht d liu
CURSOR c_Dept IS
SELECT dname, loc
FROM dept FOR UPDATE OF loc;

-- Khai bo bin lu tr d liu


v_Dept c_Dept%ROWTYPE;
v_sales_count NUMBER:=0;
v_non_sales NUMBER:=0;

BEGIN
-- M cursor
OPEN c_Dept;
LOOP
-- Ly tng dng d liu ca cursor x l
FETCH c_Dept INTO v_Dept;

-- Thot khi lnh lp nu duyt ht tt c d liu


EXIT WHEN c_Dept %notfound;

IF (v_Dept.dname = 'SALES')AND(v_Dept.loc!='DALLAS') THEN


-- Cp nht d liu trn cursor

Trang 80
Oracle c bn - SQL v PL/SQL

UPDATE Dept
SET loc='DALLAS'
WHERE CURRENT OF c_Dept;

-- m s lng bn ghi c cp nht


v_sales_count := sales_count + 1;
ELSIF (v_dept.dname != 'SALES')AND(v_Dept.loc!='NEWYORK')
THEN
-- Cp nht d liu trn cursor
UPDATE Dept
SET loc = 'NEWYORK'
WHERE CURRENT OF c_Dept;

-- m s lng bn ghi c cp nht


v_non_sales := v_non_sales + 1;
END IF;
END LOOP;
-- ng cursor
CLOSE c_Dept;

-- Lu gi cc thng s va xc nh vo bng
INSERT INTO counts (sales_set, non_sales_set)
VALUES (v_sales_count, v_non_sales);

-- Ghi nhn cc thay i d liu trn


COMMIT;
END;

12.4.CC KIU D LIU THNG DNG


12.4.1. Kiu d liu Table
C php:
TYPE Tn_kiu_Table IS
TABLE OF Tn kiu d liu [NOT NULL] INDEX BY BINARY_INTEGER;

Tn bin Tn_kiu_Table;
V d:
TYPE t_Name IS
TABLE OF Emp.Ename%TYPE INDEX BY BINARY_INTEGER;

v_First_name t_Name;
v_Last_name t_Name;

12.4.2. Kiu d liu Record


C php:
TYPE Tn_kiu_Record IS
RECORD OF (
Col1 Tn kiu [NOT NULL{:=|DEFAULT} biu thc],
Col2 Tn kiu [NOT NULL{:=|DEFAULT} biu
thc]...);

Tn bin Tn_kiu_Record;
V d:
TYPE t_Emp IS
RECORD OF (
empno number(4) not null,

Trang 81
Oracle c bn - SQL v PL/SQL

ename char(10),
job char(9),
mgr number(4),
hiredate date default sysdate,
sal number(7,2),
comm number(7,2),
deptno number(2) not null);

v_Emp_record t_Emp;

12.4.3. Sao kiu d liu mt dng


Bn ghi trong PL/SQL. l mt bin c th gi nhiu gi tr v l mt tp hp cc bin tng ng vi cc
trng trong table.
Khai bo kiu d liu bn ghi.
Tn bin Tn bng%ROWTYPE;
V d:
v_Emp emp%ROWTYPE;

Truy nhp n cc trng trong d liu bn ghi dng ging nh trong 1 dng d liu tr v. V d:
v_Emp.empno, v_Emp.sal, ...

12.4.4. Sao kiu d liu ca mt ct


C php:
Tn bin Tn ct d liu%TYPE;
V d:
v_Sal Emp.sal%TYPE;

12.4.5. Lnh SELECT... INTO


C php:
SELECT col1, col2...
INTO var1, var2... [cursor_var]
FROM table1, table2...
[WHERE condition1, condition2... ]
[GROUP BY col1, col2 ...]
[HAVING condition1, condition2...]
[FOR UPDATE];

Vi:
INTO var1, var2... [cursor_var] Bin lu gi cc gi tr trong
table ly t lnh select.
V d:
SELECT deptno, loc INTO v_deptno, v_loc
FROM dept
WHERE dname = SALES;

Trang 82
Oracle c bn - SQL v PL/SQL

12.5.BI TP
1. Vit on chng trnh tm kim cc hng trong bng EMP vi bin c a t
ngoi vo l &1 dng JOb_type(emp.job%type) v a ra thng bo thch hp
vo bng MESSAGES.

2. Vit on chng trnh ghi d liu vo bng MESSAGES vi ct NUMCOL1 mang gi tr


l 1 nu l row 1 c Insert, 2 nu row 2 c Insert... . Khng c Insert nhng
row c gi tr l 6 hoc 8, thot khi vng lp insert sau gi tr 10. Commit sau vng
lp.

3. Lit k cc ct ENAME, HIREDATE, SAL Vi iu kin EMPNO bng gi tr bin


&EMPLOYEE_NO c a vo, sau kim tra:
1.1 C phi mc lng ln hn 1200
1.2 Tn nhn vin c phi c cha ch T
1.3 ngy gia nhp c quan c phi l thng 10 (DEC)
v a gi tr kim tra ny vo bng message ct charcol1 (th vi cc gi tr 7654, 7369,
7900, 7876)

4. a vo vng lp v t 1 n 10 lnh:
UPDATE messages
SET numcol2=100
WHERE numcol1 = v;
nu bt k mt ln update no c s lng row >1 th exit khi vng lp.

Trang 83
Oracle c bn - SQL v PL/SQL

Chng 13. GII THIU PROCEDURE BUILDER


Procedure builder l mt thnh phn c tch hp vo mi trng pht trin ng dng ca Oracle. N cho
php ngi s dng c th son tho, bin dch, kim tra v d li i vi cc hm, th tc hay package vit
bi ngn ng PL/SQL c Client v Server.

13.1.CC THNH PHN TRONG PROCEDURE BUILDER


Thnh phn Din gii
Object Navigator iu khin truy nhp cc hm, th tc PL/SQL. Thc hin
thao tc d li (debug) trn cc khi lnh SQL v PL/SQL.
PL/SQL Interpreter D li m ngun PL/SQL.
Program Unit Editor To v son tho cc m ngun khi lnh PL/SQL.
Store Program Unit Editor To v son tho cc m ngun khi lnh PL/SQL trong
cc Store Program thuc Server.
Database Trigger Edditor To v son tho cc m ngun khi lnh PL/SQL trong
cc Trigger thuc Server.

13.1.1. Object Navigator


Object Navigator cho php hin th cc i tng trong database.
Ta c th to, son tho cc th tc PL/SQL cng nh d li, np cc th vin thng qua Object Navigator.
Vi Object Navigator, ta cng c th thc hin sao chp cc th tc, hm thng qua cc thao tc n gin
nh copy v paste.

Hnh v 7. Cu trc ca Object Navigator


Cc thnh phn chnh ca Object Navigator bao gm:
Navigator drop down litst: Danh sch s xung hin th tn cc th tc Subject
indicator: nh v cc i tng cn son tho
Type icon: Biu tng cho cc loi

Trang 84
Oracle c bn - SQL v PL/SQL

Object name: Tn cc i tng


Find field: Tm kim cc i tng theo tn

13.1.2. Program Unit Editor


L mi trng to, son tho, bin dch v hin th li bin dch cc hm, th tc.

Hnh v 8. Son tho hm, th tc pha Client


Cc thnh phn chnh:
Cc nt bm thc hin cng vic: Compile, Apply, Revert, New, Delete, Close v
Help
Danh sch tn cc hm, th tc khc
Ni son tho hm, th tc

13.1.3. Store Program Unit Editor


Cng tng t nh Program Unit Editor, Store Program Unit Editor c s dng cho vic to, son tho
cc hm, th tc trn server.
Cc chc nng trong Store Program Unit Editor hon ton tng t nh trong Program Unit Editor.
Ta ch gi Store Program Unit Editor sau khi thc hin kt ni ti mt database c th no .

13.1.4. Database Trigger Edditor


L mi trng dng to v son tho cc trigger database trn server.

Trang 85
Oracle c bn - SQL v PL/SQL

Hnh v 9. Son tho hm, th tc, trigger pha Server


Trigger database c phn ra lm nhiu loi khc nhau v c thc hin trc hoc sau mi thao tc c
th trn tng bng d liu ca database.

13.2.CC HM, TH TC
13.2.1. To hm, th tc trn Client
i vi hm, th tc hay package trn client, ta c th to v bin dch ngay chng. Oracle Builder h tr
trnh thng dch cho php kim tra li ca on chng trnh va thc hin.

Hnh v 10. To hm, th tc ti Client


Vic to hm, th tc c thc hin theo ba bc:
Khai bo tn hm hay th tc
Son tho ni dung ca hm hay thu tc
Bin dich hm hay th tc va to v xc nh cc li nu c.

13.2.2. To hm, th tc trn Server


Procedure Builder ch cho php to mi, sa cha v lu li cc thay i i vi cc hm v th tc trn
Server, khng h tr vic bin dch v pht hin li.

Trang 86
Oracle c bn - SQL v PL/SQL

Hnh v 11. To hm, th tc ti Server


Ta thc hin vic to hm, th tc trn server theo hai bc:
To hm, th tc
Son tho v ghi li ni dung ca hm, th tc

13.2.3. D li i vi cc hm, th tc
Vi Procedure Builder, ta c th thc hin chy cc hm, th tc theo tng bc. Qua , ta c th pht hin
c cc li xy ra trong chng trnh, nu c. Mn hnh PL/SQL Interpreter cho php ta thc hin iu ny:

Hnh v 12. Mn hnh PL/SQL Interpreter


Cu trc ca mn hnh PL/SQL Interpreter c chia lm ba phn chnh:
Phn m ngun hm, th tc
Phn iu khin
Phn tng tc trc tip vi d liu

Trang 87
Oracle c bn - SQL v PL/SQL

Chng 14. GII THIU CC TH TC, HM V PACKAGE


14.1.TH TC
Mt nhm cc lnh thc hin chc nng no c th c gom li trong mt th tc (procedure) nhm lm
tng kh nng x l, kh nng s dng chung, tng tnh bo mt v an ton d liu, tin ch trong pht trin.
Th tc c th c lu gi ngay trong database nh mt i tng ca database, sn sng cho vic ti s
dng. Th tc lc ny c gi l Store procedure. Vi cc Store procedure, ngay khi lu gi Store
procedure, chng c bin dch thnh dng p-code v th c th nng cao kh nng thc hin.

14.1.1. To th tc
Ta c th to th tc trc tip bng dng lnh sau: C php:
CREATE [OR REPLACE] PROCEDURE procedure_name
[(argument1 [mode1] datatype1,
argument2 [mode2] datatype2,
...)]
IS | AS
BEGIN
PL/SQL Block;
END;
Vi:
procedure_name Tn th tc
argument Tn tham s
mode Loi tham s: IN hoc OUT hoc IN OUT,
mc nh l IN
datatype Kiu d liu ca tham s
PL/SQL Block Ni dung khi lnh SQL v PL/SQL trong
th tc
V d:
CREATE OR REPLACE PROCEDURE change_sal
(p_Percentage IN number,
p_Error OUT varchar2,
)
IS
v_User_exp Exception;
BEGIN
IF p_Percentage < 0 THEN
RAISE v_User_exp;
END IF;

UPDATE emp
SET sal = sal*p_Percentage/100;
EXCEPTION

Trang 88
Oracle c bn - SQL v PL/SQL

WHEN v_User_exp THEN


p_Error := Li: Phn trm nh hn 0;
RETURN;
WHEN others THEN
p_Error := Li: || SQLERRM;
END;

Vi vic to cc th tc thng qua cu lnh, ta c th d dng to cc script cha cc th tc cn thit khi to


mi mt database.
Mt cch khc, ta c th to mi hay sa i th tc thng qua cng c ca Oracle. Trong chng trc, ta
bit cch s dng Procedure Builder to mi th tc.

14.1.2. Hu b th tc
Tng t nh vic to th tc, ta c th hu b th tc thng qua cu lnh SQL. C php:
DROP PROCEDURE Tn th tc;
V d:
DROP PROCEDURE change_sal;

14.1.3. Cc bc lu gi mt th tc
Mt th tc trong Oracle c thc hin theo hai bc chnh sau:
1. Ni dung ca th tc c thit lp v lu gi trong database di dng vn bn
(text)
2. Ton b ni dung ca th tc c bin dch ra dng m p-code, tin cho vic thc
hin th tc .

Hnh v 13. Cc bc thc hin mt th tc

14.2.HM
Tng t nh th tc, hm (function) cng l nhm cc lnh PL/SQL thc hin chc nng no . Khc vi
th tc, cc hm s tr v mt gi tr ngay ti li gi ca n.

Trang 89
Oracle c bn - SQL v PL/SQL

Hm cng c th c lu gi ngay trn database di dng Store procedure.

14.2.1. To hm
Ta c th to hm trc tip bng dng lnh sau: C php:
CREATE [OR REPLACE] FUNCTION function_name
[(argument1 [mode1] datatype1,
argument2 [mode2] datatype2,
...)]
RETURN datatype
IS | AS
BEGIN
PL/SQL Block;
END;
Vi:
function_name Tn hm
argument Tn tham s
mode Loi tham s: IN hoc OUT hoc IN OUT,
mc nh l IN
datatype Kiu d liu ca tham s
PL/SQL Block Ni dung khi lnh SQL v PL/SQL trong
th tc
V d:
CREATE OR REPLACE FUNCTION get_sal
(p_Emp_id IN number)
RETURN varchar2
IS
BEGIN
SELECT sal
FROM emp
WHERE emp_id = p_Emp_id;

RETURN null;
EXCEPTION
WHEN others THEN
RETURN Li: || SQLERRM;
END;

14.2.2. Thc hin mt hm


Qu trnh lu gi v bin dch mt hm cng tng t nh i vi mt th tc. Qu trnh
gi v thc hin mt hm c din ra theo ba bc:
1. Vic gi hm c thc hin ngay khi tn hm trong biu thc c tham chiu ti
2. Mt bin host (host variable) c t ng to ra lu gi gi tr tr v ca hm
3. Thc hin ni dung trong phn thn hm, lu li gi tr

Trang 90
Oracle c bn - SQL v PL/SQL

V d:
SQL> VARIABLE v_Sal number;

SQL> EXECUTE :v_SAL := get_sal(7934);


PL/SQL procedure successfully completed.

SQL> PRINT v_Sal;


v_Sal

1300

14.2.3. Li ch ca vic s dng hm


Vi vic s dng hm, trong mt s trng hp ta c th thy c cc li im nh sau:
Cho php thc hin cc thao tc phc tp (cc php tm kim, so snh phc tp)
ngay trong mnh ca cu lnh SQL m nu khng s dng hm ta s khng th
no thc hin c
Tng tnh c lp ca d liu do vic phn tch v x l d liu c thc hin ngay
trn Server thay v tr v d liu trc tip cho ng dng di Client chng tip tc
x l.
Tng tnh hiu qu ca cu lnh truy vn bng vic gi cc hm ngay trong cu lnh
SQL
Ta c th s dng hm thao tc trn cc kiu d liu t to. Cho
php thc hin ng thi cc cu lnh truy vn

14.2.4. Mt s hn ch khi s dng hm trong cu lnh SQL


Ch cc hm do ngi dng nh ngha c lu trn database mi c th s dng
c cho cu lnh SQL.
Cc hm do ngi dng nh ngha ch c p dng cho iu kin thc hin trn
cc dng d liu (mnh WHERE), khng th p dng cho cc iu kin thc hin
trn nhm (mnh GROUP).
Tham s s dng trong hm ch c th l loi IN, khng chp nhn gi tr OUT hay
gi tr IN OUT.
Kiu d liu tr v ca cc hm phi l kiu d liu DATE, NUMBER, NUMBER.
Khng cho php hm tr v kiu d liu nh BOOLEAN, RECORD, TABLE. Kiu d
liu tr v ny phi tng thch vi cc kiu d liu bn trong Oracle Server.

14.2.5. Hu b hm
Tng t nh vic to hm, ta c th hu b hm thng qua cu lnh SQL. C php:
DROP FUNCTION Tn hm;
V d:
DROP FUNCTION get_sal;

Trang 91
Oracle c bn - SQL v PL/SQL

14.2.6. Hm v th tc
Ta to cc th tc lu gi mt lot cc cc cu lnh phc v cho nhiu ln gi khc nhau. Th tc c th
khng c, c mt hoc nhiu tham s. Tuy nhin th tc khng tr li bt k mt kt qu no.
Hm cng ging nh th tc, n cng bao gm mt lot cc cu lnh, c th khng c, c mt hoc nhiu
tham s. Tuy nhin khc vi th tc, hm bao gi cng tr v mt kt qu. V vy, ta s dng hm trong cc
php tnh ton, gn gi tr. Khi , cu lnh thc hin s d dng v sng sa hn.

So snh gia hm v th tc

Th tc Hm
Thc hin ging nh thc hin cc cu C th c gi ging nh mt phn ca
lnh PL/SQL biu thc
Khng c kiu gi tr tr v C cha gi tr tr v
C th tr v mt hoc nhiu gi tr Tr v mt gi tr
(thng qua tham s OUT)

Li ch ca vic s dng hm, th tc


Nng cao hiu sut: Trnh vic ti s dng cc cu lnh nhiu ln bi nhiu User
khc nhau. Gim thiu thi gian bin dch cu lnh PL/SQL trong pha phn tch cu
lnh. Gim thiu s ln gi lnh thc hin trn database, t , lm gim lu lng
truyn thng trn mng.
Nng cao kh nng bo tr: Ta c th d dng sa ni dung bn trong cc hm, th
tc m khng nh hng n vic giao tip ca chng (cc tham s v li gi vn y
nguyn). Thay i ni dung ca mt hm, hay th tc c th ng dng c ngay
cho nhiu user khc nhau.
Tng tnh bo mt v ton vn ca d liu: Vi vic iu khin truy nhp d liu dn
tip i vi cc i tng trong database s lm nng cao tnh bo mt ca d liu.
Quan h gia cc cu lnh trong hm, th tc lun c m bo.

14.3.PACKAGE
Package l mt tp hp cc kiu d liu, bin lu gi gi tr v cc th tc, hm c cng mt mi lin h vi
nhau, c gp chung li. c im ni bt nht ca package l khi mt phn t trong package c gi th
ton b ni dung ca package s c np vo trong h thng. Do , vic gi ti cc phn t khc trong
package sau ny s khng phi mt thi gian np vo h thng na. T , nng cao tc thc hin lnh
ca ton b hm, th tc c trong package.

14.3.1. Cu trc ca package


Mt package c cu trc lm hai phn. Phn m t (specification) nh ngha cc giao tip c th c ca
package vi bn ngoi. Phn thn (body) l cc ci t cho cc giao tip c trong phn m t trn.

Trang 92
Oracle c bn - SQL v PL/SQL

Hnh v 14. Cu trc package


Trong cu trc ca package bao gm 05 thnh phn:
1. Public variable (bin cng cng): l bin m cc ng dng bn ngoi c th tham
chiu ti c.
2. Public procedure (th tc cng cng): bao gm cc hm, th tc ca package c th
triu gi t cc ng dng bn ngoi.
3. Private procedure (th tc ring phn): l cc hm, th tc c trong package v ch
c th c triu gi bi cc hm hay th tc khc trong package m thi.
4. Global variable (bin tng th): l bin c khai bo dng trong ton b package,
ng dng bn ngoi tham chiu c ti bin ny.
5. Private variable (bin ring phn): l bin c khai bo trong mt hm, th tc thuc
package. N ch c th c tham chiu n trong bn thn hm hay th tc .

14.3.2. To package
Ta c th to package trc tip bng dng lnh sau: C php
khai bo phn m t package:
CREATE [OR REPLACE] PACKAGE package_name IS
| AS
public type and cc item declarations
subprogram specifications
END package_name;
Vi:
package_name Tn package
type and item declarations Phn khai bo cc bin,
hng, cursor, ngoi l v
kiu s dng trong ton b
package
subprogram specifications Khai bo cc hm, th tc
PL/SQL

C php khai bo phn thn package:


CREATE [OR REPLACE] PACKAGE BODY package_name

Trang 93
Oracle c bn - SQL v PL/SQL

IS | AS
private type and item declarations Khai bo cc kiu
ch s dng ring
trong package
subprogram bodies Ni dung ca
package
END package_name;
Vi:
package_name Tn package
Phn khai bo cc bin, hng,
type and item declarations
cursor, ngoi l v kiu
Khai bo cc hm, th tc
subprogram specifications
PL/SQL

V d:
-- Phn khai bo ca package
CREATE OR REPLACE PACKAGE comm_package
IS
v_comm number := 10; -- Khai bo bin c gi tr khi to

-- Khai bo th tc giao tip vi bn ngoi


PROCEDURE reset_comm (p_comm IN number);
END comm_package;

-- Phn thn ca package


CREATE OR REPLACE PACKAGE BODY comm_package
IS
-- Hm ring phn ch s dng trong package
FUNCTION validate_comm
(v_comm IN number)
RETURN BOOLEAN
IS
v_max_comm number;
BEGIN
SELECT max(comm) INTO v_max_comm
FROM emp;
IF v_comm > v_max_comm THEN
RETURN FALSE;
ELSE
RETURN TRUE;
END IF;
END validate_comm;

-- Th tc giao tip vi bn ngoi


PROCEDURE reset_comm
(p_comm IN number)
IS

Trang 94
Oracle c bn - SQL v PL/SQL

v_valid BOOLEAN;
BEGIN
v_valid := validate_comm(p_comm);
IF v_valid = TRUE THEN
v_comm := p_comm;
ELSE
RAISE_APPLICATION_ERROR(-20210,Invalid comm);
END IF:
END reset_comm;
END comm_package;

14.3.3. Hu package
Tng t nh vic to package, ta c th hu b hm thng qua cu lnh SQL. C php:
-- Hu phn package specification
DROP PACKAGE Tn package;
-- Hu phn package body
DROP PACKAGE BODY Tn package;
V d:
DROP PACKAGE comm_package;
DROP PACKAGE BODY comm_package;

14.3.4. Li ch ca vic s dng package Tng tnh phn


nh cc thnh phn (Modularity)
Ta c th ng gi cc thnh phn, cu trc c quan h logic vi nhau trong cng mt module ng vi mt
package. Vic k tha gia cc package rt n gin, v c thc hin mt cch trong sng.

n gin trong vic thit k ng dng


Tt c cc thng tin cn thit cho vic giao tip u c t trong phn c t ca package (package
specification). Ni dung phn ny c th c son tho v bin dch c lp vi phn thn ca package
(package body). Do , cc hm hay th tc c gi ti cc thnh phn ca package c th c bin dch tt.
Phn thn ca package c th c tip tc pht trin cho n khi hon thnh ng dng.

n du thng tin (hiding information)


Package cho php s dng cc thnh phn bn trong di dng public (cng cng) hay private (ring t).
Tu theo yu cu thit k, ta c th cho php truy nhp hay n du thng tin. T , c th bo v c tnh
ton vn d liu.

Nng cao hiu sut s dng


Ngay khi gi mt hm hay th tc bt k trong package ln u tin. Ton b ni dung ca package s c
np vo b nh. Do vy, cc hm v th tc con trong package gi n sau ny c th thc hin ngay m
khng cn phi np li vo b nh. Vic ny lm gim thiu thao tc truy xut vo ra (I/O access) nng cao
tc .

Trang 95
Oracle c bn - SQL v PL/SQL

Thc hin qu ti (overloading)


Package cho php thc hin qu ti i vi cc hm v th tc trong n. Theo , cc hm v th tc khc
nhau c th c php t trng tn. Vic ny s nng cao tnh mm do ca vic s dng hm, th tc trong
package.

14.3.5. Mt s package chun ca Oracle


Th tc Hm
DBMS_ALERT Cung cp cc s kin v cc thng ip ca database
DBMS_APPLICATION_INFO Thng tin v cc hot ng hin thi i vi database
DBMS_DDL Bin dch li cc hm, th tc va package. Phn tch cc
index, table, cluster,...
DBMS_DESCRIBE Tr v cc din gii cho cc tham s ca th tc, hm
DBMS_JOB Ln k hoch thc hin cc on m lnh PL/SQL
DBMS_LOCK Cung cp cc hm cho php yu cu, gii phng, iu
chnh cc trng thi kho (lock) i vi tng i tng
trn database.
DBMS_MAIL Gi cc message t Oracle Server ti Oracle*mail
DBMS_OUTPUT Kt xut cc gi tr tr v t cc hm, th tc, trigger,..
DBMS_PIPE Cho php x l gi ng thi cc thng ip
DBMS_SESSION Cung cp cc php truy nhp SQL thay v cc cu lnh
session
DBMS_SHARED_POOL Cho php lu gi cc i tng trong vng nh chia s.
DBMS_SQL Cho php s dng lnh SQL ng truy xut database
DBMS_TRANSACTION iu khin cc giao dch, ci thin v nng cao hiu qu
i vi cc giao dch nh v khng phn tn
DBMS_UTILITY Phn tch cc i tng trong tng schema.
UTL_FILE Cho php truy xut ti file ngay vi cu lnh PL/SQL

Trang 96
Oracle c bn - SQL v PL/SQL

Chng 15. DATABASE TRIGGER


Database trigger l nhng th tc c thc hin ngm nh ngay khi thc hin lnh SQL nh INSERT,
DELETE, UPDATE nhm m bo cc quy tc logic phc tp ca d liu. Thit k cc database trigger
tho mn cc yu cu sau:
S dng cc database trigger nhm m bo thc hin tt c cc thao tc c lin
quan ti lnh can thip d liu c thc hin.
Ch s dng database trigger i vi cc thao tc trng tm.
Khng s dng database trigger thc hin cc rng buc sn c trong database
Oracle. V d: dng database trigger thay th cho cc constrain.
S dng database trigger c th gy ri, kh khn cho vic bo tr v pht trin h
thng ln. V th, ta ch s dng database trigger khi tht cn thit.

15.1.TO TRIGGER
Khi to database trigger, ta cn lu ti mt s tiu ch nh:
Thi gian thc hin: BEFORE, AFTER
Hnh ng thc hin: INSERT, UPDATE, DELETE
i tng tc ng: bng d liu
Loi trigger thc hin: trn dng lnh hay trn cu lnh Mnh
iu kin thc hin
Ni dung ca trigger

15.1.1. Phn loi trigger


Ta c th phn loi trigger theo thi gian thc hin nh: BEFORE v AFTER.
BEFORE trigger: Trigger c kch hot trc khi thc hin cu lnh. Vic ny c
th cho php ta loi bt cc php x l khng cn thit, thm ch c th rollback d
liu trong trng hp c th gy ra cc ngoi l (exception). Trigger thuc loi ny
thng c s dng i vi cc thao tc INSERT hoc UPDATE.
AFTER trigger: Cu lnh c thc hin xong th trigger mi c kch hot.
Thc hin cc cng vic thng phi lm sau khi thc hin cu lnh.
INSTEAD OF trigger: Loi trigger ny cho php ngi s dng c th thay i
mt cch trong sut d liu ca mt s view m khng th thc hin thay i trc
tip c. Vi INSTEAD OF trigger, ta c th thc hin vi c ba thao tc: insert,
update, delete.

Ta cng c th phn loi trigger theo loi cu lnh kch hot nh: INSERT, UPDATE, DELETE. Trong
cc trigger thuc mt trong ba loi lnh: INSERT, UPDATE,DELETE. Trigger UPDATE cn phi ch
r thm tn ct d liu kch hot trigger mi khi gi tr d liu trong b thay i. Bn trong Trigger c th
c cha cc lnh thao tc d liu. Do , cn phi trnh trng hp lp li theo kiu quy.

Mt cch khc ta cng c th phn loi trigger theo s ln kch hot. theo s c 02 loi trigger:
Trigger mc lnh: Trigger c kch hot mi khi thc hin cu lnh.
Trigger mc dng lnh: Trigger c kch nhiu ln ng vi mi dng d liu chu
nh hng bi thao tc thc hin lnh.

Trang 97
Oracle c bn - SQL v PL/SQL

Hnh v 15. Th t thc hin trigger

15.1.2. Lnh to trigger


Ta c th to trigger thng qua lnh script.
C php lnh to trigger mc cu lnh:
CREATE [OR REPLACE] TRIGGER trigger_name
timing event1 [OR event2 OR event3]
ON table_name
BEGIN
PL/SQL Block;
END;

C php lnh to trigger mc dng d liu:


CREATE [OR REPLACE] TRIGGER trigger_name
timing event1 [OR event2 OR event3]
ON table_name
[REFERENCING OLD AS old | NEW AS new]
FOR EACH ROW
[WHEN condition]
BEGIN
PL/SQL Block;
END;
Vi:
trigger _name Tn trigger
timing Thi gian kch hot trigger
event Loi cu lnh kch hot trigger
referencing Tn bin thay th cho gi tr trc v
sau thay i ca dng d liu ang x l
FOR EACH ROW Trigger thuc loi tc ng trn dng d
liu
WHEN Ch ra mt s iu kin rng buc thc
hin trigger
table_name Tn bng d liu c gn trigger trn
PL/SQL Block Ni dung khi lnh SQL v PL/SQL trong
trigger

Trang 98
Oracle c bn - SQL v PL/SQL

V d:
CREATE OR REPLACE TRIGER secure_emp
BEFORE INSERT ON emp
BEGIN
IF TO_CHAR(sysdate,DY) IN (SAT,SUN)
OR TO_CHAR(sysdate,HH24) NOT BETWEEN 08 AND 18
THEN
RAISE_APPLICATION_ERROR (-20500,
Thi gian lm vic khng ph hp);
END IF;
END;

CREATE OR REPLACE TRIGER audit_emp_values


AFTER DELETE OR INSERT OR DELETE ON emp FOR
EACH ROW
BEGIN
INSERT INTO audit_emp_values (user_name, timestamp, id,
old_last_name, new_last_name, old_title,
new_tile, old_salary, new_salary)
VALUES (USER, SYSDATE, :old.empno, :old.ename,
:new.ename, :old.job, :new.job, :old.sal,
:new.sal);
END;

15.1.3. S dng Procedure builder to trigger


Ta cng c th to database trigger thng qua cng c Procedure builder ca Oracle. Ta ln lt
thc hin theo cc bc sau:
1. Kt ni ti database
2. Dch chuyn ti i tng t trigger trong phn Object Navigator
3. Chuyn ti phn trigger ri bm nt New to mi trigger.
4. t cc tu chn v thi gian, kiu,.. cho trigger
5. Son tho ni dung ca trigger
6. Lu gi trigger

Trang 99
Oracle c bn - SQL v PL/SQL

Hnh v 16. To trigger bng cng c Procedure Builder

Hnh v 17. Trigger tc ng trn dng d liu

15.2.QUN L TRIGGER
15.2.1. Phn bit database trigger
Trigger v th tc

Trigger Th tc
Lnh to CREATE TRIGGER Lnh to CREATE PROCEDURE
Lu gi trong T in d liu di dng Lu gi trong T in d liu di dng
m ngun v dng p-code m ngun v dng p-code
c gi ngm nh Thc hin theo li gi tng minh
Khng cho php dng: COMMIT, Cho php dng: COMMIT, ROLLBACK,
ROLLBACK, SAVEPOINT SAVEPOINT.

Trang 100
Oracle c bn - SQL v PL/SQL

Database Trigger v Form Trigger

Database Trigger
Form Trigger
c thc hin khi c tc ng ln
c thc hin ch bi cc tc ng ngay trn
database do ng dng hoc do chnh cc
ng dng
cng c ca Oracle
c kch hot bi cc lnh SQL
c kch bi cc s kin trn ng dng Khng
Phn bit hai loi trigger trn cu lnh v
trn dng d liu phn bit
Tu theo li xy ra, trigger c th gy ra
rollback cu lnh Tu theo li xy ra, c th rollback ton b giao
dch
Database Trigger c kch hot c lp vi cc Form Trigger

15.2.2. Thay i trng thi ca database trigger


Cho php/ khng cho php kch hot mt databse trigger C php:
ALTER TRIGGER trigger_name DISABLE | ENABLE;
Vi:
trigger_name Tn trigger;
V d:
-- Cho php trigger c hot ng
ALTER TRIGGER check_sal ENABLE;

Cho php/ khng cho php kch hot tt c cc databse trigger ca mt bng C php:
ALTER TABLE table_name DISABLE | ENABLE ALL TRIGGERS;
Vi:
table_name Tn bng;
V d:
-- Khng cho php cc trigger ng vi bng emp c hot ng
ALTER TABLE emp DISABLE ALL TRIGGERS;

Bin dch li databse trigger


C php:
ALTER TRIGGER trigger_name COMPILE;
V d:
-- Bin dch li trigger check_sal sau khi sa i ni dung
ALTER TRIGGER check_sal COMPILE;

15.2.3. Hu b trigger
S dng cu lnh SQL hu b trigger.

Trang 101
Oracle c bn - SQL v PL/SQL

C php:
DROP TRIGGER trigger_name;
V d:
DROP TRIGGER check_sal;

15.2.4. Lu khi s dng trigger


Cc trng hp kim tra trigger
Kim tra trigger ng vi thao tc d liu nh d nh.
Kim tra thc hin trigger theo ng nh mnh When. Kim tra nh hng
ca trigger i vi cc trigger khc. Kim tra nh hng ca cc trigger khc i
vi trigger ang xem xt.

Th t thc hin trigger v cc kim tra rng buc:


1. Thc hin trigger BEFORE STATMENT
2. Lp trn nhiu dng d liu
a. Thc hin trigger BEFORE ROW
b. Thc hin cu lnh thao tc d liu v kim tra ton vn d liu trn dng
d liu xem xt
c. Thc hin trigger AFTER ROW
3. Thc hin cc php kim tra rng buc
4. Thc hin trigger AFTER STATMENT.

Cc quy tc rng buc i vi trigger:


1. Khng c php sa i d liu trong ct d liu c rng buc thuc loi kho
chnh (primary key), kho ngoi (foreign key) hay duy nht.
2. Khng cho php c d liu t cc bng ang thao tc.

Trang 102
Oracle c bn - SQL v PL/SQL

PH LC
A - DANH MC CC HNH V
Hnh v 1. Minh ho cc thnh phn logic trong database ... ...6
Hnh v 2. M hnh d liu thc hnh... ..7
Hnh v 3. Cu lnh ca SQL*Plus ... .12
Hnh v 4. Hn ch d liu tr v ... ...17
Hnh v 5. Cu trc hm SQL ... ...23
Hnh v 6. Phn loi hm SQL ... .24
Hnh v 7. Cu trc ca Object Navigator... ...84
Hnh v 8. Son tho hm, th tc pha Client... ..85
Hnh v 9. Son tho hm, th tc, trigger pha Server ... ...86
Hnh v 10. To hm, th tc ti Client ... .86
Hnh v 11. To hm, th tc ti Server ... ..87
Hnh v 12. Mn hnh PL/SQL Interpreter ... ...87
Hnh v 13. Cc bc thc hin mt th tc ... .89
Hnh v 14. Cu trc package ... ..93
Hnh v 15. Th t thc hin trigger... ..98
Hnh v 16. To trigger bng cng c Procedure Builder ... .100
Hnh v 17. Trigger tc ng trn dng d liu... ..100

Trang 103

You might also like