You are on page 1of 64

Ng Duc Thuan

Taø
Taøi lieä
lieäu tham khaû
khaûo
Cô sôû
sôû döõ lieä
lieäu 1 * SQL & PL/SQL Oracle @

Ngoân ngö
ngöõ SQL
* RELATIONAL DATABASES and SQL
PROGRAMMING Christopher Allen
Simon Chatwin
Catherine A. Creary
NGUYEÃN ÑÖÙC THUAÀN * Database System Design/Building I
Boä Moân Heä Thoáng Thoâng Tin
ÑH Thuyû Saûn JIPDEC
* Giaùo trình lyù thuyeát & thöïc haønh ORACLE
Traàn Tieán Duõng (Chuû bieân)

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Giôù
Giôùi thieä
thieäu SQL
Ngoân ngöõ SQL ?
SQL ( Structure Query Language) laø ngoân ngöõ truy vaán coù
caáu truùc. SQL laø 1 ngoân ngöõ chuaån ñeå thao taùc treân döõ lieäu
löu tröõ trong CSDL quan heä. SQL bao goàm 3 ngoân ngöõ sau:

-Ngoân ngöõ ñònh nghóa döõ lieäu (DDL) Data Definition Language
Ñònh nghóa 1 ñoái töôïng CSDL nhö 1 teân Table, kieåu döõ lieäu,..
NGOÂN NGÖÕ SQL (Oracle) -Ngoân ngöõ ñieàu khieån döõ lieäu (DCL) Data Control Language
Ñieàu khieån quyeàn truy xuaát CSDL cuûa ngöôøi söû duïng
-Ngoân ngöõ thao taùc döõ lieäu (DML) Data Manipulation Language
Thao taùc CSDL baèng caùch : Choïn (tìm kieám), Caäp nhaät, Xoaù döõ lieäu …

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Caù
Caùc kieå
kieåu döõ lieä
lieäu trong SQL (oracle)
Ngoân ngö
ngöõ SQL (tt
(tt))
SQL coù theå phaân thaønh 2 möùc theo quyeàn truy xuaát:
Teân kieåu YÙ nghiaõ
Möùc ngöôøi s.duïng Kieåu SQL Caùc leänh maãu VARCHAR2(size) Chöùa chuoãi TEXT ñeán 2000 byte

CHAR(size) Chöùa chuoãi TEXT ñeán 255 byte


Quaûn trò CSDL
DDL Create table <teân table>
Drop table <teân table>
NUMBER(p[,s]) Chöùa döõ lieäu soá
Alter table <teân table>
DATE Chöùa döõ lieäu ngaøy (‘dd-MMM-yy’)
DCL Grant <teân quyeàn> to <teân ngöôø i sd>
RAW Chöùa döõ lieäu nhò phaân ñeán 2000 byte
Ngöôøi söû duïng
DML Select <teân tröôøng> From <teân table> LONG Chöùa döõ lieäu TEXT ñeán 2 giga byte
Insert into <teân table> < ds giaù trò>
Update <teân table> SET teân_trg =dlieäu LONG RAW Chöùa döõ lieäu nhò phaân ñeán 2 giga byte
Delete from <teân table> Where <ñk>
ROWID Kieåu döõ lieäu hoã trôï maõ haøng aûo keát hôïp moãi baûng

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

1
Ng Duc Thuan

Chuù
Chuù yù:
?Char(n) ≠ varchar2(n)
? Number(n)
? Number(n,m)
? Date : khuoân daïng ‘dd-MMM-yy’, löu giaù trò ngaøy
thaùng döôùi daïng soá thaäp phaân ( tính töø ngaøy
31/12/4713 tröôùc CN)
? Trong 1 soá taøi lieäu coøn kieåu:
CLOB: döõ lieäu kyù töï toái ña 4 GB
BLOB: döõ lieäu nhò phaân toái ña 4 GB
BFILE:döõ lieäu nhò phaân toái ña 4 GB, löu tröõ ôû thieát Caùi phuùt ban ñaàu löu luyeán aáy
bò nhôù ngoaøi
Nghìn naêm chöa deã maáy ai queân

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Taï
Taïo caá
caáu truù
truùc Table

Taïo caáu truùc Table:


Create table <teân table> (<teân_coät_1
kieåu_dlieäu_1> [,<teân_coät_i kieåu_dlieäu_i> ]);

Ngoân ngö
ngöõ ñònh nghó
nghóa döõ lieä
lieäu Ví duï:
(DDL) create table vidu (
Taï
Taïo Table & Quaû
Quaûn lyù
lyù Table EMP_ID number (5) PRIMARY KEY,
Emp_Name varchar2(30),
Emp_Address varchar2(60),
Emp_birth date);
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Taï
Taïo caá
caáu truù
truùc Table * Taï
Taïo caá
caáu truù
truùc Table
l Qui ñònh teân Table:

- Phaûi baét ñaàu bôûi 1 chöõ caùi


- Chæ chöùa caùc kyù töï : A-Z, a-z, 0-9, _,$, #
- Khoâng truøng vôùi teân Table ñaõ coù
- Khoâng laø töø khoaù cuûa Oracle
Xem caùc Table ñaõ taïo laäp:
Select * from user_tables;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

2
Ng Duc Thuan

Taï
Taïo caá
caáu truù
truùc Table * Theâm 1 coä
coät vaø
vaøo caá
caáu truù
truùc Table
Taïo caáu truùc Table baèng caùch söû duïng Theâm 1 coät vaøo caáu truùc Table
Subquery: Alter table <teân table> ADD (<teân_coät kieåu_döõ_lieäu_coät>)
Create table <teân table> as SUBquery
Ví duï:
Alter table VIDU Add (Job VARCHAR2(30));
Ví duï:
EMP_ID
create table vidu as
Emp_Name
select empno, ename, sal*12
Emp_Address
From Emp
Emp_birth
Where deptno = 30;
job
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Hieä
Hieäu chæ
chænh 1 coä
coät
Coù theå thay ñoåi kieåu döõ lieäu, kích thöôùc, vaø giaù trò
* Xoaù
Xoaù 1 coä
coät
maëc ñònh 1 coät:
Coù theå xoaù caùc coät:
Alter table <teân table> MODIFY (<teân_coät Alter table <teân table> DROP (<teân_coät >);
kieåu_döõ_lieäu_coät>);

Ví duï:
Ví duï:
Alter table VIDU MODIFY (Emp_Name
Alter table VIDU DROP Emp_Name;
VARCHAR2(15));

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Thieá
Thieát laä
laäp muï
muïc choï
choïn UNUSED * Caé
Caét (Truncating)bôù
Truncating)bôùt Table
O Söû duïng muïc choïn SET UNUSED ñeå ñaùnh
Leänh TRUNCATE TABLE:
daáu nhieàu coät (khoâng cho söû duï ng).
- Xoaù taát caû caùc doøng töø 1 Table
O Söû duïng muïc choïn DROP UNUSED
- Xoaù Khoâng gian löu tröõ ñöôïc duøng bôûi
COLUMNS ñeå xoaù caùc coät ñaõ ñaùnh daáu Table
bôûi UNUSED
Alter table <teân table>
Truncate table <teân table> ;
SET UNUSED (<teân_coät >);
Alter table <teân table>
* Khoâng theå roll back caùc doøng sau khi xoaù
DROP UNUSED COLUMNS;
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

3
Ng Duc Thuan

* Theå
Theå hieä
hieän caù
caùc raø
raøng
ng buoä
buoäc * Ñònh nghó
nghóa caù
caùc raø
raøng
ng buoä
buoäc
(contraints)
contraints) CREATE TABLE <teân_table> (
l Caùc raøng buoäc laø gì? <teân coät> <Kieåu döõ lieäu> [gtrò maëc ñònh]
[<raøng_buoäc_coät>],
– Laø caùc qui taéc coù hieäu löïc ôû möùc Table ………..
– Raøng buoäc ngaên caûn vieäc xoaù 1 Table neáu coù [<raøng_buoäc_Table>][….];
Ví duï:
söï phuï thuoäc create table vidu (
– Caùc raøng buoäc sau laø coù hieäu löïc trong Oracle EMP_ID number (5),
Emp_Name varchar2(30) NOT NULL,
Raøng buoäc ñöôïc taïo ra :
Emp_Address varchar2(60),
- Khi taïo Table Emp_birth date,
- Sau khi Table ñöôïc taïo CONSTRAINT EMP_ID_PK PRIMARY KEY (EMP_ID));

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Ñònh nghó
nghóa caù
caùc raø
raøng
ng buoä
buoäc * raø
raøng
ng buoä
buoäc NOT NULL
l Coù 2 möùc l Ñaûm baûo coät phaûi chöùùa giaù trò, ñn ôû möùc
Möùc raøng buoäc coät: coät
<teân_coät> [CONSTRAINT constraint_name] Ví duï :
<kieåu raøng buoäc> create table vidu (
Möùc raøng buoäc Table: EMP_ID number (5),
Emp_Name varchar2(30) NOT NULL,
<teân_coät>,…..
Emp_Address varchar2(60),
[CONSTRAINT constraint_name
Emp_birth date);
<kieåu raøng buoäc> (<teân_coät>,…..)
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* raø
raøng
ng buoä
buoäc UNIQUE KEY * raø
raøng
ng buoä
buoäc UNIQUE KEY
DEPTNO DNAME LOC
Ñònh nghóa coù theå treân möùc Table hoaëc treân möùc
10 Accounting New York
Coät
20 Research Dallas
Ví duï :
30 Sales Chicago
create table Dept(
40 Operations Boston
Khoâng cho pheùp deptno number (2),
50 Sales Detroit (Teân Sales ñaõ coù) dname varchar2(14),
Loc varchar2(13),
60 Boston Cho pheùp
CONSTRAINT dept_dname_uk UNIQUE (dname));

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

4
Ng Duc Thuan

* raø
raøng
ng buoä
buoäc PRIMARY KEY * raø
raøng
ng buoä
buoäc PRIMARY KEY
DEPTNO DNAME LOC Ñònh nghóa coù theå treân möùc Table hoaëc treân möùc
10 Accounting New York
Coät
20 Research Dallas
Ví duï :
create table Dept(
30 Sales Chicago
deptno number (2),
40 Operations Boston
Khoâng cho pheùp dname varchar2(14),
Loc varchar2(13),
20 Sales Detroit (DEPTNO 20 ñaõ coù)
CONSTRAINT dept_dname_uk UNIQUE (dname),
60 Boston Khoâng Cho pheùp
CONSTRAINT dept_deptno_pk PRIMARY KEY
(DEPTNO roãng) (deptno));

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* raø
raøng
ng buoä
buoäc FOREIGN KEY * raø
raøng
ng buoä
buoäc FOREIGN KEY
PRIMARY KEY DEPT
DEPTNO DNAME LOC
Ñònh nghóa coù theå treân möùc Table hoaëc treân möùc
10 Accounting New York
coät
20 Research Dallas Ví duï :
….. create table emp(
empno number (4),
EMP
FOREIGN KEY ename varchar2(10) NOT NULL,
EMPNO ENAME JOB … COMM DEPTNO
7839 KING PRESIDENT 10
…..
7698 BLAKE MANAGER 30 Khoâng cho deptno number(7,2) NOT NULL,
pheùp
CONSTRAINT emp_deptno_fk FOREIGN KEY
(DEPTNO 9
chöa coù trong
(deptno) REFERENCES dept (deptno));
DEPT
2571 FORD MANAGER 200 9

7571 FORD MANAGER 200 20 Cho pheùp

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* raø
raøng
ng buoä
buoäc FOREIGN KEY * raø
raøng
ng buoä
buoäc CHECK
l Ñònh nghóa 1 ñieàu kieän maø moãi doøng phaûi thoaû
l Caùc bieåu thöùc khoâng cho pheùp:
l FOREIGN KEY : Ñònh nghóa treân coät taïi - Tham chieáu ñeán CURRVAL, NEXTVAL, LEVEL, vaø ROWNUM
Table con, nôi thieát laäp möùc raø ng buoäc - Goïi ñeán SYSDATE, UID, USER vaø caùc haøm USERENV
l REFERENCES : Ñònh danh Table, coät - Truy vaán tham khaûo ñeán caùc giaù trò trong caùc haøng khaùc

trong Table meï.


l ON DELETE CASCADE : Khi xoaù döõ lieäu … ,deptno NUMBER(2),
trong Table meï thì döõ lieäu trong Table con CONSTRAINT emp_deptno_ck
töông öùng cuõng bò xoaù. CHECK (DEPTNO BETWEEN 10 AND 99)…

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

5
Ng Duc Thuan

* theâm 1 raø
raøng
ng buoä
buoäc * xoaù
xoaù 1 raø
raøng
ng buoä
buoäc
ALTER TABLE <teân_Table> ALTER TABLE <teân_Table>
ADD CONSTRAINT <raøng buoäc> kieåu (teân_coät); DROP CONSTRAINT <teân_raøng_buoâc>;

?Theâm hoaëc xoaù, nhöng khoâng hieäu chænh ñöôïc 1 Ví duï :


raøng buoäc ALTER TABLE emp
DROP CONSTRAINT emp_mgr_fk;
?Theâm 1 raøng buoäc NOT NULL baèng caùch söû duïng
meänh ñeà MODIFY

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* voâ hieä
hieäu hoaù
hoaù raø
raøng
ng buoä
buoäc
* kích hoaï
hoaït raø
raøng
ng buoä
buoäc
ALTER TABLE <teân_Table>
DISABLE CONSTRAINT <teân_raøng_buoäc>; * Kích hoaït caùc raøng buoäc toaøn veïn ñaõ voâ hieäu hoaù
tröôùc ñoù baèng DISABLE
* Coù theå söû duïng muïc choïn CASCADE ñeå voâ hieäu hoaù caùc
raøng buoäc toaøn veïn phuï thuoäc ALTER TABLE <teân_Table>
ENABLE CONSTRAINT <teân_raøng_buoäc>;
Ví duï :
* Moät chæ muïc UNIQUE hay PRIMARY KEY töï
ALTER TABLE <teân_Table> ñoäng ñöôïc taïo laäp neáu kích hoaït raøng buoäc
DISABLE CONSTRAINT emp_mgr_fk CASCADE; UNIQUE hay PRIMARY KEY
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* raø
raøng
ng buoä
buoäc thaù
thaùc nöôùc * Xem caù
caùc raø
raøng
ng buoä
buoäc
? Truy vaán Table USER_CONSTRAINTS ñeå
? Söûduïng meänh ñeà CASCADE CONSTRAINT xem taát caû caùc ñònh nghóa vaø teân caùc raøng buoäc.
theo sau meänh ñeà DROP COLUMN
SELECT constraint_name, constraint_type,
? Meänh ñeà CASCADE CONSTRAINT xoaù taát caû search_condition
caùc raøng buoäc toaøn veïn tham chieáu lieân quan FROM USER_CONSTRAINTS;
ñeán coät bò xoaù.

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

6
Ng Duc Thuan

* Xoaù
Xoaù Table
Drop Table <teân Table>;

Ví duï: Ngoân ngö


ngöõ thao taù
taùc döõ lieä
lieäu
Drop table vidu; (DML)
Thao taù
taùc treân Table

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Cheø
Cheøn döõ lieä
lieäu
* Cheø
Cheøn döõ lieä
lieäu Cheøn caùc doøng vôùi giaù trò Null
* Phöông phaùp khoâng töôøng minh: Boû qua coät trong
INSERT INTO <Teân table > (<DS Coät>) danh saùch coät
VALUES (< DS GIAÙ TRÒ>); Ví duï :
* Cheøn doøng döõ lieäu Insert into Don_vi (mdv) values (’01’);
Ví duï : * Phöông phaùp töôøng minh: Söû duïng töø khoaù NULL
Insert into Don_vi (mdv, ten_dv) values (’01’,’Day la 1 Ví duï :
vi du’); Insert into Don_vi (mdv,Ten_don_vi) values (’01’,
- Giaù trò chuoãi kyù töï hay ngaøy phaûi ñaët trong 2 daáu nhaùy null);

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Cheø
Cheøn döõ lieä
lieäu: Taï
Taïo 1 kòch baûbaûn vôù
vôùi
* Sao cheù
cheùp caù
caùc doø
doøng
ng döõ lieä
lieäu töø 1
caù
caùc daá
daáu nhaé
nhaéc tuyø
tuyø bieá
bieán
Table khaù
khaùc
* ACCEPT löu giaù trò vaøo 1 bieán
* PROMT hieån thò vaên baûn tuyø yù cuûa baïn Vieát caâu leänh INSERT vôùi Subquery
Ví duï: Ví duï:
ACCEPT msnv_id PROMPT ‘ Dua vao ma so Insert into Nhan_vien (msnv,Ten_nv, ngayhd)
nhan vien: ’
Select ms_nv,Ten_nv1, ngayhd
ACCEPT Ten_nv_id PROMPT ‘ Dua vao ten
nhan vien: ’ From NV
Where job = ‘thay giao’;
Insert into Nhan_vien (msnv,Ten_nv, ngayhd)
values (msnv_id, Ten_nv_id,SYSDATE); * Khoâng duøng töø khoaù VALUES
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

7
Ng Duc Thuan

* Thay ñoåi döõ lieä


lieäu töø 1 Table * Caä
Caäp nhaä
nhaät vôù
vôùi subquery nhieà
nhieàu coä
coät
Caâu leänh UPDATE Ví duï:
Update Nhan_vien
Tu söûa caùc doøng ñaõ coù
SET (mpx,pcap) =
UPDATE <teân Table>
(Select mpx,pcap
SET <coät> = <giaù trò> [, <coät> = <giaù trò> ,..]
From Nhan_vien
[where <ñieàu kieän>]; Where msnv =‘7899’)
Ví duï:
Where msnv = ‘12345’;
Update Nhan_vien
SET ngayhd= ’12-DEC-04’
Where msnv = ‘12345’;
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Caä
Caäp nhaä
nhaät caù
caùc doø
doøng
ng döïa treân cô sôû
sôû ø Caä
Caäp nhaä
nhaät caù
caùc doø
doøng
ng
1 Table khaù
khaùc Loãi raø
raøng
ng buoä
buoäc toaø
toaøn veï
veïn
*Söû duïng truy vaán con trong caâu leänh UPDATE ñeå caäp UPPDATE emp
nhaät caùc haøng trong 1 Table döïa treân cô sôû caùc giaù trò töø SET deptno = 55
taïi
WHERE deptno = 10; toàn
1 Table khaùc kho
âng
á 55
UPPDATE employee ôû ng so
UPPDATE emp ân xö
a
SET deptno = (SELECT deptno õ ph
Ma
FROM emp *
WHERE empno = 7788) ERROR at line 1:
WHERE job = (SELECT job ORA-02291: integrity constraint (USR.EMP_DEPTNO_FK)
FROM emp Violate – parent key not found
WHERE empno = 7788);
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Xoaù
Xoaù caù
caùc doø
doøng
ng döïa treân 1 Table
* Xoaù
Xoaù caù
caùc doø
doøng
ng töø 1 Table khaù
khaùc
Söû duïng caâu leänh DELETE
l Döïa treân truy vaán con trong leänh DELETE ñeå
DELETE [FROM] <teân table>
xoaù caùc doøng töø 1 Table döïa treân cô sôû 1 table
[where <ñieàu kieän>];
khaùc
Ví duï:
DELETE FROM employee
Delete From Nhan_vien
WHERE deptno =
Where msnv =‘7899’);
(SELECT deptno
FROM dept
* Khi khoâng coù meänh ñeà where, taát caû caùc doøng
cuûa Table ñöôïc chæ ra ñeàu bò xoaù. WHERE dname =‘SALES’);

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

8
Ng Duc Thuan

Xoaù
Xoaù caù
caùc doø
doøng
ng : *Caù
Caùc giao dòch Cô sôû
sôû döõ lieä
lieäu
Loãi raø
raøng
ng buoä
buoäc toaø
toaøn veï
veïn
DELETE FROM dept
l Bao goàm caùc leänh sau:
h
hín
aù c g 1
WHERE deptno = 10; ùa 1 kho ïi tron
a
hö go
g c aù n
o a
oø n k h o
ù 1 d h oa ù ù c
k
1. Caùc leänh DML laøm thay ñoåi döõ lieäu
åx ha
DELETE FROM dept the nhö ble k
1

ïn k
ân g
h o û du ï n
g Ta 2. Moät leänh DDL
* B a ô ï c sö
ñö
ERROR at line 1: 3. Moät leänh DCL
ORA – 02292 : integrity constraint (USR.EMP_DEPTNO_FK)
Violated – child record found

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

*Caù
Caùc leä
leänh
nh COMMIT vaøvaø ROLLBACK
*Caù
Caùc giao dòch Cô sôû
sôû döõ lieä
lieäu naâng cao
l Baét ñaàu khi leänh thi haønh ñöôïc laàn ñaàu tieân
ñöôïc thöïc hieän l Ñaûm baûo raøng buoäc toaøn veïn döõ lieäu
l Keát thuùc vôùi 1 trong nhöõng söï kieän sau: l Xem xeùt caùc thay ñoåi tröôùc khi thöïc
– -COMMIT hay ROLLBACK ñöôïc ñöa ra hieän nhöõng thay ñoåi thöôøng xuyeân
– -Leänh DDL hay DCL thöïc hieän (töï ñoäng
l Caùc pheùp toaùn lieân quan ñeán nhoùm
commit)
– -Ngöôøi söû duïng thoaùt
logic
– -Heä thoáng vôõ (crash)
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

*Caù
Caùc ñieà
ieàu khieå
khieån giao dòch *Cô cheá
cheá xöû lyù
lyù giao dòch
Giao dòch 1. Moät COMMIT töï ñoäng sinh ra trong caùc tình
huoáng sau:
INSERT UPDATE INSERT DELETE – Moät leänh DDL ñöôïc thi haønh
– Moät leänh DCL ñöôïc thi haønh
COMMIT Savepoint A Savepoint B
– Thoaùt bình thöôøng töø SQL*PLUS, khoâng nhaát thieát
phaûi söû duïng COMMIT hay ROLLBACK
ROLLBACK to Savepoint B

ROLLBACK to Savepoint A 2. Moät ROLLBACK töï ñoäng sinh ra khi keát thuùc
SQL*Plus khoâng bình thöôøng hay heä thoáng hoûng.
ROLLBACK

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

9
Ng Duc Thuan

Traï
Traïng
ng thaù
thaùi cuû
cuûa döõ lieä
lieäu trö
tröôùc Traï
Traïng
ng thaù
thaùi cuû
cuûa döõ lieä
lieäu sau
COMMIT hay ROLLBACK COMMIT
l Traïng thaùi tröôùc ñoù cuûa döõ lieäu ñöôïc phuïc hoài l Döõ lieäu thay ñoåi ñöôïc löu thöôøng xuyeân trong
l Ngöôøi söû duïng hieän haønh coù theå xem laïi caùc keát CSDL
quaû cuûa caùc thao taùc DML baèng caùch duøng leänh l Traïng thaùi tröôùc ñoù cuûa döõ lieäu laø bò maát
SELECT l Taát caû ngöôøi söû duïng coù theå xem caùc keát quaû
l Nhöõng ngöôøi söû duïng khaùc khoâng theå xem caùc keát l Caùc khoaù treân caùc doøng giaû laäp (affected) bò xoaù;
quaû caùc leänh DML nhöõng doøng naøy coù khaû naêng nhöõng ngöôøi söû
l Nhöõng doøng gæa laäp bò khoaù; nhöõng ngöôøi söû duïng duïng khaùc xöû lyù
khaùc khoâng theå thay ñoåi döõ lieäu caùc doøng giaû laäp l Taát caû caùc ñieåm löu bò xoaù boû

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* COMMIT Data Traï


Traïng
ng thaù
thaùi cuû
cuûa döõ lieä
lieäu sau
ROLLBACK
l Thöïc hieän caùc thay ñoåi
l Loaïi boû nhöõng thay ñoåi chöa quyeát ñònh baèng caùch duøng
UPDATE Emp
leänh ROLLBACK
SET deptno = 10
l Döõ lieäu thay ñoåi bò xoaù boû thay ñoåi
WHERE empno = 7782
l Traïng thaùi tröôùc ñoù cuûa döõ lieäu ñuôïc phuïc hoài
COMMIT caùc thay ñoåi l Caùc khoaù treân caùc doøng giaû laäp (affected) ñöôïc loaïi boû
SQL> COMMIT DELETE FROM Employee;
Commit complete 14 rows deleted
SQL> ROLLBACK
Rollback Complete

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

ROLLING BACK thay ñoiå ñeán 1 ñaùnh


nh daá
daáu Caù
Caùc möùc leä
leänh
nh ROLLBACK
l Taïo laäp 1 ñaùnh daáu trong giao dòch hieän haønh baèng caùch l Neáu moät leänh DML ñôn loãi trong quaù trình thöïc
duøng leänh SAVEPOINT.
hieän, chæ 1 leänh ñöôïc ROLLBACK
l ROLLBACK ñeán 1 ñaùnh daáu söû duïng leänh
l Maùy chuû Oracle caøi ñaët 1 savepoint aån.
ROLLBACK TO SAVEPOINT
SQL> UPDATE l Taát caû nhöõng thay ñoåi khaùc ñöôï c giöõ laïi
SQL> SAVEPOINT update_done; l Ngöôøi söû duïng neân keát thuùc caùc giao dòch baèng
Savepoint Created
caùch thöïc hieän caùc leänh COMMIT hay
SQL> INSERT
ROLLBACK
SQL> ROLLBACK TO update_done;
Rollback complete

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

10
Ng Duc Thuan

* Nhaá
Nhaát quaù
quaùn ÑOÏC * Caø
Caøi ñaët nhaá
nhaát quaù
quaùn ÑOÏC
l Nhaát quaùn ÑOÏC ñaûm baûo 1 thoáng nhaát döõ lieäu UPDATE emp Data Blocks

taïi moïi thôøi ñieåm. SET sal = 2000


WHERE ename = ‘Scott’; Rollbacks

l Thay ñoåi thöïc hieän bôûi 1 ngöôøi söû duïng khoâng


segments

xung ñoät vôùi nhöõng thay ñoåi cuû a ngöôøi söû duïng USER A

khaùc Döõ lieäu ñaõ thay ñoåi


vaø chöa thay ñoåi

l Nhaát quaùn ÑOÏC baûo ñaûm raèng treân caùc döõ lieäu SELECT *
Ñoïc aûnh
nhaát quaùn
tröôùc khi thay ñoåi
gioáng nhau: FROM emp;
döõ lieäu “cuõ”

– Nhöõng ngöôøi ñoïc khoâng chôø nhöõng ngöôøi ghi


USER B
– Nhöõng ngöôøi ghi khoâng chôø nhöõng ngöôøi ñoïc

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Khoaù
Khoaù (Locking) * Toù
Toùm löôïc
Oracle khoaù : Leänh Moâ taû
*Ngaên chaën taùc ñoäng tieâu cöïc giöõa nhöõng giao INSERT Theâm 1 doøng môùi vaøo Table
dòch töông tranh
UPDATE Tu söûa caùc doøng ñaõ coù trong Table
*Yeâu caàu khoâng coù taùc ñoäng ngöôøi söû duïng
DELETE Xoaù caùc doøng ñaõ coù
*Töï ñoäng duøng möùc thaáp nhaát cuûa söï haïn cheá
COMMIT Thöïc hieän taát caû taát caû nhöõng thay ñoå i
*Naém giöõ khoaûng thôøi gian cuûa giao dòch
*Coù 2 moâ hình cô baûn: SAVEPOINT Cho pheùp 1 rollback ñeán 1 ñaùnh daáu savepoint

- Loaïi tröø ROLLBACK Huyû taát caû nhöõng thay ñoåi coøn treo

- Chia seû
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Choï lieäu (Select)


Choïn döõ lieä
* Bieå
Bieåu thöù
thöùc toaù
toaùn hoï
hoïc
Choïn coät hieån thò:
SELECT (<teân_coät_1, teân_coät2,…>) l Taïo caùc bieåu thöùc treân döõ lieäu NUMBER vaø
FROM <teân Table> ); DATE baèng caùch söû duïng caùc pheùp toaùn

Pheùp toaùn YÙ nghóa


+ Coäng
Ví duï:
- Tröø
Select EMP_ID, Emp_Name,
FromVIDU; * Nhaân

/ Chia

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

11
Ng Duc Thuan

* Söû duï
duïng
ng caù
caùc pheù
pheùp toaù
toaùn soá
soá hoï
hoïc * Ñònh nghó
nghóa bí danh (alias) 1 coä
coät
Ví duï :
Select ename, sal, sal+300 l Ñònh nghóa laïi tieâu ñeà
From VIDU;
l Ñöôïc duøng cho caùc bieåu thöùc tính toaùn
*Thöù töï öu tieân caùc pheùp toaùn:
*/-+ l Ñöôïc vieát lieàn sau teân coät; hoaëc söû duïng töø
Select ename, sal, 12*Sal+100 khoaù AS giöõa teân coät vaø bí danh
From VIDU;
Söû duïng daáu ngoaëc ñeå theå hieän thöù töï öu tieân l Yeâu caàu coù daáu “ “ neáu chöùa khoaûng
Select ename, sal, 12* (Sal+100) traéng, kyù töï ñaëc bieät
From VIDU;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Toaù
Toaùn töû gheù
gheùp (concatenation
* Söû duï
duïng
ng bí danh (alias) coä
coät
operation)
• Select ename AS name, sal salary l Gheùp caùc coät hay caùc chuoãi kyù töï vaøo caùc
From VIDU; coät khaùc
l Ñöôïc bieãu dieãn baèng ||

‚Select ename “Name”, sal*12 “Annual l Taïo keát quaû laø 1 bieåu thöùc kyù töï
Salary”; Ví duï:
Select empname || job AS “Employee”
From emp;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Chuoãi chö
chöõ theâm cho caù
caùc bieå
bieåu thöù
thöùc * Söû duï
duïng
ng chuoãi chö
chöõ theâm cho caù
caùc
hieå
hieån thò bieå
bieåu thöù
thöùc hieå
hieån thò
l Moät chöõ (literal)laø 1 kyù töï, 1 soá , hay 1 SELECT <teân coät> || <chuoãi chöõ> ||
ngaøy thaùng ñöôïc chöùa trong danh saùch caâu <teân coät > [AS <bí danh>]
leänh SELECT
l Giaù trò chöõ Ngaøy hay kyù töï phaûi chöùa trong Ví duï:
daáu nhaùy keùp SELECT ename || “is a”||
l Moãi chuoãi kyù töï ñöôïc xuaát 1 laàn trong moãi Job AS “Employee Detail”
doøng

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

12
Ng Duc Thuan

* Caù
Caùc doø
doøng
ng truø
truøng
ng laé
laép * Haï
Haïn cheá
cheá caù
caùc doø
doøng
ng truø
truøng
ng laé
laép
Hieån thò maëc ñònh caùc truy vaán giaù trò truøng nhau cuûa
caùc doøng vaãn hieån thò Söû duïng töø khoaù DISTINCT
Ví duï : SELECT deptno From emp; Ví duï : SELECT DISTINCT deptno From emp;
DEPTNO DEPTNO
----------------- -----------------
10
10
30
10 30
20 20
…. ….

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Töông taù
taùc giö
giöõa SQL & SQL Plus
* Tìm hieå
hieåu theâm SQL Plus
SQL Statements SQL Statements

* Caùc leänh SQL*PLUS soaïn thaûo


Buffer
* Caùc leänh SQL*PLUS xöû lyù File:
. SAVE <teân File>
Server
SQL*PLUS . GET <teân File>
. START <teân File>
. @ <teân File>
. EDIT <teân File>
SQL*PLUS Commands Query Results
. SPOOL <teân File>
Formatted Report
. EXIT

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

*Söû duï
duïng
ng meä
meänh
nh ñeà WHERE
* Hieå
Hieån thò caá
caáu truù
truùc Table
- Giaù trò chuoãi kyù töï vaø ngaøy thaùng phaûi ñeå trong daáu
DESC[RIBE] <teân_table> nhaùy keùp.
-Giaù trò chuoãi phaân bieät kyù töï hoa, thöôøng. Giaù trò ngaøy
thaùng phaûi theo khuoân daïng.
*Ruù
Ruùt trí
trích vaø
vaø saé
saép xeá
xeáp döõ lieä
lieäu -Giaù trò maëc ñònh coù daïng DD-MON-YY
SELECT [DISTINCT] (* | <teân_coät> [alias],….) Ví duï:
SELECT ename, job, deptno
FROM <teân_Table>
FROM emp
[WHERE <ñieàu kieän >]
WHERE ename = “THUAN”

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

13
Ng Duc Thuan

*Söû duï
duïng
ng meä
meänh
nh ñeà WHERE
*Söû duï
duïng
ng meä
meänh
nh ñeà WHERE
Toaùn töû so saùnh
Caùc toaùn töû so saùnh khaùc
Toaùn töû YÙ nghóa
= baèng
Toaùn töû YÙ nghóa
> lôùn hôn [NOT]Between … and … Giöõa 2 caän giaù trò
>= lôùn hôn hoaëc baèng
[NOT] IN (danh saùch) Thuoäc danh saùch
< nhoû hôn
[NOT] LIKE Gioáng khuoân daïng
<= nhoû hôn hoaëc baèng
<> khoâng baèng IS [NOT] NULL Laø 1 giaù trò null

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

*Söû duï
duïng
ng meä
meänh
nh ñeà WHERE Söû duï
duïng
ng meä
meänh
nh ñeà WHERE
Söû duïng toaùn töû LIKE
- Duøng toaùn töû LIKE ñeå thöïc hieän tìm kieám giaù trò theo Caùc toaùn töû Logic
khuoân daïng
- Ñieàu kieän tìm kieám coù theå laø döõ lieäu kyù töï hay soá. Toaùn töû YÙ nghóa
- % thay theá cho zero hay baát kyø kyù töï naøo AND Traû veà giaù trò TRUE neáu 2 ñieàu kieän
- _ thay theá cho 1 kyù töï thaønh phaàn ñeàu TRUE
Ví duï: OR Traû veà giaù trò TRUE neáu coù 1 trong 2
Select ename ñieàu kieän thaønh phaàn TRUE
From emp NOT Traû veà giaù trò TRUE neáu ñieàu kieän
Where ename LIKE ‘S%’ False

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Saé
Saép xeá
xeáp thöù
thöù töï
Söû duï
duïng
ng meä
meänh
nh ñeà WHERE
* Saép xeáp caùc haøng baèng meänh ñeà ORDER BY:
-ASC : Saép xeáp theo thöù töï taêng daàn (maëc ñònh)
Thöù töï öu tieân caùc pheùp toaùn
-DESC: Saép xeáp theo thöù töï giaûm daàn
Thöù töï öu tieân Toaùn töû Meänh ñeà ORDER BY ñöôïc vieát cuoái caâu leänh SELECT
1 Taát caû caùc pheùp toaùn so saùnh
2 NOT Ví duï : SELECT ename, job, deptno
3 AND From emp
Order by deptno DESC;
4 OR
* Coù theå saép xeáp baèng bí danh cuûa coät, hay 1 bieåu thöùc
* Öu tieân caùc pheùp toaùn trong ngoaëc tröôùc

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

14
Ng Duc Thuan

Saé
Saép xeá
xeáp thöù
thöù töï
Ví duï:
SELECT empno, ename, sal*12 annsal
From emp
Order by annsal;
Caù
Caùc haø
haøm treân töøng
ng doø
doøng
ng
Coù theå saép xeáp thöù töï nhieàu coät
SELECT empno,deptno , sal
From emp
Order by deptno, sal DESC;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Caù
Caùc haø
haøm SQL * Hai loaï
loaïi haø
haøm SQL
Input
Caùc haøm
Output
Haøm
Function
Tham soá 1
Caùc haøm Caùc treân

Treân töøng doøng nhieàu doøng


Tham soá 2 Giaù trò
keát quaû
°
Tham soá n
°

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Caù
Caùc haø
haøm treân töøng
ng doø
doøng
ng
* Caù
Caùc haø
haøm treân töøng
ng doø
doøng
ng
Kyù töï
? Thao taùc caùc muïc choïn döõ lieäu Thoâng
thöôøng
? Chaáp nhaän caùc tham soá vaø traû veà 1 giaù trò Soá
Caùc haøm
? Traû veà 1 giaù trò treân moãi doøng Treân töøng doøng
? Coù theå tu söûa kieåu döõ lieäu
? Coù theå loàng nhau
Chuyeån ñoåi Ngaøy
Teân_haøm (coät | bieåu_thöùc, [thsoá1], thsoá2, …])

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

15
Ng Duc Thuan

* Caù
Caùc haø
haøm kyù
kyù töï * Caù
Caùc haø
haøm chuyeå
chuyeån ñoåi kyù
kyù töï
Caùc haøm
Kyù töï
Chuyeån ñoåi chuoãi kyù töï
Haøm Keát quaû
Caùc haøm chuyeån ñoåi Caùc haøm thao taùc
LOW(‘SQL Course’) sql course
kyù töï Kyù töï
UPPER (‘SQL Course’) SQL COURSE
LOWER CONCAT
UPPER SUBSTR INITCAP (‘SQL Course’) Sql Course
INITCAP LENGTH
INSTR
LPAD
TRIM
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Caù
Caùc haø
haøm soá
soá
* Caù
Caùc haø
haøm thao taù
taùc kyù
kyù töï
* ROUND: Laøm troøn giaù trò theo soá thaäp
Thao taùc treân chuoãi kyù töï phaân ñöôïc chæ ñònh
Haøm Keát quaû ROUND(45.926, 2) 45.93
CONCAT(‘Good’,’String’) GoodString *TRUNC: Caét giaù trò theo soá thaäp phaân ñöôïc
SUBSTR(‘String’,1,3) Str
LENGTH(‘String’) 6
chæ ñònh
INSTR(‘String’,’r’) 3 TRUNC (45.926, 2) 45.92
LPAD(sal,10,’*’) *****5000 *MOD :Traû veà phaàn dö cuûa pheùp chia
TRIM(‘S’ FROM ‘SSMITH’) MITH
MOD (1600, 300) 100

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

*Söû duï
duïng
ng haø
haøm ROUND *Laø
Laøm vieä
vieäc vôù
vôùi ngaø
ngaøy thaù
thaùng
ng
duï: SELECT ROUND(45.923,2), ROUND(45.923,0),
Ví duï
ROUND(45.923,-
ROUND(45.923,-1)FROM DUAL *Oracle löu tröõ ngaøy thaùng trong 1 daïng soá
Keá
Keát quaû
quaû:
ROUND(45.923,2) 45.92 (Julian): Theá kyû, naêm, thaùng, ngaøy, giôø, phuùt,
ROUND(45.923,0) 46 giaây.
ROUND(45.923,-
ROUND(45.923,-1) 50
*Daïng ngaøy thaùng maëc ñònh laø : DD-MON-YY
*Söû duïng haøm TRUNC
Ví duï: SELECT TRUNC(45.923,2), TRUNC(45.923,0),
*SYSDATE laø haøm traû veà ngaøy, giôø heä thoáng
TRUNC(45.923,-1)FROM DUAL *DUAL laø 1 table giaû (aûo) ñöôï c duøng ñeå xem
Keát quaû:
TRUNC(45.923,2) 45.92 SYSDATE
TRUNC(45.923,0) 45
TRUNC(45.923,-1) 40
DUAL laø 1 Table aûo chöùa keát quaû pheùp toaùn
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

16
Ng Duc Thuan

* Caù
Caùc pheù
pheùp tính soá
soá hoï
hoïc vôù
vôùi ngaø
ngaøy thaù
thaùng
ng
* Caù
Caùc haø
haøm ngaø
ngaøy thaù
thaùng
ng
*Coäng hay tröø 1 soá vaøo 1 ngaøy, cho keát quaû laø giaù
Haøm YÙ nghóa
trò ngaøy
MONTHS_BETWEEN Soá thaùng giöõa 2 ngaøy tham soá
*Tröø 2 döõ lieäu ngaøy thaùng cho keát quaû laø 1 soá
nguyeân chæ soá ngaøy giöõa caùc döõ lieäu ngaøy thaùng ADD_MONTHS Coäng soá thaùng vaøo ngaøy tham soá
naøy. NEXT_DAY Ngaøy keá tieáp cuûa ngaøy chæ ñònh
* Coäng giôø vaøo 1 ngaøy baèng caùch chia soá giôø cho LAST_DAY Ngaøy cuoái cuûa thaùng öùng vôùi
24. ngaøy chæ ñònh
ROUND Laøm troøn ngaøy
TRUNC Laøm troøn baèng caùch caét ngaøy
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Söû duï
duïng
ng caù
caùc haø
haøm ngaø
ngaøy thaù
thaùng
ng *Chuyeå
Chuyeån ñoåi kieå
kieåu döõ lieä
lieäu töôøng
ng minh
MONTHS_BETWEEN(’01-SEP-95’,’11-JAN-94’)
‘19.6774194’
TO_NUMBER TO_DATE
ADD_MONTHS(’11-JAN-94’,6) ‘11-JUN-94’
NEXT_DAY(’01-SEP-95’, ‘FRIDAY’ ‘08-SEP-95’
LAST_DAY (’01-SEP-95’) ‘30-SEP-95’
ROUND(’25-JUL-95’,’MONTH’) 01-AUG-95 DATE
NUMBER CHARACTER
ROUND(’25-JUL-95’,’ YEAR’) 01-JAN-96
TRUNC(’25-JUL-95’,’MONTH’) 01-JUN-95
TRUNC(’25-JUL-95’,’ YEAR’) 01-JAN-95

TO_CHAR TO_CHAR

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

*Haø
Haøm TO_CHAR vôù
vôùi döõ lieä
lieäu ngaø
ngaøy
* Caù
Caùc phaà
phaàn töû khuoân daï
daïng
ng ngaø
ngaøy
TO_CHAR (date, ‘fmt’);
-Khuoân daïng phaûi vieát trong daáu nhaùy ñôn YYYY Ñaày ñuû caùc kyù soá cuûa naêm
-Neáu coù tieáp ñaàu ngöõ fm ñeå xoaù giaù trò baét ñaàu laø 0
YEAR Ñaønh vaàn teân naêm
- Phaân caùch caùc giaù trò ngaøy laø 1 daáu ,
MM Hai kyù soá giaù trò thaùng
Ví duï:
MONTH Teân ñaày ñuû cuûa thaùng
Select ename, TO_CHAR(birth_day, ‘fmDD Month YYYY’
From emp; DY Ba kyù töï teân ngaøy trong tuaàn

DAY Teân ñaày ñuû cuûa ngaøy


NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

17
Ng Duc Thuan

* Caù
Caùc phaà
phaàn töû khuoân daï
daïng
ng ngaø
ngaøy * Caù
Caùc phaà
phaàn töû khuoân daï
daïng
ng ngaø
ngaøy
Ví duï: l Caùc phaàn töû thôøi gian ñònh daïng vò trí thôøi
Select to_char(ngay, ‘fm DD MM YEAR’) gian trong ngaøy
from ABC; HH24:MI:SS AM 15:45:32 PM
l Theâm chuoãi kyù töï baèng caùch vieát giöõa 2
daáu nhaùy keùp
To_char(ngay, fmDD MONTHYEAR) DD “of” MONTH 12 of OCTOBER
--------------------------------------------------
15 12 TWO THOUSAND FOUR
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Haø
Haøm TO_CHAR vôù
vôùi soá
soá
* Haø
Haøm TO_CHAR vôù
vôùi soá
soá
Select TO_CHAR(he_so_luong,’$0099.999’)
from ngach_bac_luong;
TO_CHAR(soá, ‘fmt’)
Hieån thò 1 giaù trò soá nhö 1 kyù töï
9 Bieåu dieãn 1 soá
TO_CHAR(he_so_luong,’$0099.99’)
0 Hieån thò soá 0 -----------------------------------------------
$ Hieån thò daáu $ $003.35
L Hieån thò kyù töï tieàn teä $004.12
. In ra 1 daáu chaám thaäp phaân $002.55

, In ra 1 daáu phaân caùch haøng ngaøn

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Haø
Haøm DECODE
* Haø
Haøm NVL Xöû lyù meänh ñeà ñieàu kieän, baèøng caùch söû duïng töông töï caâu leänh CASE hay IF-
THEN-ELSE
DEDCODE (<coät1>/<bthöùc1>, <gtrò1>, < kquaû 1>,
Haøm chuyeån ñoåi giaù trò Null thaønh giaù trò [<coät i>/<bthöùc i>, <gtrò i>, < kquaû i>]
[, <maëc ñònh>]
ñöôïc chæ ra
Select job, sal, DECODE(job, ‘Thay’, sal*1.1, ‘Quan ly, sal*1.15, sal)
- Kieåu döõ lieäu coù theå laø ngaøy, kyù töï, vaø soá Revised_salary from emp

- Kieåu döõ lieäu phaûi phuø hôïp JOB SAL Revised_salary


--------------------- --------------- -----------------------
NVL(comm,0) PRESIDENT
MANAGER
5000
2850
5000
3420
NVL(hiredate,’01-JAN-97’) MANAGER 2450 2940

NVL(job,’Giao vien’) * Caùc haøm coù theå loàng nhau

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

18
Ng Duc Thuan

* Hieå
Hieån thò döõ lieä
lieäu töø nhieà
nhieàu Table * Keá
Keát noá
noái ?
SELECT <teân table1>.<teân coät>, <teân table2><teân coät>,..
From <teân table1>,<teân table2>
EMP ENAME ……… DEPTNO DEPTNO DNAME ……… LOC WHERE <teân table1>.<teân coät1>= <teân table2>.<teân coät 2>
------------------------------------------------ ------------------------------------------------
7234 KING ……… 10 10 ACCOUNTING NEWYORK
7235 BLAKE ……… 30 30 RESEARCH DALLAS l Vieát ñieàu kieän keát noái trong meänh ñeà WHERE
…… ……
7345 MILLER ……… 10 40 OPERATIONS BOSTON l Tröôùc teân caùc coät laø teân Table
EMP DEPTNO LOC
l Tích DESCASTER ñöôïc taïo ra khi ñieàu kieän keát
------------------------------------------- noái khoâng hôïp leä hay bò boû qua
7234 10 NEWYORK
7235 30 DALLAS l Neân söû duïng bí danh ñeå thay theá teân Table
l Coù theå keát noái nhieàu Table
…..
7345 10 NEWYORK

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Keá
Keát noá
noái khoâng baè
baèng
ng (Non –
* Keá
Keát noá
noái döõ lieä
lieäu
Equijoins)
Equijoins)
EMPNO ENAME SAL GRADE LOSAL HISAL
SELECT e.name, e.sal, a.grade
-------------------------------------------------- ---------------------------------------------------
7348 KING 5000 1 700 1200 * Keát xuaát caùcFrom emp e, salgrade a
baûn ghi
7698 BLAKE 2850 2 1201 1400 keát noái khoâng baènWhere
g e.sal
7782 CLARK 2450 3 1401 2000 BETWEEN a.losal AND a.hisal
7844 ALLEN 1600 4 2001 3000
7900 JACK 1500 ……………….
7653 BIN 900 EMP SAL GRADE
7888 LENA 1200 SALGRADE ---------------------------------------------------
7653 900 1
7888 1200 2

EMP 7900 1500 3


7844 1600 3
……..

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Keá
Keát noá
noái ngoaø
ngoaøi (Outer Joins) * Keá
Keát noá
noái ngoaø
ngoaøi (Outer Joins)
EMP DEPT
l Coù theå söû duïng keát noái ngoaøi ñeå thaá y caùc doøng
ENAME DEPTNO
-----------------------------------
DEPTNO DNAME
-------------------------------------------
khoâng thoaû ñieàu kieän keát noái
KING 10 10 ACCOUNTING l Toaùn töû keát noái ngoaøi laø daáu +
BLAKE 30 20 RESEARCH
CLARK 10 30 SALES SELECT Table1.column, Table2.column
JONES 20 40 OPERATIONS From Table1, Table2
…………
Where Table1.column(+) = Table2.column;
SELECT Table1.column, Table2.column
From Table1, Table2
Khoâng coù nhaân vieân naøo thuoäc phoøng Where Table1.column = Table2.column(+);
OPERATIONS

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

19
Ng Duc Thuan

* Keá
Keát noá
noái ngoaø
ngoaøi (Outer Joins) * Töï keá
keát noá
noái (Self Joins)
SELECT e.ename, d.deptno, d.name EMP (WORKER) EMP (MANAGER)

From emp e, dept d


EMPNO ENAME MGR EMPNO ENAME
Where e. deptno(+) = d.deptno; ------------- ------------ -------------- ------------- ------------
Order by e.deptno 7839 KING
7698 BLAKE 7839 7839 KING
7698 CLARK 7839 7839 KING
ENAME DEPTNO DNAME 7566 JONES 7839 7839 KING
7644 MARTIN 7698 7698 BLAKE
-------------------------------------------------------- 7499 ALLEN 7698 7698 BLAKE
KING 10 ACCOUNTING
CLARK 10 ACCOUNTING
………..
40 OPERATIONS
MGR trong baûng WORKER baèng EMPNO trong baûng MANAGER

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Töï keá
keát noá
noái (Self Joins) * Caù
Caùc toaù
toaùn töû taä
taäp hôï
hôïp
SELECT worker.ename ll ’works for ‘ll TOAÙN TÖÛ TAÄP HÔÏP KEÁT QUAÛ ÑÖÔÏC TAÏO RA
manager.ename UNION Pheùp hôïp – hôïp caùc keát quaû cuûa 2
From emp worker, emp manager MINUS
caâu leänh SELECT, nhöõng haøng
truøng laép chæ hieån thò moä t haøng
Where worker.mgr = manager.emptno; UNION ALL Pheùp hôïp – töông töï pheùp hôïp
UNION
UNION,
INTERSECT ñieåm khaùc : caùc haøUNION
ng ALL
truøng laép ñöôïc hieån thò
WORKER.ENAME ll ’works for ‘ll MANAGER
INTERSECT Pheùp giao – Caùc haøng thuoäc caû 2
-------------------------------------------------------- caâu leänh SELECT
BLAKE works for KING
CLARE works for KING MINUS Pheùp tröø – Caùc haøng ñöôïc traû veà
caâu leänh SELECT thöù nhaá t khoâng
JONES works for KING xuaát hieän caâu leänh SELECT thöù
MARTIN works for BLAKE hai

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Caù
Caùc toaù
toaùn töû taä
taäp hôï
hôïp * Goä
Goäp döõ lieä
lieäu söû duï
duïng
ng haø
haøm GROUP
Ví duï : Caùc haøm GROUP ?
Select ename Caùc haøm GROUP thao taùc treân taäp caùc doøng ñeå cho ra keát quaû
From empa treân moãi nhoùm
EMP DEPTNO SAL
MINUS ------------------------------
10 2450
UNION 10 5000

INTERSECT 10
20
1300
800 MAX(SAL)
Select ename 20
20
1100
3000 Löông lôùn nhaát trong Table EMP
----------------------
5000
From emp 20
20
3000
2975
Where ename LIKE ‘S%’ ; 30 1600
30 2850
30 1250
30 950
30 1500
NgDucThuan- @2004- 2005-DHTS 30 1250 NgDucThuan- @2004- 2005-DHTS

20
Ng Duc Thuan

* Caù
Caùc haø
haøm GROUP * Söû duï
duïng
ng caù
caùc haø
haøm GROUP
AVG SELECT [COÄT,] <haøm_GROUP> (coät)
COUNT FROM <teân Table>
[WHERE <ñieàu kieän> ]
MAX
[GROUP BY <coät>]
MIN
[ORDER BY <coät>]
STDDEV
SUM
VARIANCE

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Söû duï
duïng
ng haø
haøm
* Söû duï
duïng
ng haø
haøm COUNT
AVG,SUM,MIN,MAX
Coù theå söû duïng - haøm AVG vaø SUM cho döõ lieäu soá l Haøm COUNT(*) traû veà soá löôïng doøng trong 1
- haøm MIN, MAX cho kieåu döõ lieäu baát kyø Table (thoaû ñieàu kieän chæ ra)
SELECT AVG[SAL] , MAX(SAL), MIN(SAL), SUM(SAL) l Haøm COUNT(<bthöùc>) traû veà soá löôïng doøng
FROM emp khoâng roãng (thoaû ñieàu kieän chæ ra)
WHERE Job LIKE ‘SALES%’;

SELECT COUNT(*), COUNT(sal)


FROM emp
AVG (SAL) MAX(SAL) MIN(SAL) SUM(SAL) WHERE deptno = 30;
-------------- -------------- ------------ -------------
1400 1600 1250 5600

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Haø
Haøm GROUP vaø
vaø giaù
giaù trò NULL * Taï
Taïo nhoù
nhoùm döõ lieä
lieäu
* Caùc haøm GROUP boû qua giaù trò NULL trong coät EMP DEPTNO
--------------
SAL
---------

Söû duïng haøm chuyeån ñoåi giaù trò NULL : NVL ñeå
10 2450
10 5000 2916.6667

caùc haøm group bao goàm caùc giaù trò NULL


10 1300
20 800
DEPTNO AVG(SAL)
20 1100
Möùc löông trong ---------- ------------
20 3000
EMP 10 2916.6667
20 3000
SELECT AVG(NVL(SAL)) 20 2975
2175 Theo moãi 20 2175
30 1600
Phaân xöôûng 30 1566.6667
FROM emp 30 2850
30 1250
WHERE Job LIKE ‘SALES%’; 30 950
30 1500
1566.6667
30 1250

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

21
Ng Duc Thuan

Taï
Taïo nhoù
nhoùm döõ lieä
lieäu: Taï
Taïo nhoù
nhoùm döõ lieä
lieäu:
Meä
Meänh
nh ñeà GROUP BY Meä
Meänh
nh ñeà GROUP BY
SELECT [COÄT,] <haøm_GROUP> (coät) * Taát caû caùc coät trong danh saùch SELECT maø
FROM <teân Table> khoâng chöùa trong caùc haøm goäp nhoùm, thì phaûi ôû
[WHERE <ñieàu kieän> ]
trong meänh ñeà GROUP BY
SELECT deptno, AVG(sal)
[GROUP BY <bieåu thöùc>] FROM emp
[ORDER BY <coät>] GROUP BY deptno;
Chia caùc haøng trong baûng thaønh caùc nhoùm nhoû baèng DEPTNO AVG(SAL)
caùch söû duïng meänh ñeà GROUP BY ---------- ------------------
10 2916.6667
20 2175
30 1566.6667
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Goä
Goäp nhoù
nhoùm nhieà
nhieàu hôn 1 coä
coät Goä
Goäp nhoù
nhoùm nhieà
nhieàu hôn 1 coä
coät
EMP SELECT deptno, job, sum(sal)
DEPTNO JOB SAL DEPTNO JOB SAL FROM emp
------------ ---------------- --------- ------------ ---------------- ---------
10 MANAGER 2450 10 CLERK 1300 GROUP BY deptno,job;
10 PRESIDENT 5000 10 MANAGER 2450 l DEPTNO JOB SUM(SAL)
10 CLERK 1300 10 PRESIDENT 5000 l ------------ ---------------- ---------
20 CLERK 800 20 ANALYST 6000 l 10 CLERK 1300
20 CLERK 1100 20 CLERK 1900 l 10 MANAGER 2450
20 ANALYST 3000 20 MANAGER 2975 10 PRESIDENT 5000
Toång löông theo l
20 ANALYST 3000 Moãi coân g vieäc 30 CLERK 950 l 20 ANALYST 6000
20 MANAGER 2975 Nhoùm theo 30 MANAGER 2850 l 20 CLERK 1900
30 SALESMAN 1600 Phaân xöôûn g 30 SALESMAN 5600
l 20 MANAGER 2975
30 MANAGER 2850
l 30 CLERK 950
30 SALESMAN 1250
l 30 MANAGER 2850
30 CLERK 950
l 30 SALESMAN 5600
30 SALESMAN 1500
l
30 SALESMAN 1250

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Truy vaá
vaán khoâng hôï
hôïp leä
leä söû duï
duïng
ng caù
caùc Truy vaá
vaán khoâng hôï
hôïp leä
leä söû duï
duïng
ng caù
caùc
haø
haøm GROUP haø
haøm GROUP
Baát kyø coät hay bieåu thöùc trong danh saùch SELECT maø Khoâng theå söû duïng meänh ñeà WHERE ñeå haïn cheá
khoâng ôû trong haøm goäp döõ lieäu thì phaûi ôû trong meänh ñeà caùc nhoùm
GROUP BY
c heá
ñ eå ha ïn
SELECT deptno, COUNT(ename) SELECT deptno, AVG(sal) E RE
UP BY
clause à WH
FROM emp; g in th
e GRO FROM emp e ä nh ñ e ùm
missin m o
uøng ca ùc nh
n
Colum
WHERE AVG(sal) > 2000 eå d
âng th
Kh o
GROUP BY deptno;
SELECT deptno, COUNT(ename)
*
ERROR at line 1: WHERE AVG(sal) > 2000
ORA-00937: not a single-group group function *
ERROR at line 3:
ORA-00934: group function is not allowed here

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

22
Ng Duc Thuan

Haï
Haïn cheá
cheá caù
caùc keá
keát quaû
quaû nhoù
nhoùm Haï
Haïn cheá
cheá caù
caùc keákeát quaû
quaû nhoù
nhoùm:
meä
änh
menh ñ e à HAVING
EMP DEPTNO SAL
-------------- ---------
10 2450 Söû duïng meänh ñeà HAVING ñeå haïn cheá caùc
nhoùm:
10 5000 2916.6667
10 1300
20 800
20 1100
Möùc löông toái ña
DEPTNO MAX(SAL)
---------- ------------ Caùc doøng ñöôïc goäp nhoùm
20 3000
10 5000
Ñöôïc söû duïng caùc haøm GROUP
20 3000
Trong moãi phaân
2175 Xöôûng lôùn hôn 20 3000
20 2975
2900
30
30
1600
2850 Caùc nhoùm thoaû meänh ñeà HAVING ñöôïc
30
30
1250
950
theå hieän
30 1500
1566.6667
30 1250

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Söû duï
duïng
ng meä
meänh
nh ñeà HAVING Söû duï
duïng
ng meä
meänh
nh ñeà HAVING
SELECT job, SUM(sal) PAYROLL
SELECT deptno, MAX(sal) FROM emp
FROM emp WHERE job NOT LIKE ‘SALES%’
GROUP BY deptno GROUP BY job
HAVING MAX(sal) > 2000; HAVING SUM(sal) > 5000
ORDER BY SUM(sal);
DEPTNO MAX(SAL)
JOB PAYROLL
------------ --------------- ------------ ---------------
10 5000 ANALYST 6000
20 3000 MANAGER 8275

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Caù
Caùc haø
haøm GROUP loà
loàng
ng nhau Truy vaá
vaán con (Subqueries
(Subqueries))
Söû duïng truy vaán con ñeå giaûi quyeát baøi toaùn
‘ Ai coù löông lôùn hôn löông Jone ?’
Hieån thò löông trung bình lôùn nhaát
Truy vaán chính
SELECT MAX(AVG(sal))
FROM emp ‘Nhöõng ngöôøi naøo coù löông lôùn hôn löông Jone ?’

GROUP BY deptno Truy vaán con

MAX(AVG(sal)) Löông jone laø bao nhieâu?


-------------------
2916.6667
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

23
Ng Duc Thuan

Truy vaá
vaán con (Subqueries
(Subqueries)) * Söû duï
duïng
ng truy vaá
vaán con
SELECT <danh saùch coät>
FROM <teân Table>
SELECT ename
WHERE <bieåu thöùc ñieàu kieän> <toaùn töû> FROM emp
(SELECT <danh saùch coät> WHERE sal >
FROM <teân Table>);
(SELECT sal
FROM emp
*Truy vaán con ñöôïc thöïc hieän tröôùc truy vaán WHERE empno = 7566);
chính ENAME
----------------
*Keát quaû cuûa truy vaán con ñöôï c söû duïng cho KING
FORD
truy vaán chính (truy vaán ngoaøi) SCOTT

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Moä
Moät soá
soá höôùng
ng daãn
Caù
Caùc kieå
kieåu truy vaá
vaán con
söû duï
duïng
ng truy vaá
vaán con
Truy vaán con doøng ñôn
*Truy vaán con ñaët trong daáu ngoaëc ñôn
Truy vaán

*Ñaët truy vaán con beân phaûi toaùn töû so saùnh Chính Traû veà
CLERK
Truy vaán con

*Khoâng söû duïng meänh ñeà ORDER BY trong


Truy vaán con nhieàu doøng
truy vaán con Truy vaán
Traû veà
*Söû duïng caùc toaùn töû doøng ñôn vôùi caùc truy
Chính
CLERK
Truy vaán con MANAGER

vaán con doøng ñôn


Truy vaán con nhieàu coät
*Söû duïng caùc toaùn töû nhieàu doøng vôùi caùc Truy vaán

truy vaán con nhieàu doøng Chính Traû veà CLERK


MANAGER
7900
7698
Truy vaán con

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Thöï
Thöïc hieä
hieän truy vaá
vaán con doø
doøng
ng ñôn
Truy vaá
vaán con doø
doøng
ng ñôn SELECT ename, job
FROM emp
WHERE job =
* Traû veà chæ 1 doøng (SELECT job
FROM emp
* Söû duïng caùc toaùn töû so saùnh doøng ñôn
WHERE empno = 7566)
AND sal >
Toaùn töû YÙ nghóa
(SELECT sal
= Baèng
FROM emp
> Lôùn hôn WHERE empno = 7876);
>= Lôùn hôn hoaëc baèng
< Nhôû hôn ENAME JOB
--------------- ----------------
<= Nhoû hôn hoaëc baèng
MILLER CLERK
<> Khaùc

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

24
Ng Duc Thuan

Söû duï
duïng
ng haø
haøm GROUP trong
Meä
Meänh
nh ñeà HAVING vôù
vôùi truy vaá
vaán con
truy vaá
vaán con
SELECT ename, job,sal
* Oracle server thöïc hieän truy vaán con ñaàu tieân
FROM emp * Oracle server traû veà keát quaû cho meänh ñeà
WHERE sal = HAVING cuûa truy vaán chính
(SELECT Min(sal) SELECT deptno, Min(sal)
FROM emp); FROM emp
GROUP BY deptno
ENAME JOB SAL
--------------- ---------------- ------------
HAVING MIN(sal) >
MILLER CLERK 800 (SELECT Min(sal)
FROM emp
WHERE deptno = 20);

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Caâu leä
leänh
nh naø
naøy sai gì ?
SELECT empno, ename Caâu leä
leänh
nh naø
naøy seõ laø
laøm vieä
vieäc gì ?
FROM emp n

ùi
øn g
ñô do
WHERE sal =û doøng n nhieàu SELECT ename, job
tö co
To
aùn
oøn (SELECT Min(sal)
g FROM emp
án d
y
va
FROM emp WHERE job =
tru

GROUP BY deptno ); (SELECT job


FROM emp
ERROR: WHERE ename = ‘SMYTHE’);
ORA-01427: single-row subquery returns more than one row
ù trò
gia
veà
g traû
oân
co n kh
vaán
Truy
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Truy vaá
vaán con nhieà
nhieàu doø
doøng
ng Söû duï
duïng
ng toaù
toaùn töû ANY trong
truy vaá
vaán con nhieà
nhieàu doø
doøng
ng
* Traû veà nhieàu hôn 1 doøng
SELECT empno,ename, job
* Söû duïng caùc toaùn töû so saùnh nhieàu doøng FROM emp
WHERE sal < ANY
Toaùn töû YÙ nghóa
(SELECT sal
IN Baèng baát kyø phaàn töû naøo cuûa danh saùch FROM emp
WHERE job = ‘CLERK’)
ANY So saùnh giaù trò vôùi moãi giaù trò traû veà cuûa truy
AND job <> ‘CLERK’;
vaán con
ALL So saùnh giaù trò vôùi taát caû giaù trò traû veà cuûa truy EMPNO ENAME JOB
vaán con --------------- -------------- ------------------
7654 MARTIN SALESMAN
7521 WARD SALESMAN

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

25
Ng Duc Thuan

Söû duï
duïng
ng toaù
toaùn töû ALL trong
truy vaá
vaán con nhieà
nhieàu doø
doøng
ng * truy vaá
vaán con nhieà
nhieàu coä
coät
SELECT empno,ename, job
FROM emp
SELECT ordid, prodid, qty
WHERE sal > ALL
(SELECT AVG(sal) FROM item
FROM emp WHERE (prodid, qty) IN
GROUP BY deptno); (SELECT prodid, qty
EMPNO ENAME JOB FROM item
--------------- -------------- ------------------
7839 KING PRESIDENT WHERE ordid = 605)
7566
7902
JONEÙ
FORD
MANAGER
ANALYST
AND ordid <> 605;
7788 SCOTT ANALYST

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Caù
Caùc giaù
giaù trò NULL trong * Toaù
Toaùn töû EXISTS
truy vaá
vaán nhieà
nhieàu coä
coät l Traû veà giaù trò true neáu Subquery coù keát quaû
SELECT employee.ename khaùc roãng, false trong tröôøng hôïp ngöôïc laïi.
FROM emp employee Ví duï:
WHERE employee.empno NOT IN SELECT distinct e.dept From emp e
(SELECT manager.mgr WHERE EXISTS
FROM em manager);
(SELECT i.empd From invoice i
WHERE (i.empid = e.empid) AND
(i.pay_date > SYSDATE – 365));
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Söû duï
duïng
ng 1 truy vaá
vaán con trong
meä
meänh
nh ñeà FROM
SELECT a.ename, a.sal, a.deptno, b.salavg
FROM emp a, (SELECT deptno,
AVG(sal) salavg
FROM emp
GROUP BY deptno) b Keá
Keát xuaá
xuaát döõ lieä
lieäu deã ñoïc vôù
vôùi
WHERE a.deptno = b.deptno SQL*PLUS
AND a.sal > b.salavg;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

26
Ng Duc Thuan

* Baù
Baùo caù
caùo töông giao * Caù
Caùc bieá
bieán thay theá
theá
Duøng caùc bieán thay theá ñeå löu caùc giaù trò taïm thôøi
- Kí töï ñôn &
Toâi muoán ñöa caùc giaù
trò cho truy vaán taïi moãi
laàn chaïy
…. Sal = ?
….deptno = ?
- Kí hieäu keùp &&
- Caùc caâu leänh DEFINE vaø ACCEPT
…ename = ?

Chuyeån ñoåi caùc giaù trò bieán giöõa caùc caâu leänh
SQL
Töï ñoäng thay ñoåi tieâu ñeà (header, footer)
USER

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Söû duï
duïng
ng bieá
bieán thay theá
theá & * Söû duï
duïng
ng leä
leänh
nh SET VERIFY
Duøng 1 bieán coù tieàn toá laø 1 kyù töï & ñeå nhaéc ngöôøi Hieån thò vaên baûn chuyeån ñoåi cuûa 1 caâu leänh tröôùc
söû duïng cung caáp 1 giaù trò vaø sau khi SQL*PLUS thay theá giaù trò cho caùc
bieán
SELECT empno, ename, sal, deptno SET VERIFY ON
FROM emp SELECT empno, ename, sal, deptno
WHERE empno = &employee_num FROM emp
WHERE empno = &employee_num;
Enter value for employee_num : 7369
EMPNOENAME SAL DEPTNO Enter value for employee_num : 7369
----------- ------------------- --------------- ----------------- Old 3: WHERE empno = &employee_num
7369 SMITH 800 20 New 3: WHERE empno = 7369

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Caù
Caùc giaù
giaù trò kyù
kyù töï vaø
vaø ngaø
ngaøy * Chæ
Chæ ñònh teân coä
coät, bieå
bieåu thöù
thöùc vaø
vaø vaên baû
baûn
vôù
vôùi caù
caùc bieá
bieán thay theá
theá taï
taïi moãi laà
laàn chaï
chaïy
Söû duïng daáu nhaùy cho caùc giaù trò ngaøy vaø kyù töï
SELECT ename, deptno, sal*12 Söû duïng caùc bieán thay theá ñeå boå sung cho:
FROM emp Ñieàu kieän meänh ñeà WHERE
WHERE job = ‘&job_title’;
Meänh ñeà ORDER BY
Enter value for job_title : ANALYST Bieåu thöùc coät
ENAME DEPTNO SAL*12
----------- ------------------- ---------------
Teân Table
SCOTT 20 36000 Döõ lieäu vaøo caâu leänh statement
FORD 20 36000

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

27
Ng Duc Thuan

* Chæ
Chæ ñònh teân coä
coät, bieå
bieåu thöù
thöùc vaø
vaø vaên baû
baûn
taï
taïi moãi laà
laàn chaï
chaïy * Söû duï
duïng
ng bieá
bieán thay theá
theá &&
SELECT empno, ename, job, &column_name Duøng 2 kyù hieäu &, neáu muoán söû duïng laïi giaù trò
FROM emp bieán ñaõ coù maø khoâng hieån thò thoâng baùo
WHERE &condition SELECT empno, ename,job, &&column_name
ORDER BY &order_column; FROM emp
ORDER BY &column_name; /* teân coät khoâng ñeå trong nhaùy*/
Enter value for column_name : SAL
Enter value for column_name : deptno
Enter value for condition: SAL >= 3000
EMPNO ENAME JOB DEPTNO
Enter value for order_column : ename ----------- ------------------- --------------- -----------------
….. 7369 KING PRESIDENT 10
…….

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Khai baù
baùo bieá
bieán cuû
cuûa ngö
ngöôøi söû duï
duïng
ng * Caâu leä
leänh
nh ACCEPT
* Baïn coù theå ñònh nghóa laïi caùc bieán söû duïng 1 *Taïo laäp 1 thoâng baùo cuûa ngöôø i söû duïng khi nhaän
trong 2 caâu leänh SQL*PLUS: giaù trò cuûa ngöôøi söû duïng nhaäp töø baøn phím
* Ñònh nghóa töôøng minh 1 bieá n kieåu soá hay ngaøy
- DEFINE: Taïo 1 bieán ngöôøi söû duïng kieåu kyù töï * Laøm aån giaù trò nhaäp vaøo vôùi lyù do baûo maät
- ACCEPT : Ñoïc giaù trò ngöôøi söû duïng ñöa vaøo
vaø löu vaøo 1 bieán.
ACCEPT <bieán> [kieåu döõ lieäu] [format <khuoân daïng>]
Neáu baïn caàn ñònh nghóa laïi 1 bieán maø coù chöùa kyù [PROMPT <vaên baûn>] [HIDE]
töï traéng, baïn phaûi ñoùng giaù trò trong daáu nhaùy
ñôn khi söû duïng caâu leänh DEFINE

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Söû duï
duïng
ng caâu leä
leänh
nh ACCEPT * Caâu leä
leänh
nh DEFINE vaø
vaø UNDEFINE
ACCEPT dept PROMPT ‘Provide the department name:’ * Giaù trò bieán seõ toàn taïi cho ñeán khi hoaëc:
SELECT * - Duøng leänh UNDEFINE ñeå xoaù noù
FROM dept
- Thoaùt SQL*Plus
WHERE dname = UPPER (‘&dept’);
*Baïn coù theå xem nhöõng thay ñoåi cuûa baïn ñoái vôùi
Provide the department name: Sales leänh DEFINE
DEPTNO DNAME LOC *Ñeå ñònh nghóa caùc bieán cho moïi laàn thöïc hieän, tu
----------- ------------------- --------------- söûa file login.sql (caùc bieán seõ ñöôïc taïo laäp moãi
10 SALES CHICAGO
laàn khôûi ñaàu)
…….

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

28
Ng Duc Thuan

Thieá
Thieát laä
laäp moâi trö
tröôøng
ng
* Söû duï
duïng
ng leä
leänh
nh DEFINE SQL*PLUS
* Taïo 1 bieán ñeå chöùa teân phaân xöôûng
*Söû duïng caùc leänh SET ñeå ñieàu khieån caùc phieân
DEFINE deptname = sales
DEFINE deptname SET <teân bieán heä thoáng> <giaù trò>
*Xem nhöõng thieát laäp baèng caùch söû duïng leänh
DEFINE DEPTNAME = “sales” (CHAR) SHOW
* Söû duïng caùc bieán nhö baát kyø caùc bieán khaùc Ví duï:
SELECT * SQL>SET ECHO ON
FROM dept SQL>SHOW ECHO
WHERE dname = UPPER (‘&deptname’); Echo ON

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Caù
Caùc bieá
bieán leä
leänh
nh SET * Löu caù
caùc thieá
thieát laä
laäp vaø
vaøo File
login.sql
*ARRAYSIZE {20 l n}
*COLSEP {_ l <vaên baûn> }
*File login.sql chöùa caùc thieát laäp chuaån vaø
*FEEDBACK {6 l n l OFF l ON } caùc leänh khaùc cæa SQL*Plus, ñöôïc caøi ñaët
*HEADING {OFF l ON} saún taïi moãi laàn login.
*LINESIZE {80 l n}
*LONG {80 l n}
Coù theå tu söûa login.sql ñeå chöùa caùc leänh
*PAGESIZE {24}
thieát laäp (SET) môùi.
*PAUSE {ON l OFF l<Vaên baûn>}
*TERMOUT {OFF l ON}

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Leä
Leänh
nh COLUMN
* Caù
Caùc leä
leänh
nh khuoân daï
daïng
ng SQL*PLUS
Ñieàu khieån hieån thò 1 coät
COL[UMN] [<coät> | <bí danh> [muïc choïn]]
*COLUMN [ <giaù trò choïn> ] CLE[AR] : Xoaù taát caû caùc khuoân daïng coät
*TTITLE [<Vaên baûn> | OFF | ON ] FOR[MAT] <khuoân daïng>: Thay ñoåi hieån
*BTITLE [<Vaên baûn> | OFF | ON ] thò coät söû duïng moâ hình khuoân daïng
HEA[DING] <vaên baûn> : Thieát laäp tieâu ñeà
*BREAK [ON <phaàn töû baùo caùo>] coät
JUS[TIFY] {leà}: Caên leà tieàu ñeà coät : traùi,
giöõõa, phaûi

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

29
Ng Duc Thuan

* Caù
Caùc moâ hình khuoân daï
daïng
ng
* Söû duï
duïng
ng leä
leänh
nh COLUMN COLUMN
Phaàn töû Moâ taû Ví duï Keát quaû
*Taïo laäp caùc tieâu ñeà coät An Thieát laäp hieån thò ñoä N/A N/A
COLUMN ename HEADING ‘Employee |Name’ FORMAT A15 roäng laø n
COLUMN sal JUSTIFY LEFT FORMAT $99,990.00 9 Chaën caùc kyù soá zero 999999 1234
ñôn
COLUMN mgr FORMAT 999999999 NULL ‘ No manager’
0 Cho pheùp baét ñaàu laø 0 099999 01234
* Hieån thò thieát laäp hieän haønh cuûa coät ENAME $ Daáu $ ñoäng $9999 $1234
COLUMN ename
L Tieàn teä ñòa phöông L9999 L1234
* Xoaù thieát laäp hieän haønh cuûa coät ENAME . Vò trí daáu chaám thaäp 9999.99 1234.00
COLUMN ename CLEAR phaân
, Phaân caùch haøng ngaøn 9,999 1,234

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Söû duï
duïng
ng leä
leänh
nh BREAK * Söû duï
duïng
ng caù
caùc leä
leänh
nh TTITLE vaø
vaø BTITLE
*Ngaên caùc doøng truøng laép vaø phaân lôùp doøng *Hieån thò header vaø Footer
TTI[TLE] [<vaên baûn> | ON | OFF]

*Ngaên söï truøng laép


SQL> BREAK ON ename ON job *Thieát laäp header baùo caùo
TTITLE ‘Salary | Report’

*Phaân lôùp doøng taïi caùc giaù trò phaân caùch


SQL> BREAK ON ename SKIP 4 ON job SKIP 2 *Thieát laäp footer baùo caùo
BTITLE ‘Confidential’

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

*Taï
Taïo laä
laäp 1 File kòch baû
baûn ñeå chaï
chaïy
* Baù
Baùo caù
caùo maãu
1 baù
baùo caù
caùo Fri Oct 24 Page 1
Employee
1. Taïo 1 leänh SQL SELECT Report
Job
2. Löu leänh SELECT vaøo 1 File kòch baûn Category Employee Salary
---------------------- ------------------------- ---------------------------
3. Naïp File kòch baûn vaøo 1 trình soaïn thaûo CLERK ADAMS $1,100.00
JAMES $950.00
4. Theâm caùc leänh ñònh daïng tröôùc caâu leänh SELECT MILLER $1,300.00
SMITH $800.00
5. Xem xeùt caùc kyù töï keát thuùc di theo sau leänh SELECT MANAGER BLAKE $2,850.00
CLARK $2,450.00
6. Xoaù caùc caâu leänh ñònh daïng sau caâu leänh SELECT JONES $2,975.00
SALESMAN ALLEN $1,600.00
7. Löu File kòch baûn MARTIN $1,250.00
TURNNER $1,500.00
8. Chaïy File kòch baûn : START <teân file> WARD $1,250.00

Confidential

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

30
Ng Duc Thuan

Ñöôøng ñi khoù, khoâng phaûi vì ngaên soâng caùch nuùi


Nhöng khoù vì loøng ngöôøi ngaïi nuùi e soâng…
Taï
Taïo laä
laäp khung nhì
nhìn
(Creating Views)

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Muï
Muïc tieâu *Caù
Caùc ñoái töôïng
ng Cô sôû
sôû döõ lieä
lieäu
Sau khi hoaøn thaønh baøi hoïc, baïn coù theå thöïc hieän
ñöôïc caùc ñieàu sau: Ñoái töôïng YÙ nghóa
*Moâ taû 1 khung nhìn Table (Baûng) Ñôn vò cô sôû cuûa söï löu tröõ; bao goàm
caùc doøng, coät
*Taïo 1 khung nhìn View (Khung nhìn) Hieån thò logic caùc taäp con döõ lieäu töø
*Söûa ñoåi ñònh nghóa 1 khung nhìn 1 hay nhieàu Table
Sequence (Trình töï) Sinh ra caùc giaù trò cuûa khoaù chính
*Cheøn, tu söûa, vaø xoaù döõ lieäu töø 1 khung nhìn
*Xoaù 1 khung nhìn Index (Chæ muïc) Naâng cao hieäu naêng 1 soá truy vaán

*Moâ taû 1 doøng beân trong khung nhìn Synonym ( Bí danh) Gaùn teân cho 1 ñoá i töôïng

*Thöïc hieän 1 phaân tích “Top-N”


NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Khung nhì
nhìn (view) laø
laø gì ? * Khung nhì
nhìn ñôn giaû
giaûn vaø
vaø khung
EMP Table
nhì
nhìn phöù
phöùc hôï
hôïp
EMPNO ENAME MGR HIRE DATE SAL COMM

7839 KING MANAGER 12/05/80 1200 1100 Ñaëc tröng Khung nhìn ñôn giaûn Khung nhìn phöùc hôïp

EMPVU10 View
Soá löôïng Table Moät Moät hay nhieàu
EMPNO ENAME JOB

7839 KING PRESIDENT Chöùa Haøm Khoâng Coù


7782 CLARK MANAGER

7934 MILLER CLERK Chöùa nhoùm döõ lieäu Khoâng Coù

DML thoâng qua khung Coù Khoâng


nhìn

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

31
Ng Duc Thuan

* Taï
Taïo laä
laäp moä
moät khung nhì
nhìn * Taï
Taïo laä
laäp moä
moät khung nhì
nhìn
- Coù theå gaén 1 truy vaán con trong caâu leänh CREATE l Taïo laäp 1 khung nhìn, EMPVU10 chöùa chi tieát caùc nhaân
VIEW vieân trong phaân xöôûng 10
CREATE [OR REPLACE] [FORCE ¦NOFORCE] VIEW view SQL> CREATE VIEW empvu10
[[ alias [, alias¦…]] AS SELECT empno, ename, job
AS subquery FROM emp
[WITH CHECK OPTION [CONSTRAINT constraint] ] WHERE deptno = 10;
[WITH READ ONLY];

- Truy vaán con coù theå cuù phaùp SELECT phöùc l Moâ taû caáu truùc cuûa khung nhìn bôûi caâu leänh DESCRIBE
hôïp cuûa SQL*Plus
- Truy vaán con khoâng theå chöùa 1 meänh ñeà
ORDER BY SQL> DESCRIBE empvu10

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Taï
Taïo laä
laäp moä
moät khung nhì
nhìn * Ruù
Ruùt trí
trích döõ lieä
lieäu moä
moät khung nhì
nhìn
SQL> SELECT *
l Taïo laäp 1 khung nhìn söû duïng bí danh coät trong FROM salvu30;
truy vaán con
SQL> CREATE VIEW salvu10
AS SELECT empno EMPLOYEE_NUMBER, ename NAME, EMPLOYEE_NUMBER NAME SALARY
Sal SALARY -----------------------------------------------------------------------------------------
FROM emp 7698 BLAKE 2850
7654 MARTIN 1250
WHERE deptno = 10; 7499 ALLEN 1600
7844 TURNER 1500
7900 JAMES 950
7521 WARD 1250
l Choïn caùc coät töø khung nhìn naøy bôûi caùch ñöa ra
teân bí danh

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Truy vaá
vaán moä
moät khung nhì
nhìn * Hieä
Hieäu chæ
chænh moä
moät khung nhì
nhìn
l Hieäu chænh khung nhìn EMPVU10 baèng caùch söû
duïng CREATE OR REPLACE VIEW. Theâm bí danh
cho moãi teân coät.
SQL*Plus
USER_VIEWS
EMPVU10
SQL> CREATE OR REPLACE VIEW empvu10
SELECT * (employee_number, employee_name, job_title)
SELECT empno, ename,job
FROM empvu10; AS SELECT empno, ename, job
FROM emp
WHERE deptno = 10 FROM emp
WHERE deptno = 10;
7839 KING PRESIDENT

l Caùc bí danh coät trong meänh ñeà CREATE VIEW


7782 CLARK MANAGER EMP
7934 MILLER CLERK

ñöôïc lieät keâ cuøng thöù töï trong truy vaán con

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

32
Ng Duc Thuan

* Taï * Caù
Caùc qui taé
taéc ñeå thöï
thöïc hieä
hien
ä caù
caùc thao
Taïo laä
laäp moä
moät khung nhì
nhìn phöù
phöùc hôï
hôïp
taù
taùc DML treân moä
moät khung nhì
nhìn
l Taïo laäp 1 khung nhìn phöùc hôïp chöùa caùc haøm
goäp nhoùm ñeå hieån thò caùc giaù trò töø 2 table l Baïn coù theå thöïc hieän caùc thao taùc treân caùc
khung nhìn ñôn giaûn
SQL> CREATE VIEW dept_sum_vu
l Baïn khoâng theå xoaù 1 doøng neáu khung nhìn
AS SELECT
(name, minsal, maxsal, avgsal)
d.dname, MIN(e.sal), MAX(e.sal), AVG(e.sal)
chöùa:
FROM emp e, dept d – Haøm goäp nhoùm
WHERE e.deptno = d.deptno
GROUP BY d.dname – Moät meänh ñeà GROUP BY
– Töø khoaù DISTINCT
– Töø khoaù ROWNUM

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Caù
Caùc qui taé
taéc ñeå thöï
thöïc hieä
hien
ä caù
caùc thao *Söû duï
duïng
ng meä
meänh
nh ñeà WITH CHECK
taù
taùc DML treân moä
moät khung nhì
nhìn OPTION
*Baïn khoâng theå hieäu chænh döõ lieäu neáu khung nhìn l Baïn coù theå ñaûm baûo raèng DML treân khung nhìn naèm
chöùa: trong mieàn khung nhìn baèng caùch söû duïng meänh ñeà
– Baát kyø nhöõng ghi chuù trong Slide tröôùc WITH CHECK OPTION
– Caùc coät ñöôïc ñònh nghóa baèng caùc bieåu thöùc SQL> CREATE OR REPLACE VIEW empvu20
AS SELECT *
– Coät giaû ROWNUM FROM emp
WHERE deptno = 20
*Baïn khoâng theå theâm döõ lieäu neáu : WITH CHECK OPTION CONSTRAINT empvu20_chk;
Khung nhìn chöùa baát kyø nhöõng gì ñaõ neâu treân hoaëc
Slide tröôùc ñoù Baát kyø coá gaéng naøo ñeå thay ñoåi soá cuûa phaân xöôûng cuûa
Coù caùc coät NOT NULL trong caùc Table cô sôû maø baát kyø doøng naøo trong khung nhìn, bôûi noù seõ maâu thuaãn
khoâng ñöôïc choïn bôûi khung nhìn vôùi raøng buoäc WITH CHECK OPTION
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Töø choá
choái caù
cacù thao taù
taùc DML
* Xoaù
Xoaù 1 khung nhì
nhìn
l Baïncoù theå ñaûm baûo raèng khoâng coù thao taùc
DML xaûy ra baèng caùch theâm vaøo WITH READ Xoaù 1 khung nhìn khoâng laøm maát döõ lieäu bôûi
ONLY vaøo ñòng nghóa khung nhìn vì khung nhìn laø ñöôïc döïa treân cô sôû caùc
SQL> CREATE OR REPLACE VIEW empvu10 Table trong CSDL
(employee_number, employee_name, job_title)
AS SELECT empno, ename, job
FROM emp
WHERE deptno = 10
DROP VIEW < Teân khung nhìn>
WITH READ ONLY;

l Moïi coá gaéng thöïc hieän 1 DML treân baát kyø doøng
naøo trong khung nhìn seõ gaây loãi treân Oracle SQL> DROP VIEW empvu10;

SERVER
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

33
Ng Duc Thuan

* Caù
Caùc doø
doøng
ng trong khung nhì
nhìn
* Phaân tích “ Top –N”
l Moät doøng khung nhìn laø 1 truy vaán con vôùi 1 bí
danh ( quan heä vôùi teân) maø baïn söû duïng trong caâu l Caùc truy vaán Top-N yeâu caàu n giaù trò lôùn
leänh SQL. nhaát hay nhoû nhaát cuûa 1 coät
l Moät doøng khung nhìn laø töông öùng vôùi vieäc söû – Möôøi saûn phaåm baùn chaïy nhaát laø gì?
duïng 1 teân truy vaán con trong meänh ñeà FROM – Möôøi saûn phaåm baùn eá nhaát laø gì?
cuûa truy vaán chính.
l Moät doøng khung nhìn khoâng phaûi laø 1 löôïc ñoà Caû hai taäp caùc giaù trò lôùn nhaát vaø nhoû nhaát laø caùc
truy vaán TOP-N

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Thöï
Thöïc hieä
hieän Phaân tích “ Top –N”
l Caáu truùc möùc cao cuûa 1 truy vaán phaân tích Top-
N laø :

SQL> SELECT [column_list], ROWNUM


FROM [SELECT (colum_list] FROM table
ORDER BY Top-N_column]
WHERE ROWNUM <= N

SQL> SELECT name, sal ROWNUM


Nhöõng ñoái töôïng
FROM (SELECT ename, sal FROM emp
ORDER BY sal DESC) cô sôû döõ lieäu khaùc
WHERE ROWNUM <= 3 (Other Databases Objects)

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Caù
Caùc ñoái töôïng
ng * Caù
Caùc ñoái töôïng
ng CSDL
Sau khi hoaøn taát baøi hoïc naøy, baïn coù theå thöïc
Ñoái töôïng YÙ nghóa
hieän:
Table Ñôn vò löu tröõ cô sôû; bao goàm caùc doøng vaø coät
Moâ taû moät soá ñoái töôïng CSDL vaø caùch thöùc söû
duïng chuùng Khung nhìn Bieåu dieãn logic taäp con döõ lieäu töø 1 hay nhieàu
(View) Table
Taïo laäp, duy trì vaø söû duïng tuaàn töï
Tuaàn töï Sinh ra caùc giaù trò khoaù chính
Taïo laäp vaø duy trì chæ muïc Chæ muïc Taêng hieäu naêng cho moät soá truy vaán
Taïo laäp nhöõng bí danh rieâng vaø chung Bí danh Gaùn teân cho moät soá ñoái töôïng

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

34
Ng Duc Thuan

* Tuaà
Tuaàn töï (Sequence) laø
laø gì ? * Caâu leä
leänh
nh CREATE SEQUENCE
l Ñònh nghóa 1 tuaàn töï ñeå töï ñoäng sinh ra caùc soá
Töï ñoäng sinh ra caùc giaù trò duy nhaát
tuaàn töï
Laø 1 ñoái töôïng chia seû
Laø kieåu ñöôïc söû duïng ñeå taïo ra giaù trò khoaù
CREATE SEQUENCE sequence
chính [ INCREMENT BY n]
[START WITH N]
Thay theá maõ öùng duïng [[MAXVALUE n ¦NOMAXVALUE]]
[[MINVALUE n ¦NOMINVALUE]]
Taêng toác ñoä cho vieäc truy xuaát caùc giaù trò tuaàn töï [[CYCLE ¦NOCYCLE]]
[[CACHE n ¦NOCACHE]];

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Taï
Taïo laä
laäp 1 tuaà
tuaàn töï * Xaù
Xaùc ñònh tuaà
tuaàn töï
Taïo laäp 1 tuaàn töï teân DEPT_DEPTNO ñöôïc duøng l Xem caùc giaù trò tuaàn töï trong Table töï ñieåndöõ
laøm khoaù chính cho Table DEPT. lieäu USER_SEQUENCES
Khoâng söû duïng muïc choïn CYCLE
SQL > SELECT sequence_name, min_value, max_value,
increment_by, last_number
SQL> CREATE SEQUENCE dept_deptno FROM user_sequences;
INCREMENT BY 1
START WITH 91
MAXVALUE 100
NOCACHE
NOCYCLE
l Coät LAST_NUMBER hieån thò soá tuaàn töï keá tieáp

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Coä
Coät giaû
giaû NEXTVAL vaø
vaø CURRVAL * Söû duï
duïng
ng 1 tuaà
tuaàn töï
l Cheøn 1 phaân xöôûng môùi teân “MARKETING” taïi
* NEXTVAL traû veà giaù trò keá tieáp San Diego
Noù traû veà 1 giaù trò duy nhaát khi ñöôïc tham khaûo SQL> INSERT INTO dept(deptno, dname, loc)
VALUES (dept_deptno, NEXTVAL,
‘MARKETING’, ‘SAN DIEGO’)

* CURRVAL chöùa giaù trò tuaàn töï hieän haønh


NEXTVAL phaûi ñöôïc löu haønh 1 giaù trò tröôùc khi Xem giaù trò hieän haønh ñoái vôùi tuaàn töï
CURRVAL chöùa 1 giaù trò DEPT_DEPTNO
SQL> SELECT dept_deptno, CURRVAL
FROM dual;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

35
Ng Duc Thuan

* Söû duï
duïng
ng 1 tuaà
tuaàn töï * Hieä
Hieäu chæ
chænh 1 tuaà
tuaàn töï
Caùc giaù trò tuaàn töï trong boä nhôù (cache) cho pheùp truy Thay ñoåi soá gia, giaù trò lôùn nhaát, giaù trò nhoû nhaát,
xuaát nhanh hôn ñeán caùc giaù trò naøy tuyø choïn chu kyø, boä ñeäm (cache)
Khoaûng troáng ngaét quaõng trong caùc giaù trò tuaàn töï coù theå
xaûy ra khi: SQL> ALTER SEQUENCE dept_deptno
INCREMENT BY 1
- Moät rollback xaûy ra
MAXVALUE 999999
- Heä thoáng bò hoûng NOCACHE
- Moät tuaàn töï ñöôïc duøng trong 1 Table khaùc NOCYCLE
Xem tuaàn töï keá tieáp, neáu noù ñöôïc taïo laäp bôûi
NOCACHE, baèng caùch truy vaán Table
USER_SEQUENCES
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Xoaù
Xoaù 1 tuaà
tuaàn töï * Chæ
Chæ muï
muïc laø
laø gì ?
l Xoaù 1 tuaàn töï töø 1 töï ñieån döõ lieäu baèng caùch söû l Laø 1 ñoái töôïng löôïc ñoà
duïng caâu leänh DROP SEQUENCE l Laø ñöôïc söû duïng bôûi Oracle Server ñeå taêng toác
l Sau khi xoaù tuaàn töï khoâng theå ñöôïc tham khaûo ñoä trích loïc caùc doøng baèng caùch söû duïng 1 con
laïi troû
l Coù theå ruùt ngaén caùc truy xuaát vaøo ra ñóa baèng
caùch söû duïng thuaät toaùn truy xuaát ñöôøng ñi toái öu
SQL> DROP SEQUENCE dept_deptno;
Sequence droppe
ñeå ñònh vò nhanh döõ lieäu
l Laø ñoäc laäp vôùi Table maø noù chæ muïc
l Ñöôïc söû duïng vaø duy trì töï ñoäng baèng Oracle
Server
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Taï
Taïo laä
laäp 1chæ
1chæ muï
muïc nhö
nhö theá
theá naø
naøo? * Taï
Taïo laä
laäp 1chæ
1chæ muï
muïc
Töï ñoäng : Moät chæ muïc ñôn (unique) ñöôïc taïo laäp l Taïo laäp 1 chæ muïc treân 1 hay nhieàu coät
töï ñoäng khi baïn ñònh nghóa 1 khoaù chính
(PRIMARY KEY) hay raøng buoäc ñôn trong 1 CREATE INDEX index
ON table (column [, column] . . . );

Table

l Naâng cao toác ñoä truy xuaát treân coät ENAME


Thuû coâng: Ngöôøi söû duïng coù theå taïo laäp 1 chæ muïc
trong table EMP
khoâng ñôn treân 1 coät ñeå naâng cao toác ñoä triuy
xuaát treân caùc doøng SQL > CREATE INDEX
ON
emp_ename_idx
emp(ename)

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

36
Ng Duc Thuan

* Khi taï
taïo laä
laäp 1 chæ
chæ muï
muïc * Khi khoâng taï
taïo laä
laäp 1 chæ
chæ muï
muïc
l Coät ñöôïc söû duïng thöôøng naè m trong meänh ñeà
WHERE hay ñieàu kieän lieân keát
l Table nhoû
l Coät chöùa döõ lieäu lôùn
l Caùc coät thöôøng ít ñöôïc söû duïng nhö laø 1 töï
l Coät chöùa 1 soá lôùn hay nhieàu giaù trò roãng ñieån döõ lieäu trong truy vaán
l Hai hay nhieàu coät thöôøng ñöôïc söû duïng vôùi nhau l Haàu heát caùc truy vaán laø thöôøng goïi nhieàu
trong meänh ñeà WHERE hay ñieàu kieän keát noái hôn 2 – 4% caùc doøng
l Moät Table lôùn vaø haàu heát caùc truy vaán thöôøng l Caùc table thöôøng hay caäp nhaät
goïi ít hôn 2- 4% caùc doøng

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Xaù
Xaùc nhaä
nhaän 1 chæ
chæ muï
muïc * Haø
Haøm chæ
chæ muï
muïc cô sôû
sôû
l Khung nhìn töø ñieån döõ lieäu USER_INDEXES l Moät haøm chæ muïc cô sôû laø 1 chæ muïc döïa treân 1
chöùa teân chæ muïc bieåu thöùc
l Khung nhìn USER_IND_COLUMNS chöùa teân l Moät bieåu thöùc chæ muïc döïa treân caùc coät cuûa
chæ muïc, teân Table, vaø teân coät Table, caùc haøm SQL, vaø caùc haøm do ngöôøi söû
duïng ñònh nghóa
SQL> SELECT ic.index_name, ic.column_name,
ic.column_position col_pos, ix.uniqueness
FROM user_indexes ix, user_ind_columns ic
WHERE ic.index_name = ix.index_name
SQL> CREATE TABLE test (col1 NUMBER);
AND ic.table_name = ‘EMP’
SQL> SELECT col1+10 FROM test;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Xoaù
Xoaù 1 chæ
chæ muï
muïc * Ñoàng
ng nghó
nghóa (Synonyms)
Xoaù 1 chæ muïc töø 1 töï ñieån döõ lieäu l Truy xuaát ñôn giaûn ñeán caùc ñoái töôïng baèng caùch
SQL> DROP INDEX index taïo ra 1 ñoàng nghóa ( moät teân khaùc cuûa 1 ñoái
töôïng)
Xoaù chæ muïc EMP_ENAME_IDX töø töï ñieån döõ l Tham khaûo ñeán 1 Table bôûi1 ngöôøi söû duïng
lieäu khaùc
l Laøm ngaén teân caùc ñoái töôïng

SQL> DROP INDEX emp_ename_idx;


CREATE [PUBLIC] SYNONYM synonym
FOR object

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

37
Ng Duc Thuan

* Thöï
Thöïc haø
haønh
nh * Taï
Taïo laä
laäp vaø
vaø xoaù
xoaù ñoàng
ng nghó
nghóa
l Taïo laäp caùc tuaàn töï l Taïo
laäp 1 teân ngaén cho khung nhìn
DEPR_SUM_VU
l Söû duïng tuaàn töï
SQL> CREATE SYNONYM d_sum
l Taïo laäp caùc chæ muïc khoâng duy nhaát FOR dept_sum_vu

l Hieån thò thoâng tin töï ñieån döõ lieäu veà tuaàn töï
vaø chæ muïc
l Xoaù 1 ñoàng nghóa
l Xoaù chæ muïc
SQL> DROP SYNONYM d_sum;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Muï
Muïc tieâu
Sau khi hoaøn thaønh baøi hoïc , baïn coù theå :

* Taïo laäp caùc ngöôøi söû duïng (USERS)


* Taïo laäp caùc chöùc naêng ñeå thieát laäp vaø duy trì deã
ÑIEÀ
IEÀU KHIEÅ
KHIEÅN QUYEÀ
QUYEÀN daøng moâ hình baûo maät
TRUY XUAÁXUAÁT * Söû duïng leänh GRANT vaø REVOKE ñeå gaùn vaø
ngö
ngöôøi söû duï
duïng
ng huyû boû quyeàn truy xuaát
(Controlling User Access)

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

ÑIEÀ
IEÀU KHIEÅ
KHIEÅN QUYEÀ
QUYEÀN * Phaân quyeà
quyeàn
TRUY XUAÁ
XUAÁT NGÖ
NGÖÔØI SÖÛ
SÖÛ DUÏ
DUÏNG
NG
*Baûo maät CSDL
Database
– Baûo maät heä thoáng
Administrator
– Baûo maät döõ lieäu

Username and password


----------------------------------------------------- * Quyeàn heä thoáng : Cho pheùp truy caäp döõ lieäu
privileges
* Quyeàn ñoùi töôïng : Xöû lyù noäi dung caùc ñoái töôïng döõ
Users lieäu
* Löôïc ñoà : Choïn caùc ñoái töôïng nhö Table, Khung nhìn
vaø tuaàn töï

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

38
Ng Duc Thuan

* Quyeà
Quyeàn heä
heä thoá
thoáng
ng * Taï
Taïo laä
laäp ngö
ngöôøi söû duï
duïng
ng
l Coù
hôn 80 quyeàn l Chæcoù ngöôøi quaûn trò heä thoáng (DBA) môùi taïo
l DBA coù quyeàn heä thoáng möùc cao:
ñöôïc ngöôøi söû duïng, duøng leänh CREATE USER
– Taïo ngöôøi söû duïng môùi CREATE USER user
– Xoaù ngöôøi söû duïng IDENTIFIED BY password;

– Xoaù Table
– Caäp nhaät Table
CREATE USER scott
IDENTIFIER BY tiger;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Quyeà
Quyeàn heä
heä thoá
thoáng
ng ngö
ngöôøi söû duï
duïng
ng * Gaù
Gaùn quyeà
quyeàn heä
heä thoá
thoáng
ng
l Khi moät ngöôøi söû duïng ñöôïc taïo laäp, DBA coù theå gaùn l Ngöôøi quaûn trò heä thoáng coù theå gaùn cho ngöôøi söû
quyeàn heä thoáng cho ngöôøi söû duïng:
duïng caùc quyeàn heä thoáng
GRANT privilege [, privilege. . .]
TO USER [, user . . .];

l Moät phaùt trieån öùng duïng coù theå coù caùc quyeàn heä thoáng: SQL> GRANT create table, cretae sequence, create view
TO scott;
– CREATE SESSION
– CREATE TABLE
– CREATE SEQUENCE
– CREATE VIEW
– CREATE PROCEDURE

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Taï
Taïo laä
laäp vaø
vaø gaù
gaùn quyeà
quyeàn cho
* Chöù
Chöùc naêng (role) laø
laø gì ? chöù
chöùc naêng (role)
SQL> CREATE ROLE manager;

user

SQL> CREATE create table, create view


Manager to manager;

Priviege
SQL> GRANT manager to BALKE, CLARK;

Khoân g coù chöùc naên g phaân chia döõ lieäu Coù chöùc naêng phaân chia döõ lieäu

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

39
Ng Duc Thuan

* Thay ñoåi Password


* Caù
Caùc quyeà
quyeàn ñoái töôïng
ng
l Ngöôøi DBA taïo laäp account vaø Password
Object Table View Sequence Procedure
l Baïn coù theå thay ñoåi password baèng caùch söû duïng Privilege

leänh ALTER USER


ALTER þ þ
DELETE þ þ
EXECUTE þ
INDEX þ
INSERT þ þ
SQL> ALTER USER scott
IDENTIFIED BY lion; REFERENCES þ
SELECT þ þ þ
UPDATE
þ þ

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Caù
Caùc quyeà
quyeàn ñoái töôïng
ng
l Quyeàn ñoái töôïng bieán ñoåi töø ñoái töôï ng ñeán ñoái töôïng
l Moät ngöôøi sôû höõu döõ lieäu coù moïi quyeàn ñoái töôïng
l Moät ngöôøi sôû höõu döõ lieäu coù theå chæ ñònh caùc quyeàn
treân caùc ñoái töôïng sôû höõu

GRANT object_priv [(column)]


ON object
TO (user | role | PUBLIC)
[WITH GRANT OPTION] PL/SQL
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Khai baùo bieán * Tieä


Tieän ích cuû
cuûa PL/SQL
l Thoâng tin veà PL/SQL l Söï tích hôïp

- PL/SQL là một mở rộng của SQL với việc thiết


kế các tính năng của các ngôn ngữ lập trình. Application

- Caùc caâu leänh truy vaán vaø xöû lyù dữ liệu ñöôïc
chứa trong mã của các đơn vị thủ tục.

Shared Oracle Server


library

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

40
Ng Duc Thuan

* Tieä
Tieän ích cuû
cuûa PL/SQL * Caá
Caáu truù
truùc khoá
khoái PL/SQL
l Caûi thieän söï thöïc thi DECLARE (Khai báo, tùy ý)
SQL
Các biến, con trỏ và các ngoại lệ khác do người
SQL
Other DBMSs
dùng định nghĩa.
Application
SQL BEGIN (bắt buộc)
SQL
- Các câu lệnh SQL.
- Các câu lệnh PL.
EXCEPTION (Ngoại lệ, tùy ý) DECLARE
SQL
IF .. THEN - Phần xử lý lỗi khi một khối xuất hiện lỗi.
ELSE Oracle with BEGIN
Application SQL PL/SQL END; (bắt buộc)
ENDIF;
SQL EXCEPTION

END;
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Caá
Caáu truù
truùc khoá
khoái PL/SQL * Caù
Caùc loaï
loaïi khoá
khoái
Khoái naëc danh Thuû tuïc Haøm
Ví dụ:
[DECLARE ] PROCEDURE <teân> FUNCTION <teân>
DECLARE (<tham soá>) IS (<tham soá>) IS

v_variable VARCHAR2(5); [< Khai baùo >;] [< Khai baùo >;]

BEGIN BEGIN BEGIN BEGIN

SELECT column_name -- Caâu leänh - Caâu leänh


-Caâu leänh
-RETURN <giaù trò>
INTO v_variable [EXCEPTION ] [EXCEPTION ] [EXCEPTION ]

FROM table_name
END; END; END;
EXCEPTION
END;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Caá
Caáu truù
truùc chö
chöông trì
trình * Söû duï
duïng
ng caù
caùc bieá
bieán
Chöùc naêng:

Chứa
Block không tên
thủ tục/hàm - Lưu trữ tạm thời dữ liệu.
DECLARE
- Xöû lyù các giá trị được lưu trữ.
BEGIN
trigger ... Thủ tục/hàm - Tái sử dụng.
ứng dụng EXCEPTION ứng dụng
... - Dễ bảo trì.
END;
trigger Thủ tục/hàm
CSDL đóng gói

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

41
Ng Duc Thuan

* Xöû lyù
lyù caù
cacù bieá
bieán trong PL/SQL * Kieå
Kieåu bieá
bieán
- Biến PL/SQL
- Khai báo và khởi tạo biến trong đoạn khai + Vô hướng.
báo. + Dựa trên một bản hoàn chỉnh.
- Gán giá trị mới cho biến trong đoạn thực + Tham chiếu.
hiện.
+ LOB (Đối tượng lớn).
- Biến các giá trị thành các khối lệnh
- Các biến không phải là PL/SQL:
PL/SQL qua các tham số.
- Các biến heä thoáng cuûa heä ñieàu haønh và heä
- Hiển thị kết quả qua các biến xuất. quaûn trò CSDL/ hoaëc caùc bieán khaùc taàm vöïc

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Khai baù
baùo caù
caùc bieá
bieán PL/SQL * Khai baù
baùo caù
caùc bieá
bieán PL/SQL
l Cuù phaùp: DECLARE . Nhöõng nguyeân taéc
– <teân bieán> [CONSTANT] <kieåu dlieäu> [NOT + Theo nhöõng quy ñònh ñaët teân
NULL] [:= | DEFAULT bieåu thöùc ]; + Khôûi taïo bieán ñöôïc cho laø NOT NULL vaø
Ví duï CONSTANT
Declare + Khôûi taïo teân bieán baèng caùch söû duïng toaùn töû
v_hireddata DATE; gaùn (:=) hoaëc töø khoaù DEFAULT
v_deptno NUMBER(2) NOT NULL :=10; + Thoâng thöôøng khai baùo moät teân bieán treân moät
v_location VARCHAR2(13) := ‘Atlanta’; haøng
c_comm CONSTANT NUMBER := 1400;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Qui taé
taéc ñaët teân *Gaù
Gaùn giaù
giaù trò cho bieá
bieán
l -Hai bieán coù theå cuøng teân nhöng neá u chuùng ôû hai khoái . Cuù phaùp:
khaùc nhau
l -Caùc teân bieán khoâng ñöôïc truøng teân vôùi teân table, col Teân bieán := bieåu thöùc;
ñöôïc söû duïng trong khoái. o
bi
eán
.

h
Ví duï to
ác
àn
DECLARE t ie
eâm no
Ví duï:
th m p
empno NUMBER(4); ân
ne ï v_
e
- Thieát laäp ngaøy thueâ cho ngöôøi lao ñoäng môùi
ân, u
BEGIN øng
te Ví d

SELECT empno o
tru v_hiredata:=31-DEC-98
ãi d
Lo
INTO empno - Thieát laäp teân ngöôøi lao ñoäng laø Maduro
FROM emp
WHERE ename = ‘SMITH’;
v_ename:=’Maduro’
END;
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

42
Ng Duc Thuan

* Khôû
Khôûi taï
taïo bieá
bieán vaø
vaø töø khoaù
khoaù
* Kieå
Kieåu döõ lieä
lieäu voâ höôùng
ng

Söû duïng:
- Toaùn töû gaùn (:=) l+ Ñôn trò
- Töø khoaù DEFAULT + Khoâng coù caùc thaønh phaàn beân trong
- Raøng buoäc NOT NULL

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Kieå
Kieåu döõ lieä
lieäu voâ höôùng
ng cô baû
baûn
* Khai baù
baùo kieå
kieåu döõ lieä
lieäu voâ höôùng
ng
. VARCHAR2 (chieàu daøi lôùn nhaát)
. NUMBER [ ( ñoä chính xaùc, co daõn ) ] Ví duï:
. DATE v_job VARCHAR2(9)
. CHAR [ ( chieàu daøi lôùn nhaát ) ]
v_count BINARY_INTEGER :=0
. LONG
v_total_sal NUMBER (8,2) :=0;
. LONG RAW
. BOOLEAN v_order_date DATE
. BINARY_ INTEGER v_valid BOOLEAN NOT NULL := TRUE
. PLS_INTEGER

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Thuoä
Thuoäc tính %TYPE
* Khai baù
baùo bieá
bieán vôù
vôùi thuoä
thuoäc tính %TYPE
. Khai baùo moät bieán döïa vaøo:
+ Ñònh nghóa moät coät cô sôû döõ lieäu Ví duï:
+ Bieán ñaõ ñöôïc khai baùo tröôùc v_ename emp_ename%TYPE
Tieàn toá loaïi % duøng vôùi v_balance NUMBER (1,7)
+ Baûng cô sôû döõ lieäu vaø coät v_min_balance v_balance % type :=10
+ Teân bieán ñöôïc khai baùo tröôùc

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

43
Ng Duc Thuan

* Khai baù
baùo caù
caùc bieá
bieán Boolean * Caù
Caùc bieá
bieán kieå
kieåu döõ lieä
lieäu LOB
l Chæ coù caùc giaù trò TRUE, FALSE vaø NULL
ñöôïc gaùn cho caùc bieán boolean (Large Object)
l Book: (CLOB) Vaên baûn lôùn
l Caùc bieán ñöôïc keát noái bôûi caùc pheùp toaùn
AND, OR, NOT l Photo: (BLOB) aûnh
l Caùc bieåu thöùc soá, kyù töï vaø ngaøy thaùng coù theå l Movie: (BFILE) phim
söû duïng ñeå traû veà 1 giaù trò Boolean

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Tham chieá
chieáu ñeán caù
caùc bieá
bieán khoâng
* Caù
Caùc bieá
bieán bind PL/SQL

l Víduï : Löu löông thaùng vaøo 1 bieán host


SQL*Plus
Application
: g_monthly_sal := v_sal/12;
Tham chieáu ñeán caùc bieán khoâng PL/SQL nhö 1
O/S
Bind variable bieán host
Tieàn toá caùc tham chieáu laø daáu :
Oracle Server

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* DBMS_OUTPUT.PUT_LINE

l Laø1 thuû tuïc cuûa Oracle hoã trôï hieån thò döõ lieäu töø
1 khoái PL/SQL
l ÑEÅ coù hieäu löïc trong SQL*Plus phaûi coù:

SET SERVEROUTPUT ON
*Vieá
Vieát leä
leänh
nh thi haø
haønh
nh

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

44
Ng Duc Thuan

* Cuù
Cuù phaù
phaùp vaø
vaø quy taé
taéc cuû
cuûa caù
caùc
* Muï
Muïc tieâu khoá
khoái leä
leänh
nh PL/SQL
Sau khi hoaøn thaønh baøi hoïc naøy baïn coù theå: Moät caâu leänh coù theå ñöôïc vieát treân nhieàu doøng.
Nhaän ra ñöôïc yù nghóa cuûa nhöõng phaàn Caùc ñôn vò töø vöïng coù theå trình baøy treân nhieàu
thöïc hieän. doøng
Giaûi thích ñöôïc luaät cuûa nhöõng khoái leänh Khoaûng traéng.
loàng nhau. Caùc daáu phaân ñoaïn, phaân taùch.
Thi haønh vaø kieåm tra moät khoái leänh Caùc ñònh danh.
PL/SQL. Caùc chuoãi caàn ñöôïc giöõ nguyeân ñònh daïng.
Söû duïng caùc quy öôùc maõ hoaù. Caùc doøng chuù thích.

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Cuù
Cuù phaù
phaùp vaø
vaø quy taé
taéc cuû
cuûa caù
caùc * Cuù
Cuù phaù
phaùp vaø
vaø quy taé
taéc cuû
cuûa caù
caùc
khoá
khoái leä
leänh
nh PL/SQL (Tie(Tieááp) khoá
khoái leä
leänh
nh PL/SQL (tie
(tieááp)
Caùc ñònh danh: Caùc chuoãi:
Coù theå chöùa toái ña 30 kí töï. Kyù töï vaø ngaøy thaùng caàn giöõ nguyeân ñònh daïng
Khoâng ñöôïc chöùa teân bieán tröø khi chuoãi ñoù phaûi ñaët trong daáu nhaùy ñôn (‘’).
ñöôïc ñaët trong daáu nhaùy keùp (“”) Caùc soá coù theå nhaän caùc giaù trò ñôn giaûn hay
Luoân luoân baét ñaàu baét ñaàu baèng moät chöõ caùi. moät kí hieäu ñôn giaûn naøo ñoù.
Khoâng neân cuøng teân vôùi moät baûng trong CSDL Moät khoái leänh PL/SQL keát thuùc baèng daáu gaïch
hay moät coät. nghieâng (/) ñaët rieâng treân moät doøng.

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Caù
Caùc khoá
khoái leä
leänh
nh loà
loàng
ng nhau vaø
vaø
* Caù
Caùch
ch ghi caù
caùc caâu chuù
chuù thí
thích taà
taàm vöïc bieá
bieán
l Neáu chuù thích treân moät doøng thì baét ñaàu vôùi daáu X: binary_integer ;
chuù thích (--). BEGIN Scope of x
l Neáu chuù thích moät ñoaïn treân nhieàu doøng thì DECLARE
ñoaïn chuù thích phaûi ñaët trong daáu /* vaø */. Y NUMBER;
Ví duï: BEGIN Scope of y
….
V_sal NUMBER(9,2);
BEGIN END;
/* Tính toaù
toaùn löông naêm döïa treân löông thaù
thaùng
ng nhaä
nhaäp vaø
vaøo
töø ngö
ngöôøi söû duï
duïng
ng */
V_sal := &p_monthly_sal
&p_monthly_sal*12; *12; END;
END; - - Ñaây laø
laø keá
keát thöù
thöùc khoá
khoái
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

45
Ng Duc Thuan

*Caù
Caùc toaù
toaùn töû trong PL/SQL *Caù
Caùc toaù
toaùn töû trong PL/SQL (tie
(tieááp)
Ví duï:
l Toaùn töû logic. Taêng bieán ñeám cho moät voøng laëp:
l Toaùn töû soá hoïc. v_count := v_count + 1;
l Toaùn töû gheùp noái. l Thieát laäp giaù trò cho moät bieán côø kieåu Boolean
l Caùc daáu ngoaëc ñôn ñeå xaùc ñònh caùc toaùn v_equal := (v_n1 = v_n2);
töû.
l Gaùn giaù trò vaøo bieán neáu noù khoâng chöùa giaù trò:
l Toaùn töû luyõ thöøa.
v_valid := (v_empno IS NOT NULL);

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Söû duï
duïng
ng caù
caùc bieá
bieán raø
raøng
ng buoä
buoäc * Caù
Caùc quy taé
taéc laä
laäp trì
trình
Ñeå tham chieáu tôùi moät bieán raøng buoäc trong PL/SQL thì Haõy laøm cho maõ nguoàn deã baûo trì hôn baèng caùch
phaûi ñaët teân bieán tröôùc daáu ” :”
Ví duï: Chuù thích caùc doøng maõ cuûa mình.
VARIABLE q_salary NUMBER Phaùt trieån nhöõng quy taéc ngaàm ñònh cho maõ
DECLARE nguoàn.
v_sal emp_sal TYPE
Phaùt trieån nhöõng caùch ñaët teân theo nhöõng quy taéc
BEGIN
……………. nhaát ñònh cho caùc ñònh danh vaø caùc ñoái töôïng khaùc.
…………… Taêng tính ñeã ñoïc cho maõ nguoàn baèng caùch trình
:q_galary := v_sal --ñaây laø caùc bieán raøng buoäc baøy hôïp lyù ( xuoáng doøng, lui vaøo ñaàu doøng…)
END;
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Caù
Caùch
ch ñaët teân theo quy taé
taéc * Trì
Trình baø
baøy maõ
Traùnh ñaët teân toái nghóa, khoâng gôïi nhôù: l Ñeåroõ raøng, luøi vaøo ñaàu doøng moãi caáp maõ nguoàn.
Ví duï:
DECLARE
V_deptno number(2);
l Ñaëtteân cuûa caùc bieán cuïc boä vaø tham soá cuûa caùc BEGIN V_location varchar2(13);
baûng tröôùc khi ñaët teân trong CSDL If x=0 then BEGIN
SELECT deptno,
Y:=1;
loc
End if;
l Ñaët teân cho caùc coät tröôùc khi ñaët teân cho caùc INTO v_deptno,
END; v_location
bieán cuïc boä. FROM dept
WHERE dname=‘SALE’;
END;
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

46
Ng Duc Thuan

* Xaù
Xaùc ñònh taà
taàm vöïc bieá
bieán roõ raø
raøng
ng
Söû duïng lôùp:
DECLARE
V_SAL NUMBER(7,2):=60000;
V_COMM NUMBER (7,2):=0;
V-TOTAL_COMP NUMBER(7,2):=V-SAL*10;
BEGIN
DECLARE
V_SAL NUMBER(7,2):=50000;
BEGIN
V_MESSAGE:=’CLECRK not’||V_MESSAGE;

END;
END; * Töông taù
taùc vôù
vôùi Oracle Server
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Các đối tượ


tượng nghiên cứu * Các lệnh SQL trong PL/SQL
l Sau khi học xong phần này bạn có thể làm được các công l Lấy một hàng dữ liệu từ CSDL sử dụng câu
việc sau: lệnh SELECT. Chỉ trả về giá trị trên một
Viết thành thạo câu lệnh SELECT trong PL/SQL. hàng.
• Khai báo kiểu dữ liệu và kích thước một biến l Thay đổi giá trị các hàng trong CSDL sử
động PL/SQL. dụng các câu lệnh DML.
• Điều khiển các giao dịch trong PL/SQL.
l Điều khiển một giao dịch với lệnh
• Viết các câu lênh DML trong PL/SQL COMMIT, ROLLBACK, hoặc SAVEPOINT.
• Xác định kết xuất của khai báo SQL DML l Xác định kết xuất DML bằng con trỏ ẩn.
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Lệnh SELECT trong PL/SQL * Lệnh SELECT trong PL/SQL


l Mệnh đề INTO được yêu cầu
l Lấy dữ liệu từ CSDL bằng lệnh SELECT.
– Các biến trong mệnh đề INTO khai báo cùng
Cú pháp: kiểu dữ liệu với các cột đã được chọn trong
mệnh đề SELECT.
VÍ DỤ:
SELECT [DISTINCT | ALL] {* | cột1 [, cột2, … ]} DECLARE
INTO {biến1 [, biến2, …] v_deptno NUMBER (4);
| bảng ghi } v_loc VARCHAR2 (20);
FROM {table | (truy vấn con) } [bí danh] BEGIN
WHERE Điều kiện SELECT deptno, loc
INTO v_deptno, v_loc
FROM dept;
WHERE dname = ‘SALES’;
END;
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

47
Ng Duc Thuan

* Trí
Trích chọ
chọn Dữ liệ
liệu trong PL/SQL * Trí
Trích chọ
chọn Dữ liệ
liệu trong PL/SQL
l Lấy ngày đặt hàng và ngày giao hàng từ bảng Đặt l Tính tổng lương nhân viên của tất cả các nhân
hàng viên trong cơ quan.
VÍ DỤ:
DECLARE VÍ DỤ:
v_orderdate ord.orderdate%TYPE; DECLARE
v_shipdate ord.shipdate%TYPE; v_sum_sal emp.sal%TYPE;
BEGIN v_deptno NUMBER NOT NULL :=10;
SELECT orderdate,shipdate BEGIN
INTO v_orderdate,v_shipdate SELECT SUM(sal) -- sal.group.function
FROM ord INTO v_sum_sal
WHERE id = 602; FROM emp
END; WHERE deptno = v_deptno;
END;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Thao tác dữ liệ


liệu sử dụng PL/SQL Chèn Dữ liệu
l Thay đổi bảng dữ liệu trong CSDL sử dụng l Thêm thông tin nhân viên mới vào bảng
các lệnh DML sau: EMP.
– INSERT Ví Dụ
– UPDATE INSERT
BEGIN
– DELETE
INSERT INTO emp(empno, job, deptno,)
UPDATE VALUES (empno_sequence NEXTVAL, ’HARDING’,
‘CLERK’, 10);
DELETE END;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Cập nhật Dữ liệu Xóa Dữ liệu


l Tăng lương cho các nhân viên có chức danh l Xóa tất cả các dòng có deptno = 10 từ bảng
là “ANALYST”. EMP.
Ví dụ
Ví dụ
DECLADE DECLADE
v_sal_increse emp.sal%TYPE:=2000; v_deptno emp.deptno%TYPE:=10;
BEGIN BEGIN
UPDATE emp DELETE FROM emp
SET sal = sal + v_sal_increse WHERE deptno = v_deptno;
WHERE job = ‘ANALYST’; END;
END;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

48
Ng Duc Thuan

* Các quy ước đặt tên


Các quy ước đặt tên
l Sử dụng tên đúng quy định ta tránh sự rắc rối (sự tối DECLARE
v_orderdate ord.orderdate%TYPE;
nghĩa) trong mệnh đề WHERE.
v_shipdate ord.shipdate%TYPE;
l Tên các cột và các định danh phải có tên phân ordid ord.ordid%TYPE:=601;
biệt BEGIN
SELECT orderdate,shipdate
l Cấu trúc các lỗi có thể tăng lên vì PL/SQL kiểm
INTO v_orderdate,v_shipdate
tra tên cột trong bảng trong CSDL trước. FROM ord
WHERE id = ordid;
END;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Các câu lệnh COMMIT và


ROLLBACK * Con trỏ
trỏ SQL
l Một con trỏ là một vùng làm việc SQL riêng biệt.
l Khởi tạo mỗi giao dịch bằng câu lệnh l Có hai kiểu con trỏ
DML để cho phép COMMIT hoặc – Con trỏ ẩn.
ROLLBACK.
– Con trỏ hiên.
l Sử dụng các câu lệnh SQL COMMIT và l Oracle server sử dụng con trỏ ẩn để phân tích cú
ROLLBACK để kết thúc phiên làm việc pháp và thực thi câu lệnh SQL.
một cách chính xác. l Con trỏ hiện được khai báo rõ ràng bởi người lập
trình.
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Các thuộ
thuộc tính của con trỏ
trỏ * Các thuộ
thuộc tính của con trỏ
trỏ SQL
SQL l Ví dụ: Xóa các hàng định theo số thứ tự từ
l Sử dụng các thuộc tính của con tro SQL bạn có bảng ITEM. Hiển thị số hàng đã xóa.
thể kiểm tra kết xuất của câu lênh SQL. VARIABLE rows_deleted varchar2(30)
SQL%ROWCOUNT Trả về số hàng, có hiệu lực bởi câu lệnh SQL gần nhất(một giá trị DECLARE
integer) v_ordid MUMBER := 605;
BEGIN
SQL%FOUND Mang thuộc tính lôgic. Trả về giá TRUE nếu câu lệnh SQL gần nhất
có tác dụng trên một hay nhiều hàng DELETE FROM Item
WHERE ordid = v_ordid;
SQL%NOTFOUND Mang thuộc tính lôgic. Trả về giá trị TRUE nếu câu lệnh SQL gần
nhất không tác động lên hàng nào rows_deleted = {SQL%ROWCOUND || rows_deleted}

SQL%ISOPEN Luôn mang giá trị FALSE vì PL/SQL đóng con trỏ ẩn ngay sau khi
END;
chúng thực thi lệnh /
Print rows_deleted
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

49
Ng Duc Thuan

* Tổng kết
l Nhúng SQL vào trong khối lệnh PL/SQL:
SELECT, INSERT, UPDETE, DETELE.
l Nhúng các câu lệnh điều khiển giao dịch
trong khối lệnh PL/SQL:
COMMIT, ROLLBACK, SAVEPOINT
VIẾ
VIẾT CÁ
CÁC CẤ
CẤU TRÚ
TRÚC ĐIỀ
ĐIỀU KHIỂ
KHIỂN
( WRITING CONTROL STRUCTURE )

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Thự
Thực thi câu lệnh điề
điều khiể
khiển luồ
luồng
* MỤ
MỤC TIÊU PL/SQL
(Objectives) (Controlling PL/SQL flow of execution)

l Sau khi hoàn thành bài học này bạn có thể: l Trong phần này chúng ta sẽ xem xét làm thế nào
- Định nghĩa cách dùng và loại cấu trúc điều khiển. để cấu trúc các dòng điều khiển (flow control)
- Xây dựng một câu lệnh IF. trong chương trình PL/SQL. Điều này liên quan
- Xây dựng và định nghĩa các câu lệnh lặp khác nhau. đến các câu lệnh có điều kiện, rẽ nhánh và lặp
- Sử dụng các bảng logic. l PL/SQL cung cấp nhiều thuận tiện. Bạn có thể
- Điều khiển các luồng bằng cách dùng các vòng lặp thay đổi lôgíc dòng của các câu lệnh bằng cách
lồng nhau và các nhãn. dùng các câu lệnh điều kiện IF và cấu trúc điều
khiển lặp (loop control structures).
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* CÂU LỆ
LỆNH IF
* CÁ
CÁC CÂU LỆ
LỆNH ĐIỀ
ĐIỀU KIỆ
KIỆN IF (IF statements)
(Conditional IF statements) l Cú pháp:
Câu lệnh IF có cấu trúc giống hệt như trong các ngôn ngữ
l Cho phép lựa chọn các tác vụ dựa trên tính thủ tục khác. Nó cho phép các tác vụ dược thi hành có
chọn lựa dựa trên điều kiện. Cấu trúc cơ bản là:
toán các điều kiện. IF condition THEN actions
[ELSIF condition THEN actions]
l Các câu lệnh:
[ELSE actions]
+ IF – THEN – END IF END IF;
Câu lệnh IF đơn:
+ IF – THEN – ELSE – END IF
Nếu tên nhân viên là Osborne thì mã số nhà quản lý là 22.
+ IF – THEN – ELSIF – END IF IF v_ename = ‘OSBORNE’ THEN
v_mgr := 22;
END IF;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

50
Ng Duc Thuan

* CÁ
CÁC CÂU LỆ
LỆNH IF ĐƠN * CÁ
CÁC CÂU LỆ
LỆNH IF ĐƠN
(Simple IF Statements) (Simple IF Statements)

l Nếu có tên là Miller thì tên công việc là salesman, mã l Câu lệnh IF đơn là câu lệnh có phần điều kiện và
cửa hàng là 35 và tiền hoa hồng là 20% lương hiện không có phần tùy chọn.
tại.
l Ví dụ: l Các tác vụ trong (IF-END IF) chỉ thi hành nếu điều
kiện là đúng, còn nếu sai hoặc rỗng(NULL) thì các
IF v_ename = ‘Miller’ THEN tác vụ đó sẽ bỏ qua. Trong cả 2 trường hợp, quyền
v_job:=‘SALESMAN’; điều khiển sẽ tiếp tục tại câu lệnh ngay sau END IF.
v_deptno:=35; Chú ý rằng cấu trúc ‘END IF’ mà không có tại cuối
v_now_comm:=sal*20%; câu thì PL/SQL sẽ tìm tiếp trong chương trình câu
END IF; này. Nó sẽ báo lỗi khi không tìm ra.

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* CÂU LỆ
LỆNH IF – THEN – ELSE
Sơ đồ khố
khối * CÂU LỆ
LỆNH IF – THEN - ELSE
Đúng Sai l Nếu thời gian từ ngày đặt hàng đến ngày nhận hàng
Điều kiện
IF
không quá 5 ngày thì đơn đặt hàng còn hiệu lực,
ngược lại thì đơn đặt hàng đó không còn hiệu lực
l Ví dụ:
…..
Các tác vụ THEN Các tác vụ ELSE IF v_shipdate – v_orderdate<5 THEN
(Chứa cả các câu lệnh IF khác) (Chứa cả các câu lệnh IF khác) v_ship_flag:=‘acceptable’;
ELSE
v_ship_flag:=‘unacceptable’;
Cả hai tập tác vụ có thể chứa cả các câu lệnh IF lồng
vài trong. Mỗi câu lệnh IF lồng ở trong đều cần thiết END IF
phải kết thúc bằng END IF. …….

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* CÂU LỆ
LỆNH IF-
IF-THEN-
THEN-ELSIF CÂU LỆ
LỆNH IF-
IF-THEN-
THEN-ELSIF
l Trả về một giá trị được tính toán dựa trên tỷ lệ phần
Điều kiện IF
trăm của giá trị cơ sở với một điều kiện cho trước.
l Ví dụ:
Các tác vụ THEN Điều kiện ELSEIF …..
IF v_start > 100 THEN
v_start:=2*v_start;
Các tác vụ THEN Điều kiện ELSEIF ELSIF v_start >=50 THEN
v_start:= 5*v_start;
ELSE
v_start:= 1*v_start;
+ Thường thì tác vụ thi hành trong mệnh đề ELSE của một câu END IF
lệnh IF khác. Trong trường hợp này thì ta nên dùng mệnh đề
ELSIF mà không cần dùng END IF ở cuối ELSIF. ……
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

51
Ng Duc Thuan

CÁC BẢ
BẢNG LOGIC
* XÂY DỰ
DỰNG ĐIỀ
ĐIỀU KIỆ
KIỆN LOGIC
Xây dựng một điề
điều kiệ
kiện Boolean đơn giả
giản
với một sự so sánh toá
toán tử.
l Có thể kiểm tra giá trị null bằng từ khoá
NULL.
AND TRUE FALSE NULL OR TRUE FALSE NULL NOT
l Mọi biểu thức toán học chứa một giá trị NULL
thì sẽ trả về giá trị là NULL. TRUE TRUE FALSE NULL TRUE TRUE TRUE TRUE TRUE FALSE

FALSE FALSE FALSE FALSE FALSE TRUE FALSE NULL FALSE TRUE
l Có thể ghép các biểu thức với giá trị NULL và
NULL NULL FALSE NULL NULL TRUE NULL NULL NULL NULL
giá trị kết quả trả về là một chuỗi rỗng.

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* CÁ
CÁC VÒNG LẶ
LẶP RẼ
RẼ NHÁ
NHÁNH TRONG
* ĐIỀ
ĐIỀU KIỆ
KIỆN BOOLEAN PL/SQL
Giá trị của V_FLAG trong mỗi trường hợp là gì?
l PL/SQL cung cấp một số các phương tiện để cấu trúc
v_flag:=v_reorder_flag AND v_available_flag;
các vòng lặp và rẽ nhánh(có thể đến phần khác của
chương trình). Vòng lặp đơn giản nhất(vòng lặp cơ
V_ORDER_FLAG V_AVAILABLE_FLAG V_FLAG bản) chứa một đoạn các câu lệnh để lặp lại, bao giữa
cặp LOOP và ENDLOOP.
TRUE TRUE TRUE
l Mỗi lần dòng chương trình gặp phải ENDLOOP thì
TRUE FALSE FALSE
quyền điều khiển trả về tại LOOP. Vòng lặp không
NULL TRUE NULL điều khiển này sẽ mãi mãi nếu trong thân của nó
NULL FALSE FALSE không có các lệnh nhảy ra khỏi nó.

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* ĐIỀ
ĐIỀU KHIỂ
KHIỂN LẶ
LẶP: CÂU LỆ
LỆNH LẶ
LẶP * VÒNG LẶ
LẶP CƠ BẢ
BẢN
l Cú pháp:
LOOP
l Các câu lệnh lặp lặp lại một câu lệnh hay tuần câu lệnh1; //các tác vụ thi hành trong
tự một câu lệnh nhiều lần
……………. Vòng lặp
l Có 3 loại lặp: câu lệnh n;
– Vòng lặp cơ bản (basic loop). END LOOP;
– Vòng lặp FOR. EXIT : sẽ kết thúc một vòng lặp.
– Vòng lặp WHILE. Cú pháp:
EXIT [loop_label][WHEN condition]

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

52
Ng Duc Thuan

* CÂU LỆ
LỆNH EXIT VÍ D Ụ
(THE EXIT STATEMENT)
l Một vòng lặp có thể kết thúc từ bên ngoài nếu dùng câu lệnh DECLARE
EXIT. EXIT cho phép điều khiển chuyển cho câu lệnh kế tiếp v_ordid item ordidtype:=601;
ngay sau ENDLOOP và kết thúc vòng lặp ngay lập tức.
v_counter NUMBER(2) :=1;
l Cú pháp:
EXIT[loop_label] [WHEN condition]; BEGIN
l EXIT có thể là một tác vụ nằm trong câu lệnh IF hoặc đứng một LOOP
mình trong vòng lặp. Khi đứng một mình thì mệnh đề WHEN có INSERT INTO item(ordid,itemid)
thể dùng để kết thúc có điều kiện.
l When condition là một biến boolean hay một biểu thức (TRUE, VALUES(v_ordid,v_counter);
FALSE, NULL). v_counter :=v_counter + 1;
l Cách ngắt vòng lặp khác là rẽ nhánh đến một nhãn ra ngoài vòng EXIT WHEN v_counter > 10;
lặp, đó là dùng lệnh GOTO. Nhưng đây không phải là cách viết có
cấu trúc. END LOOP;
END;
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* FOR LOOP * VÍ
VÍ DỤ VỀ FOR LOOP

l Sử dụng vòng lặp FOR để điều khiển sự lặp vòng l Chèn 10 mục mới đầu tiên cho số thứ tự 601
l Cú pháp: l Ví dụ:
FOR counter in [REVERSE] DECLARE
low_bound..upper_bound LOOP
các câu lệnh ; v_ordid item.ordidtype:=601;
END LOOP; BEGIN
l Trong đó: +
counter: là tên của một biến số nguyên sẽ được tăng FOR i IN 1..10 LOOP
giảm tự động tại mỗi bước của vòng lặp. Biến này được INSERT INTO item(ordid,itemid)
tạo ra bởi vòng lặp và không được gán giá trị cho nó
trong vòng lặp. Tầm vực của nó là cho đến cuối vòng VALUES(v_ordid,i);
lặp. END LOOP;
l + low_bound và upper_bound là các biểu thức số nguyên END;
cho biết vùng giá trị dành cho biến điều khiển.
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* WHILE LOOP VÍ DỤ WHILE LOOP


l Cú pháp: l VÍ DỤ:
WHILE condition LOOP ACCEPT p_new_order PROMPT ‘Enter the order number:’
ACCEPT p_items PROMPT ‘Enter the number of items in this order:’
câu lệnh 1;
DECLARE
câu lệnh 2; v_count NUMBER(2):=1;
…… BEGIN
END LOOP; WHILE v_count<=&p_items LOOP
+ Dùng vòng lặp WHILE cho lặp có điều kiện. Các câu lệnh sẽ INSERT INTO item(ordid,itemid)
được thực hiện lặp lại trong khi điều kiện là đúng. VALUES(&p_new_order,v_count);
+ Condition (điều kiện) được tính toán tại điểm bắt đầu của v_count:=v_count + 1;
vòng lặp sẽ kết thúc nếu điều kiện này là FALSE. Nếu điều END LOOP;
kiện này là FALSE ngay tại lúc bắt đầu vào đến vòng lặp thì END;
vòng lặp không xảy ra. l Nếu trong vòng lặp mà biến có dính đến điều kiện của vòng lặp
không thay đổi thì vòng lặp sẽ không kết thúc. Ngoài ra, câu lệnh
EXIT cũng có thể dùng để kết thúc cả vòng lặp FOR và WHILE.
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

53
Ng Duc Thuan

*CÁ
*CÁC VÒNG LẶ
LẶP LỒ
LỒNG NHAU VÀ
VÀ NHÃN * CÁ
CÁC VÒNG LẶ
LẶP LỒ
LỒNG NHAU VÀ
VÀ NHÃN
l Các vòng lặp có thể gán nhãn bằng cách đặt nhãn trước từ LOOP
và sau END LOOP:
l Các vòng lặp có thể lồng nhau ở nhiều cấp. <<outer_limits>> LOOP
-- các tác vụ
l Sử dụng nhãn để phân biệt các khối và vòng lặp. END LOOP outer_limits;

l Các nhãn trong PL/SQL được định nghĩa như sau: l Nếu vòng lặp trong dùng câu lệnh EXIT thì nó có thể thoát ra ngoài
một vòng lặp nếu tham khảo đến tên của vòng lặp đó trong lệnh
<<label-name>> EXIT.
l Tên này cũng phải tuân theo các nguyên tắc chung l Ví dụ:
<<main>>LOOP
khi đặt tên. Một nhãn được đặt trước một câu lệnh có
……
thể trên cùng một hàng hoặc hàng khác. LOOP
……
l Thoát khỏi các vòng lặp bằng câu lệnh EXIT EXIT main WHEN total_done=‘YES’; --thoát cả 2 vòng lặp
EXIT WHEN innder_done=‘YES’; --thoát ra vòng lặp trong
END LOOP main;
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* VÍ
VÍ DỤ VÒNG LẶ
LẶP LỒ
LỒNG NHAU VÀ
VÀ NHÃN * TÓ
TÓM LẠ
LẠI
……
BEGIN
<<outer_loop>> l Có thể thay đổi luồng lôgíc của các câu lệnh bằng
LOOP
v_counter :=v_counter+1;
cách sử dụng các cấu trúc điều khiển.
EXIT WHEN v_counter>10;
<<Inner_loop>>
+ Điều kiện ( câu lệnh IF).
LOOP
……
+ các vòng lặp (LOOP):
EXIT outer_loop WHEN total_done =‘YES’; - vòng lặp cơ bản.
-- Thoát cả hai vòng lặp
EXIT WHEN innter_done = ‘YES’; - FOR LOOP.
-- Chỉ thoát một vòng lặp
…… - WHILE LOOP.
END LOOP inner_loop;
…… - Câu lệnh EXIT.
END LOOP outer_loop;
END
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Kieå
Kieåu döõ lieä
lieäu toå
toång
ng hôï
hôïp
l Kieåu:
– PL/SQL RECORD
- PL/SQL TABLES

Chöùa nhieàu thaønh phaàn beân trong


Coù theå söû duïng laïi

* Laø
Laøm vieä
vieäc vôù
vôùi kieå
kieåu döõ lieä
lieäu toå
toång
ng hôï
hôïp

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

54
Ng Duc Thuan

* PL/SQL RECORD * Taï


Taïo laä
laäp 1 RECORD PL/SQL
l Coù theå chöùa nhieàu thaønh phaàn thuoäc kieåu voâ l Cuù phaùp:
huôùng, RECORD hay PL/SQL TABLE ñöôïc goïi TYPE type_name IS RECORD
laø tröôøng (Field) (field_declaration [, field_declaration]..);
field_declaration]..);
Identifier type_name
l Töông töï caáu truùc caùc baûn ghi trong 3 GL
l Ôû ñaây 1 field_declaration laø
l Khoâng nhö caùc doøng trong 1 table
<teân tröôøng> <kieåu tröôøng> | < <teân
l Taäp hôïp caùc tröôøng nhö moät logic
bieán>%TYPE | table_colum%TYPE |
l Thuaän tieän cho vieäc trích ra 1 doøng döõ lieäu töø 1 table%ROWTYPE [ [NOT NULL] [:=
table, phuïc vuï cho vieäc xöû lyù DEFAULT] bthöùc]

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Taï
Taïo laä
laäp 1 RECORD PL/SQL
* Caá
Caáu truù
truùc 1 baû
baûn ghi PL/SQL
l Ví duï
Field1(datatype) Field2(datatype) Field3(datatype)
Type emp_record_type IS RECORD
(ename VARCHAR2(10),
job VARCHAR2(9),
sal NUMBER(7,2)); Empno number(4) Ename varchar2(10) Job varchar2(9)

Emp_record emp_record_type;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Thuoä
Thuoäc tính %ROWTYPE * Môû
Môû roä
roäng
ng söû duï
duïng
ng %ROWTYPE
l Soá löôïng vaø kieåu döõ lieäu caùc coät CSDL coù theå
l Khai baùo 1 bieán theo taäp caùc coät trong 1 Table chöa bieát, thay ñoåi trong quaù trình thöïc hieän
CSDL hay khung nhìn l Thuoäc tính ñöôïc duøng ñeå trích 1 doøng baèng caâu
l Tieàn toá %ROWTYPE laø teân cuûa 1 Table CSDL leänh SELECT
l Caùc tröôøng trong RECORD laáy teân, kieåu döõ lieäu l Ví duï
töø caùc coät cuûa Table hay khung nhìn – Khai baùo 1 bieán ñeå löu tröõ thoâng tin 1 phaân xöôûng
department ñaõ ñöôïc löu tröõ trong table DEPT
Dept_record dept%ROWTYPE
Emp_record emp%ROWTYPE
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

55
Ng Duc Thuan

* Caù
Caùc Table PL/SQL * Taï
Taïo laä
laäp 1 Table PL/SQL
l Goàm 2 thaønh phaàn: l Cuù phaùp
TYPE type_name IS TABLE OF
(colum_type | variable%TYPE | table.column%TYPE ) [NOT NULL]
– Khoaù chính coù kieåu döõ lieäu BINARY_INTEGER [INDEX BY BINARY_INTEGER};
– Coät voâ höôùng hay kieåu döõ lieäu RECORD Identifier type_name;
type_name;

l Khai baùo 1 Table PL/SQL ñeå löu tröõ caùc teân


Taêng söï linh ñoäng bôûi vì chuùng khoâng bò raøng
buoäc TYPE ename_table_type IS TABLE OF
Emp.ename%TYPE
INDEX BY BINARY_INTEGER;
ename_table ename_table_type;
ename_table_type;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Taï
Taïo 1 Table
* Caá
Caáu truù
truùc Table PL/SQL DECLARE
Khoaù
Khoaù chí
chính Coä
Coät TYPE ename_table_type IS TABLE OF emp_.ename%TYPE
... ... INDEX BY BINARY_INTEGER;
TYPE hiredate_table_type IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
1 Jones ename_table ename_table_type;
hiredate_table hiredate_table_type;
2 Smith BEGIN
ename_table(1) := ‘CAMERON’;
hiredate_table(8) := SYSDATE +7;
3 Maduro IF ename_table EXISTS(1) THEN
INSERT INTO …
... ... END;

BINARY_INTEGER Voâ höôùng


ng

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Moä
Moät ví duï
duï cuû
cuûa PL/SQL
* PL/SQL Table of Record
chöù
chöùa baû
baûn ghi
l Ñònh nghóa bieán TABLE vôùi kieåu döõ lieäu DECLARE
PL/SQL TYPE e_table_type IS TABLE OF emp.Ename%TYPE
l Khai baùo 1 bieán PL/SQL giöõ thoâng tin phaân INDEX BY BINARY_INTEGER;
xöôûng e_table e_table_type;
BEGIN
l Ví duï
e_table(1) := ‘SMITH’;
DECLARE
UPDATE emp
TYPE dept_table_type IS TABLE OF dept%ROWTYPE
SET sal:= 1.1*sal;
INDEX BY BINARY_INTEGER;
WHERE Ename = e_table(1);
dept_table dept_table_type;
COMMIT;
-- Moãi phaàn töû cuûa Table dept_table laø 1 baûn ghi
END;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

56
Ng Duc Thuan

* CAÙ
CAÙC CHÖÙ
CHÖÙC NAÊNG CUÛ
CUÛA CON
TROÛ
TROÛ HIEÄ
HIEÄN

7369 SMITH CLERK

7566 JONES MANAGER


Current row
CURSOR

7756 MIKE MANAGER


Vieá
Vieát con troû
troû hieä
hieän
Writing Explicit cursors
7902 FORD ANALYST

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

ÑIEÀ
IEÀU KHIEÅ
KHIEÅN CON TROÛ
TROÛ HIEÄ
HIEÄN * KHAI BAÙ
BAÙO CON TROÛ
TROÛ
SAI
l cuù phaùp:
CURSOR cursor_name IS
KHAI
MÔÛ
TÌM
ROÃNG ÑOÙNG
select_statement;
BAÙO NAÏP
ÑUÙNG

Taï
Taïo laä
laäp Naä
Naäp doø
doøng
ng Kieå
Kieåm tra
1 teân cho
Nhaë
Nhaët ra
Taä
Taäp
Hieä
Hieän haø
haønh
nh Söï toà
toàn taï
taïi Xoaù
Xoaù
Khoâng chöùa meänh ñeà INTO trong khai baùo
Vaø
Vaøo maù
maùy
1 vuø
vuøng
ng SQL Baû
Baûn ghi
Cuû
Cuûa doø
Trôû
doøng
Trôû laï
laïi
ng Taä
Taäp baû
baûn ghi cursor
trí
trích choï
Neá
Neáu caù
choïn
caùc doø
doøng ng
Neáu xöû lyù caùc haøng theo moät thöù töï baét buoäc
tìm thaá
thaáy nhaát ñònh naøo ñoù thì söû duïng meänh ñeà ORDER
BY trong truy vaán
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* VÍ
VÍ DUÏ
DUÏ * MÔÛ
MÔÛ CON TROÛ
TROÛ
DECLARE
l Cuù phaùp:
CURSOR emp_cursor IS
SELECT emp_no, ename OPEN cursor_names;
FROM emp;

CURSOR dept_cursor IS l Môû con troû nhaèm thöïc hieän truy vaán vaø nhaän bieát taäp
SELECT * baûn ghi
FROM dept l Neáu vieäc truy vaán khoâng traû veà haøng naøo caû thì ñaây laø
WHERE dept_no=10; tröôøng hôïp ngoaïi leä khoâng xem xeùt
BEGIN… l Söû duïng caùc thuoäc tính con troû ñeå kieåm tra keát quaû sau
moät laàn tìm naïp
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

57
Ng Duc Thuan

* TÌM NAÏ
NAÏP DÖ
DÖÕ LIEÄ
LIEÄU TÖØ
TÖØ CON TROÛ
TROÛ VÍ DUÏ
DUÏ
FETCH emp_cursor INTO
FETCH cursor_name INTO [variable1, variable2, v_empno, v_ename
…] [record_name];
OPEN defined_cursor
LOOP
FETCH defined_cursor INTO
l Gaùn töøng giaù trò cuûa moãi haøng hieän thôøi vaøo töøng bieán
l Soá löôïng caùc coät thuoäc tính cuûa moãi haøng phaûi baèng soá
defined_variables
löôïng bieán EXIT WHEN
l Kieåm tra xem con troû coù chöùa baûn ghi naøo khoâng ….process the retrieved data
END.
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

*ÑOÙNG
NG CON TROÛ
TROÛ * CAÙ
CAÙC THUOÄ
THUOÄC TÍ
TÍNH CUÛ
CUÛA CON TROÛ
TROÛ MÔÛ
MÔÛ
l Cuù phaùp Attribute Type Description
%ISOPEN Boolean True neáu con troû
CLOSE cursor_name; ñaõ môû
%NOTFOUND Boolean True neáu vieäc tìm
l Ñoùng con troû sau khi hoaøn thaønh xong vieäc xöû
naïp khoâng traû veà
lyù caùc haøng haøng naøo caû
l Coù theå môû laïi con troû neáu coù yeâu caàu %FOUND Boolean Ngöôïc laïi vôùi
l Ñöøng coá thöû laáy döõ lieäu töø con troû moãi khi noù %NOTFOUND
ñaõ ñöôïc ñoùng laïi %ROWCOUNT Number Traû veà toång soá löôïng
doøng ñeán baây giôø
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* ÑIEÀ
IEU
À KHIEÅ
KHIEÅN VIEÄ
VIEÄC TÌM NAÏ
NAÏP * THUOÄ
THUOÄC TÍ
TÍNH %ISOPEN
PHÖÙ
PHÖÙC TAÏ
TAÏP l Tìm naïp caùc doøng chæ khi naøo con troû ñaõ môû
l Söû duïng thuoäc tính con troû %ISOPEN tröôùc khi
l Xöû lyù nhieàu doøng töø con troû hieä n phaûi söû duïng
moät voøng laëp thi haønh vieäc tìm naïp ñeå kieåm tra xem con troû ñaõ
ñöôïc môû chöa
l Coù söï laëp laïi vieäc tìm naïp ñoái vôùi moãi doøng
l Söû duïng thuoäc tính %NOTFOUND vieát ñoaïn IF NOT emp_cursor%ISOPEN THEN
kieåm tra xem thöû vieäc tìm naïp coù thaát baïi OPEN emp_cursor;
l Söû duïng caùc thuoäc tính coøn laïi cuûa con troû END IF;
hieän ñeå xem vieäc tìm naïp coù thaønh coâng LOOP
khoâng FETCH emp_cursor…
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

58
Ng Duc Thuan

*THUOÄ
*THUOÄC TÍ
TÍNH %NOTFOUND VAØ
VAØ
* CON TROÛ
TROÛ VAØ
VAØ BAÛ
BAÛN GHI
%ROWCOUNT
Xöû lyù caùc doøng trong taäp baûn ghi laáy ñöôïc seõ
thuaän tieän nhôø vieäc tìm naïp caùc giaù trò vaøo
l Söû duïng thuoäc tính con troû %ROWCOUNT
bieán baûn ghi PL/SQL
ñeå laáy ra con soá chính xaùc soá löôïng doøng
DECLARE
l Söû duïng thuoäc tính con troû %NOTFOUND CURSOR emp_cursor IS
ñeå xaùc ñònh khi naøo thoaùt khoûi voøng laëp SELECT empno, ename
FROM emp;
Emp_record emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor
LOOP
FETCH emp_cursor INTO emp_record;
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* VOØ
VOØNG
NG LAË
LAËP FOR CON TROÛ
TROÛ * VOØ
VOØNG
NG LAË
LAËP FOR CON TROÛ
TROÛ
SYNTAX Lấy từng nhân viên tơi cuối bảng ghi.
FOR record_name IN cursor_name LOOP
Statement1; Ví dụ
Statement2;
…. DECLARE
END LOOP CURSOR
SELECT e_name.deptno
FROM emp;
l Voøng laëp for con troû laø moät caùch laøm nhanh ñeå BEGIN
FOR emp_record IN emp_cursor LOOP
xöû lyù caùc con troû -- implicit open and implicit fatch occur

l Coù môû, tìm naïp vaø ñoùng con troû aån


IF emp_record deptno = 30 THEN

l Baûn ghi thì ñöôïc khai baùo ngaàm ñònh END LOOP –- implicit colose occur

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* VOØ
VOØNG
NG LAË
LAËP FOR CON TROÛ
TROÛ
SÖÛ DUÏ
DUÏNG
NG CAÙ
CAÙC TRUY VAÁ
VAÁN CON.
Không caàn khai báo con trỏ
Ví dụ
BEGIN
FOR emp_record
IN (SELECT e_name.deptno
FROM emp;) LOOP
-- implicit open and implicit fatch occur
IF emp_record deptno = 30 THEN

Khá
Khái niệ
niệm về con trỏ
trỏ hiệ
hiện
END LOOP -- implicit colose occur mở rộng
END:
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

59
Ng Duc Thuan

Con trỏ
trỏ với các tham số
Mục đích
l Cú pháp
* Sau khi tìm hiểu xong phần này, bạn có thể: CURSOR cursor_name
[(parameter_name kiểu dữ liệu)]
l Viết con trỏ với các tham số. IS
select_statement;
l Xác định khi nào mệnh đề FOR UPDATE
trong một con trỏ được gọi. l Truyền các giá trị tham số cho một con trỏ
l Viết con trỏ sử dụng một truy vấn con. khi con trỏ được mở và truy vấn được thực
thi.
l Mở một con trỏ tường minh vài lần với một
thiết lập khác nhau với mỗi lần.
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Con trỏ
trỏ với các tham số (tt)
tt) * Mệnh đề FOR UPDATE
Truyền số bộ phận và tên nghề nghiệp đến mệnh đề
WHERE. l Cú pháp:
Ví dụ: SELECT ...
DECLARE FROM...
CURSOR emp_cursor FOR UPDATE [OF
(deptno NUMBER, job varchar2 ) IS thamchiếu_cột][NOWAIT];
SELECT empno, ename
FROM emp
WHERE deptno =v_deptno l Khóa tường minh cho phép chúng ta từ chối
AND job = v_job; truy cập trong khi giao dịch.
BEGIN
OPEN emp_cursor(10, 'CLERK');
l Khóa các hàng trước khi cập nhật hoặc xóa.

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Mệnh đề FOR UPDATE (tt


(tt)) * Mệnh đề WHERE CURRENT OF
l Cú pháp
Tìm kiếm những công nhân làm việc trong xưởng
số 30. WHERE CURRENT OF cursor;
Ví dụ l Dùng con trỏ để cập nhật hoặc xóa hàng hiện
DECLARE hành.
CURSOR emp_cursor IS l Chứa mệnh đề FOR UPDATE trong truy vấn con
trỏ để khóa các hàng trước.
SELECT empno, ename, sal
l Sử dụng mệnh đề WHERE CURRENT OF để
FROM emp tham chiếu đến hàng hiện hành từ một con trỏ
FOR UPDATE OF sal NOWAIT; tường minh.

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

60
Ng Duc Thuan

* Mệnh đề WHERE CURRENT OF Con trỏ


trỏ với các truy vấn con
Ví dụ Ví dụ
DECLARE
CURSOR sal_cursor IS
SELECT sal CURSOR my_cursor IS
FROM emp SELECT t1.deptno, t1.dname, t2.STAFF
WHERE deptno=30
FOR UPDATE OF sal NOWAIT;
FROM dept t1, (SELECT deptno, count(*) STAFF
BEGIN FROM emp
FOR emp_record IN sal_cursor LOOP GROUP BY deptno) t2
UPDATE emp
SET sal=emp_record.sal*1.10 WHERE t1.deptno = t2.deptno
WHERE CURRENT OF sal_cursor; AND t2.STAFF >= 5;
END LOOP;
COMMIT;
END;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Tóm tắt
l Chúng ta có thể trả về những thiết lập kích hoạt
khác nhau sử dụng các con trỏ với các tham số.
l Có thể định nghĩa các con trỏ với các truy vấn
con tương quan.
l Có thể thao tác con trỏ tường minh bằng các
lệnh:
- Mệnh đề FOR UPDATE
- Mệnh đề WHERE CURRENT OF Kiểm soát các ngoại lệ

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Mục đích Kiể


Kiểm soá
soát ngoạ
ngoại lệ với QL/SQL
Sau khi hoàn thành bài học này, chúng ta có thể làm được
các công việc sau:
l Ngoại lệ là gì?
Định nghĩa các ngoại lệ của PL/SQL.
Là những định danh được tạo ra trong quá trình thực
Nhận diện được các ngoại lệ không kiểm soát được. thi câu lệnh PL/SQL.
Liệt kê và sử dụng các dạng khác nhau của kiểm soát ngoại l Chúng được tạo ra như thế nào?
lệ trong PL/SQL.
- Khi xuất hiện một lỗi Oracle.
Bẫy những lỗi được biết trước.
- Bạn xây dựng nó không rõ ràng.
Mô tả ảnh hưởng của sự truyền ngoại lệ đến các khối lồng
l Làm sao để kiểm soát nó?
nhau.
- Bẫy bằng một xử lý.
Tùy chỉnh những thông báo của ngoại lệ trong PL/SQL.
- Lan truyền nó vào trong một môi trường để gọi.
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

61
Ng Duc Thuan

* Kiể
Kiểm soá
soát ngoạ
ngoại lệ
Bẫy ngoại lệ Lan truyền ngoại lệ
* Các kiể
kiểu ngoạ
ngoại lệ
DECLARE DECLARE
l Dạng được định nghĩa trước trong Oracle
BEGIN BEGIN Server (dạng ngầm định).
Xuất hiện Ngoại lệ
ngoại lệ xuất hiện l Dạng không được đinh nghĩa trước trong
EXCEPTION EXCEPTION
Oracle Server (dạng ngầm định).
Ngoại lệ Ngoại lệ
END; END; không được l Dạng người sử dụng định nghĩa (dạng tường
được bẫy
bẫy minh).
Ngoại lệ được lan truyền vào
môi trường gọi
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

* Bẫy lỗi các ngoạ


ngoại lệ
l Cú pháp * Chú
Chú thí
thích
EXCEPTION
WHEN exception1 [OR exception2…] THEN l WHEN OTHERS là mệnh đề cuối cùng.
statement1;
l Từ khóa EXCEPTION bắt đầu một phiên kiểm
statement2;
……. soát ngoại lệ.
[ WHEN exception3 [ OR exception4 … ] THEN l Chỉ có một số kiểm soát ngoại lệ được thừa nhận.
statement1;
statement2; l Chỉ có một kiểm soát được xử lý trước khi ra
…………..] khỏi khối.
[ WHEN OTHERS THEN statement1;
statement2;
………….]
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

*Bẫy một số lỗi đượ


được định nghĩ
nghĩa * Các ngoạ
ngoại lệ định nghĩ
nghĩa trướ
trước
trướ
trước trong Oracle Server l Cú pháp
BEGIN
l Tham khảo tên chuẩn trong chu trình kiểm EXCEPTION
WHEN NO_DATA_FOUND THEN
soát ngoại lệ. statement1;
l Một số ngoại lệ được định nghĩa trước: statement2;
WHEN TOO_MANY_ROWS THEN
NO_DATA_FOUND statement1;
TOO_MANY_ROWS WHEN OTHERS THEN
INVALID_CURSOR statement1;
statement2;
ZERO_DEVIDE statement3;
DUP_VAL_ON_INDEX END;

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

62
Ng Duc Thuan

* Bẫy một số lỗi không đượ


được định
* Hai hàm chuẩ
chuẩn để bẫy lỗi ngoạ
ngoại lệ
nghĩ
nghĩa trướ
trước trong Oracle Server
l SQLCODE
THAM CHIẾU
KHAI BÁO LIÊN KẾT
Trả về một giá trị số cho mã lỗi.
l SQLERRM
Phiên khai báo Phiên kiểm soát ngoại lệ Trả về thông báo lỗi được liên kết với số
lỗi.

l Tên ngoại lệ Mã PRAGMA Kiểm soát ngoại


lệ EXCEPTION_INIT đã xuất hiện
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Ví dụ * Bẫy lỗi ngoạ


ngoại lệ do ngườ
người sử dụng
DECLARE
v_error_code NUMBER;
định nghĩ
nghĩa
v_error_message VARCHAR2(255);
BEGIN KHAI BÁO XUẤT HIỆN THAM CHIẾU

EXCEPTION Phiên khai báo Phiên thực hiện Phiên kiểm soát ngoại lệ

WHEN OTHERS THEN
ROLLBACK;
v_error_code:= SQLCODE; •Tên ngoại lệ •Ngoại lệ sử •Xử lý ngoại lệ
v_error_message:= SQLERRM;
INSERT INTO errors
dụng câu lệnh
VALUES (v_error_code, v_error_message); RAISE ở dạng
END; hiển thị

NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Ví dụ * Gọi môi trườ


trường
DECLARE
e_invalid_product EXCEPTION l SQL*Plus Hiển thị số lỗi và thông báo lên màn hình.
BEGIN l Procedure Builder Hiển thị số lỗi và thông báo lên
UPDATE product màn hình.
SETdescrip=‘ &product_description’ l Oracle Developer Form Truy xuất một lỗi và thông báo
IF SQL%NOTFOUND THEN trong một trigger bằng cách sử dụng các hàm gói
RAISE e_invalid_product ERROR_CODE và ERROR_TEXT.
END IF
l Precompiler application Truy xuất số ngoại lệ thông
COMMIT
qua cấu trúc dữ liệu SQLCA.
EXCEPTION
WHEN e_invalid_product THEN
l An enclosing PL/SQL block Bẫy lỗi các ngoại lệ trong
chu trình kiểm soát ngoại lệ của khối mở.
DBMS_OUTPUT_LINE (‘Invalid product number’);
END;
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

63
Ng Duc Thuan

* Lan truyề
truyền các ngoạ
ngoại lệ
l Các khối nhỏ có thể kiểm soát một ngoại lệ hoặc bỏ qua ngoại
* Lan truyề
truyền các ngoạ
ngoại lệ (tt)
tt)
lệ đó để chuyển sang khối khác.
DECLARE EXCEPTION
e_no_rows exception; WHEN e_integrity THEN…
e_integrity exception;
PRAGMA EXCEPTION INIT (e_integrity, -2292 ); WHEN e_no_rows THEN…
BEGIN END;
For e_record IN emp_cursor LOOP END LOOP;
BEGIN EXCEPTION
SELECT…
WHEN NO_DATA_FOUND THEN…
UPDATE…
IF SQL%NOTFOUND THEN WHEN TOO_MANY_ROWS THEN…
RAISE e_no_rows; END;
END IF
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Thủ
Thủ tục RAISE_APPLICATION_ERROR
l Cú pháp Tổng kết
Raise_application_error (error_number, message[,
(TRUE| FALSE) ]); l Các loại ngoại lệ:
l Chức năng Lỗi Oracle Server được định nghĩa trước.
– Một thủ tục cho phép bạn đưa ra các thông báo lỗi do người Lỗi Oracle Server không được định nghĩa trước.
sử dụng định nghĩa từ các chương trình con. Lỗi do người sử dụng định nghĩa.
– Được gọi từ một chương trình con thi hành. l Bẫy lỗi ngoại lệ.
– Sử dụng trong hai vị trí khác nhau: l Kiểm soát ngoại lệ:
Phần thực thi. Bẫy một ngoại lệ bằng một khối PL/SQL.
Phần ngoại lệ. Lan truyền một ngoại lệ.
– Trả về điều kiện lỗi cho người sử dụng trong một liên kết
với các lỗi khác trong Oracle Server.
NgDucThuan- @2004- 2005-DHTS NgDucThuan- @2004- 2005-DHTS

Xin caù
caùm ôn !

NgDucThuan- @2004- 2005-DHTS

64

You might also like