Professional Documents
Culture Documents
3.giao Trinh SQL Va PL SQL PDF
3.giao Trinh SQL Va PL SQL PDF
net
C«ng ty cæ phÇn ®Çu t− ph¸t triÓn c«ng nghÖ - FPT
Gi¸o tr×nh SQL vµ PL/SQL
Môc lôc
14.1 Sequence...........................................................................................................................................57
14.1.1 T¹o Sequence.......................................................................................................57
14.1.2 Xo¸ vµ söa sequence ...........................................................................................58
14.2 Index ..................................................................................................................................................58
14.3 Bµi tËp................................................................................................................................................59
15 T¹o view ......................................................................................................................................59
15.1 View....................................................................................................................................................59
15.2 Bµi tËp................................................................................................................................................61
16 QuyÒn vµ b¶o mËt ...................................................................................................................61
16.1 QuyÒn - PRIVILEGE ..........................................................................................................................61
16.2 ROLE..................................................................................................................................................62
16.3 Synonym............................................................................................................................................63
17 tæng quan vÒ pl/sql vµ procedure builder...............................................................63
17.1 Có ph¸p lÖnh PL/SQL .......................................................................................................................63
17.2 PL/SQL block ....................................................................................................................................63
17.3 Giíi thiÖu Procedure builder............................................................................................................64
18 có ph¸p lËp tr×nh ...................................................................................................................66
18.1 IF ........................................................................................................................................................66
18.2 LOOP vµ EXIT....................................................................................................................................66
18.3 FOR ....................................................................................................................................................67
18.4 WHILE ................................................................................................................................................67
18.5 GOTO .................................................................................................................................................67
19 cursor ........................................................................................................................................68
19.1 §Þnh nghÜa .........................................................................................................................................68
19.2 KiÓu d÷ liÖu Table vµ Record...........................................................................................................69
19.3 Sao kiÓu d÷ liÖu ................................................................................................................................70
19.4 C©u lÖnh SELECT... INTO... trong PL/SQL......................................................................................70
19.5 Bµi tËp................................................................................................................................................70
20 procedure vµ funtion..........................................................................................................71
20.1 Procedure ..........................................................................................................................................71
20.2 Function.............................................................................................................................................72
20.3 Bµi tËp................................................................................................................................................73
21 pakage.........................................................................................................................................73
21.1 Package .............................................................................................................................................73
22 database trigger ..................................................................................................................74
22.1 Database Trigger...............................................................................................................................74
22.2 Bµi tËp................................................................................................................................................75
23 error handing .........................................................................................................................76
23.1 Bµi tËp................................................................................................................................................78
1 Giíi thiÖu
• HiÓu ®−îc ph−¬ng ph¸p, c¸c thµnh phÇn, thuËt ng÷ vµ thao t¸c trong CSDL quan hÖ
• T¹o ®−îc c¸c cÊu tróc d÷ liÖu nh− table, view dïng SQL
SQLDBA cung cÊp c¸c dÞch vô qu¶n trÞ hÖ thèng, nh−: t¹o lËp CSDL, më - ®ãng CSDL, t¹o vµ qu¶n lý c¸c
USER ... C¸c b−íc ®Ó khëi ®éng t¹i Server nh− sau:
• BËt dÞch vô OracleServiceXXX (trong ®ã XXX lµ tªn cña CSDL) b»ng c¸ch nhÊn vµo Start -> Program -
> Service -> OracleServiceXXX -> NhÊn chuét ph¶i -> NhÊn Start. Chó ý chØ bËt dÞch vô nµy khi ng−êi
cµi ®Æt kh«ng ®Ó chÕ ®é tù ®éng hay khi dÞch vô nµy ch−a ®−îc bËt.
• BËt dÞch vô OracleXXXTNSLÝstener (trong ®ã XXX lµ tªn cña Database Home) b»ng c¸ch nhÊn vµo
Start -> Program -> Service -> OracleXXXTNSLÝstener -> NhÊn chuét ph¶i -> NhÊn Start. Chó ý chØ bËt
dÞch vô nµy khi ng−êi cµi ®Æt kh«ng ®Ó chÕ ®é tù ®éng hay khi dÞch vô nµy ch−a ®−îc bËt.
• T¾t dÞch vô OracleXXXTNSLÝstener (trong ®ã XXX lµ tªn cña Database Home) b»ng c¸ch nhÊn vµo
Start -> Program -> Service -> OracleXXXTNSLÝstener -> NhÊn chuét ph¶i -> NhÊn Stop.
• T¾t dÞch vô OracleServiceXXX (trong ®ã XXX lµ tªn cña CSDL) b»ng c¸ch nhÊn vµo Start -> Program -
> Service -> OracleServiceXXX -> NhÊn chuét ph¶i -> NhÊn Stop.
C¸c øng dông cña oracle ch¹y trong m«i tr−êng Windows víi giao diÖn graphic, c¸c øng dông th−êng dïng
cã SQL*Plus, Oracle Form, Oracle Report, Oracle Designer ... ViÖc ch¹y c¸c øng dông nµy hoµn toµn gièng
nh− viÖc ch¹y c¸c øng dông th«ng th−êng trong m«i tr−êng windows.
§Ó lµm viÖc víi c¸c øng dông truy cËp CSDL Oracle, ng−êi sö dông (NSD) ph¶i connect vµo CSDL. Cã hai
c¸ch ®Ó connect.
Connect NSD/password, vÝ dô NSD tªn Scott cã password lµ tiger th×
Connect Scott/tiger
Ph¸t lÖnh connect víi tªn NSD, khi ®ã Oracle sÏ hái password
Connect Scott
Enter password: *****
NSD cã thÓ lµm viÖc trong ph¹m vi cho phÐp cña m×nh mµ Oracle gäi lµ "khung c¶nh" (Schema) cña NSD.
Mçi khung c¶nh chøa nhiÒu ®èi t−îng c¸c lo¹i, NSD chØ cã thÓ t¸c ®éng lªn c¸c ®èi t−îng trong khung c¶nh
cña m×nh.
Trong c¸c øng dông ®Òu cã chøc n¨ng tho¸t vµ tù ®éng disconnect.
§Ó thùc hµnh phÇn SQL vµ PL/SQL gäi øng dông SQL* Plus.
M« h×nh c¬ së d÷ liÖu (CSDL) quan hÖ do E.F Codd ®−a ra vµo ®Çu thËp kû 70, tõ ®ã ®Õn nay nã liªn tôc
ph¸t triÓn trë thµnh m« h×nh CSDL phæ biÕn bËc nhÊt (RDBMS). M« h×nh quan hÖ gåm c¸c thµnh phÇn sau:
• Rµng buéc d÷ liÖu ®¶m b¶o tÝnh chÝnh x¸c vµ nhÊt qu¸n.
SQL (Structured Query Language, ®äc lµ "sequel") lµ tËp lÖnh truy xuÊt CSDL quan hÖ. Ng«n ng÷ SQL ®−îc
IBM sö dông ®Çu tiªn trong hÖ qu¶n trÞ CSDL System R vµo gi÷a nh÷ng n¨m 70, hÖ ng«n ng÷ SQL ®Çu tiªn
(SEQUEL2) ®−îc IBM c«ng bè vµo th¸ng 11 n¨m 1976. N¨m 1979, tËp ®oµn ORACLE giíi thiÖu th−¬ng
phÈm ®Çu tiªn cña SQL, SQL còng ®−îc cµi ®Æt trong c¸c hÖ qu¶n trÞ CSDL nh− DB2 cña IBM vµ SQL/DS.
Ngµy nay, SQL ®−îc sö dông réng r·i vµ ®uîc xem lµ ng«n ng÷ chuÈn ®Ó truy cËp CSDL quan hÖ.
N¨m 1989, viÖn tiªu chuÈn quèc gia Hoa kú (ANSI) c«ng nhËn SQL lµ ng«n ng÷ chuÈn ®Ó truy cËp CSDL
quan hÖ trong v¨n b¶n ANSI SQL89.
N¨m 1989, tæ chøc tiªu chuÈn quèc tÕ (ISO) c«ng nhËn SQL ng«n ng÷ chuÈn ®Ó truy cËp CSDL quan hÖ
trong v¨n b¶n ISO 9075-1989.
TÊt c¶ c¸c hÖ qu¶n trÞ CSDL lín trªn thÕ giíi cho phÐp truy cËp b»ng SQL vµ hÇu hÕt theo chuÈn ANSI.
Table lµ cÊu tróc l−u tr÷ c¬ b¶n nhÊt trong CSDL quan hÖ (RDBMS), nã bao gåm 1 hoÆc nhiÒu
column vµ 0 hoÆc nhiÒu row.
Row lµ tæ hîp nh÷ng gi¸ trÞ cña Column trong b¶ng. Mét row cßn cã thÓ ®−îc gäi lµ 1 record.
Column hiÓn thÞ mét lo¹i d÷ liÖu trong b¶ng, vÝ dô tªn phßng ban trong b¶ng phßng ban. Ng−êi ta thÓ
hiÖn nã th«ng qua tªn column vµ gi÷ sè liÖu d−íi c¸c kiÓu vµ kÝch cì nhÊt ®Þnh.
Field lµ giao cña column vµ row. Field chÝnh lµ n¬i chøa d÷ liÖu. NÕu kh«ng cã d÷ liÖu trong field
ng−êi ta nãi field cã gia trÞ lµ null.
Primary Key lµ mét column hoÆc mét tËp c¸c column x¸c ®Þnh tÝnh duy nhÊt cña c¸c row ë trong b¶ng. VÝ dô
m· phßng ban. Primary Key nhÊt thiÕt ph¶i cã sè liÖu.
Foreign Key lµ mét column hoÆc mét tËp c¸c column tham chiÕu tíi chÝnh b¶ng ®ã hoÆc mét b¶ng kh¸c.
Foreign Key x¸c ®Þnh mèi quan hÖ gi÷a c¸c b¶ng.
VÝ dô:
EMP DEPT
Column
Table lµ cÊu tróc l−u tr÷ c¬ b¶n nhÊt trong CSDL quan hÖ (RDBMS), gåm row vµ column
View lµ cÊu tróc logic hiÓn thÞ d÷ liÖu tõ 1 hoÆc nhiÒu b¶ng
LÖnh M« t¶
SELECT
Lµ lÖnh th«ng dông nhÊt, dïng ®Ó lÊy, xem d÷ liÖu trong CSDL.
INSERT
Lµ 3 lÖnh dïng ®Ó nhËp thªm nh÷ng row míi, thay ®æi néi dung d÷ liÖu trªn c¸c row
UPDATE
hay xo¸ c¸c row trong table. Nh÷ng lÖnh nµy ®−îc gäi lµ c¸c lÖnh thao t¸c d÷ liÖu
DELETE
DML (Data Manipulation Language)
CREATE
Lµ 3 lÖnh dïng ®Ó thiÕt lËp, thay ®æi hay xo¸ bá cÊu tróc d÷ liÖu nh− lµ table, view,
ALTER
index. Nh÷ng lÖnh nµy ®−îc gäi lµ c¸c lÖnh ®Þnh nghÜa d÷ liÖu DDL (Data Definition
DROP
Language)
RENAME
TRUNCATE
COMMIT
Qu¶n lý viÖc thay ®æi d÷ liÖu b»ng c¸c lÖnh DML. ViÖc thay ®æi d÷ liÖu cã thÓ ®−îc
ROLLBACK
nhãm l¹i thµnh c¸c transaction.
SAVE POINT
GRANT
2 lÖnh nµy dïng ®Ó g¸n hoÆc huû c¸c quyÒn truy nhËp vµo CSDL Oracle vµ c¸c cÊu
REVOKE
tróc bªn trong nã. Nh÷ng lÖnh nµy ®−îc gäi lµ c¸c lÖnh ®iÒu khiÓn d÷ liÖu DCL (Data
Control Language)
DEPT EMP
SALGRADE
DUMMY BONUS
1.7.2 M« t¶ d÷ liÖu
SALGRADE
GRADE NUMBER PK Møc l¬ng
LOSAL NUMBER Gi¸ trÞ thÊp
HISAL NUMBER Gi¸ trÞ cao
EMP
EMPNO NUMBER(4) NOT NULL, PK M· nh©n viªn
ENAME CHAR(10), Tªn nh©n viªn
JOB CHAR(9), NghÒ nghiÖp
MGR NUMBER(4) FK (EMP.EMPNO) M· ng−êi qu¶n lý
HIREDATE DATE Ngµy gia nhËp c«ng ty
SAL NUMBER(7,2) L−¬ng
COMM NUMBER(7,2) Th−ëng
DEPTNO NUMBER(2) NOT NULL, FK (DEPT.DEPTNO) M· phßng ban
• SELECT tr¶ lêi c©u hái lÊy d÷ liÖu nµo? (column, biÓu thøc...), trong mÖnh ®Ò SELECT cÇn cã Ýt nhÊt
1 column.
• FROM tr¶ lêi c©u hái lÊy d÷ liÖu ë ®Çu? (table, view...)
• DISTINCT chØ ®Þnh hiÓn thÞ 1 lÇn c¸c d÷ liÖu trïng nhau.
Vd:
SELECT * FROM emp;
SELECT empno, ename, deptno, mgr FROM emp;
SELECT DISTINCT job nghenghiep FROM emp;
Trong mÖnh ®Ò SELECT cßn cã thÓ ®−a vµo c¸c thµnh phÇn kh¸c:
• Column alias
• Literal
Trong mÖnh ®Ò SELECT biÓu thøc to¸n häc cã thÓ c¸c gi¸ trÞ (column hoÆc hµng sè), c¸c to¸n tö, c¸c hµm.
C¸c to¸n tö ®−îc dïng lµ (+), (-), (*), (/). §é −u tiªn cña c¸c to¸n tö gièng trong phÇn sè häc. Vd:
SELECT ename, sal *12, comm FROM emp;
SELECT ename, (sal+250)*12 FROM emp;
Column alias
Trong mÖnh ®Ò SELECT, column alias lµ phÇn nh·n hiÓn thÞ cña column khi lÊy sè liÖu ra. Trong column
alias kh«ng ®−îc cã dÊu c¸ch vµ viÕt c¸ch sau tªn column mét dÊu c¸ch. Column alias ®−îc chÊp nhËn cã
dÊu c¸ch khi ®−îc ®Æt trong dÊu nh¸y kÐp (“ “).
To¸n tö ghÐp chuçi (||) cho phÐp c¸c column ®−îc nèi víi nhau thµnh d¹ng chuçi. Cã thÓ cã nhiÒu to¸n tö
ghÐp chuçi trong cïng mét column alias. Vd:
SELECT empno||ename EMPLOYEE FROM emp;
SELECT ename || ' co luong la ' || (sal+250)*12 as "mieu ta" FROM emp;
Chuçi ®Æt trong nh¸y ®¬n, bÝ danh ®Æt trong nh¸y kÐp
Literal
Trong mÖnh ®Ò SELECT, literal lµ bÊt kú ký tù nµo, biÓu thøc, hay sè nµp mµ kh«ng ph¶i lµ column hoÆc
column alias. Vd:
SELECT empno||ename EMPLOYEE, ‘WORK IN DEPARTMENT’, deptno FROM emp;
2.3 Gi¸ trÞ Null
Cét cã gi¸ trÞ rçng (NULL) lµ cét ch−a ®−îc g¸n gi¸ trÞ, nãi c¸ch kh¸c nã ch−a ®−îc khëi t¹o gi¸ trÞ. C¸c cét
víi bÊt cø kiÓu d÷ liÖu nµo còng cã thÓ cã trÞ NULL, trõ khi ®−îc nã lµ khãa hay cã rµng buéc toµn vÑn NOT
NULL. Trong biÓu thøc cã bÊt kú gi¸ trÞ NULL nµo kÕt qu¶ còng lµ NULL. Vd:
SELECT ename, sal*12 + comm ANUAL_SAL FROM emp;
- Trong c¸c hµm lµm viÖc víi tõng cét hay hµm v« h−íng (scalar function)
C¸c hµm lo¹i nµy tr¶ vÒ trÞ null khi cã tham sè null, trõ hµm NVL vµ TRANSLATE cã thÓ tr¶ vÒ gi¸ trÞ thùc.
- Trong c¸c hµm lµm viÖc víi nhãm c¸c cét (group function)
HÇu hÕt c¸c hµm lµm viÖc trªn nhãm bá qua trÞ null, vÝ dô nh− khi sö dông hµm AVG ®Ó tÝnh trung b×nh cho
mét cét cã c¸c gi¸ trÞ 1000, null, null, null, 2000 khi ®ã trung b×nh ®−îc tÝnh lµ (1000+2000)/2=1500, nh− vËy
trÞ null bÞ bá qua chø kh«ng ph¶i xem lµ trÞ 0.
§Ó kiÓm tra cã ph¶i null hay kh«ng dïng c¸c to¸n tö IS NULL hoÆc IS NOT NULL. NÕu trong biÓu thøc so
s¸nh cã trÞ null tham gia vµ kÕt qu¶ cña biÓu thøc phô thuéc vµo trÞ null th× kÕt qu¶ lµ kh«ng x¸c ®Þnh, tuy
nhiªn trong biÓu thøc DECODE, hai gi¸ trÞ null ®−îc xem lµ b»ng nhau trong phÐp so s¸nh.
ORACLE xem c¸c biÓu thøc víi kÕt qu¶ kh«ng x¸c ®Þnh t−¬ng ®−¬ng víi FALSE, vÝ dô comm = NULL cã kÕt
qu¶ kh«ng x¸c ®Þnh vµ do ®ã biÓu thøc so s¸nh xem nh− cho kÕt qu¶ FALSE. Trong c©u lÖnh sau kh«ng cã
mÉu tin nµo ®−îc chän
SELECT * FROM emp WHERE comm=NULL;
NÕu muèn chän c¸c nh©n viªn cã comm lµ NULL th× ph¶i dïng to¸n tö IS NULL
SELECT * FROM emp WHERE comm IS NULL;
Mét c©u lÖnh truy vÊn cã thÓ tr¶ vÒ c¸c row cã cïng gÝa trÞ. Vd:
SELECT JOB FROM EMP;
SELECT DEPTNO FROM EMP;
SELECT JOB, DEPTNO FROM EMP;
§µo t¹o c¬ b¶n: SQL vµ PL/SQL Trang 11
C«ng ty cæ phÇn ®Çu t− ph¸t triÓn c«ng nghÖ - FPT
Gi¸o tr×nh SQL vµ PL/SQL
§Ó läc lÊy mét gi¸ trÞ duy nhÊt ng−êi ta dïng mÖnh ®Ò DISTINCT. MÖnh ®Ò nµy ph¶i ®−îc ®Æt tr−íc tÊt c¶
c¸c column, sau mÖnh ®Ò SELECT. Vd:
SELECT DISTINCT JOB FROM EMP;
SELECT DISTINCT DEPTNO FROM EMP;
SELECT DISTINCT JOB, DEPTNO FROM EMP;
2.5 HiÓn thÞ cÊu tróc b¶ng
Có ph¸p
DESC[RIBE] table_name
(lÖnh nµy chØ ch¹y ®−îc trªn sqlplus, kh«ng ch¹y ®−îc trªn PL/SQL Develop)
VÝ dô:
DESC emp;
Name Null? Type
------------------------------- -------- ----
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
KiÓu d÷ liÖu NOT NULL nghÜa lµ column nhÊt ®Þnh ph¶i cã gi¸ trÞ.
LÖnh M« t¶
A[PPEND] text §−a thªm ®o¹n text vµo dßng hiÖn t¹i
C[HANGE] /old/new ChuyÓn ®o¹n text cò thµnh ®o¹n text míi trong dßng hiÖn t¹i
LÖnh M« t¶
SAVE filename [.ext] [REP[LACE]|APP[END]] Ghi néi dung bufer thµnh file. APPEND ®Ó ghi thªm
vµo file. REPLACE ®Ó chÌn lªn néi dung file cò.
GET filename [.ext] Ghi néi dung file vµo buffer. MÆc ®Þnh phÇn ®u«i lµ
.sql
SPO[OL] filename [.ext ] [OFF|OUT] CÊt kÕt qu¶ hiÓn thÞ trªn mµn h×nh ra file. Vd:
SPOOL result.sql
....
SPOOL OFF
Có ph¸p
COLUMN [{column | alias} [option]]
LÖnh M« t¶
JUS[TIFY] align C¸n tr¸i “ left , ph¶i - right, gi÷a - center cho nh·n
NOPRI[NT] Èn column
NUL[L] text HiÓn thÞ text nÕu gi¸ trÞ cña column lµ NULL
TRU[NCATED] Xo¸ chuçi t¹i cuèi dßng ®Çu tiªn khi hiÓn thÞ
L−u ý: c¸c ®Þnh d¹ng hiÓn thÞ nµy ®−îc l−u vµo bé nhí vµ ¸p dông cho mäi cét cã tªn nh− vËy, dï chóng ë
trong b¶ng nµo
14 rows selected.
6. HiÓn thÞ cÊu tróc b¶ng emp;
7. Thay ®æi nh·n vµ ®Þnh d¹ng hiÓn thÞ cña cét sal vµ hiredate trong b¶ng emp;
Có ph¸p
SELECT [DISTINCT ] {*, column [alias],...}
FROM table;
[WHERE condition]
[ORDER BY expr/position [DESC/ASC]]
MÖnh ®Ò ORDER BY dïng ®Ó s¾p xÕp sè liÖu ®−îc hiÓn thÞ vµ ph¶i ®Æt ë vÞ trÝ sau cïng cña c©u lÖnh truy
vÊn, VÝ dô:
SELECT ENAME, JOB, SAL*12, DEPTNO
FROM EMP
ORDER BY ENAME;
MÖnh ®Ó ORDER BY mÆc ®Þnh s¾p xÕp theo thø tù t¨ng dÇn ASC[ENDING]
• Sè thÊp tr−íc
§Ó s¾p xÕp theo thø tù ng−îc l¹i (gi¶m dÇn) ®Æt tõ kho¸ DESC[ENDING] sau column cÇn s¾p thø tù. Vi dô:
SELECT ENAME, JOB, HIREDATE
FROM EMP
ORDER BY HIREDATE DESC ;
Order nhiÒu column
MÖnh ®Ò Order cßn cã thÓ s¾p xÕp nhiÒu column. C¸c column cÇn s¾p xÕp ®−îc viÕt thø tù sau mÖnh ®Ò
ORDER BY vµ c¸ch bëi dÊu phÈy (,). Column nµo gÇn mÖnh ®Ó ORDER BY h¬n cã møc ®é −u tiªn khi s¾p
xÕp cao h¬n. ChØ ®Þnh c¸ch thøc s¾p xÕp ASC/DESC ®−îc viÕt sau column c¸ch bëi mét dÊu c¸ch. VÝ dô:
SELECT DEPTNO, JOB, ENAME, SAL
FROM EMP
ORDER BY DEPTNO, SAL DESC ;
Order gi¸ trÞ NULL
Riªng ®èi víi gi¸ trÞ NULL, nÕu s¾p xÕp theo thø tù ASCENDING sÏ n»m ë c¸c vÞ trÝ cuèi cïng.
Chó ý
Cã thÓ chØ ®Þnh s¾p xÕp theo thø tù c¸c column trong mÖnh ®Ò SELECT. VÝ dô:
SELECT DEPTNO, JOB, ENAME, SAL
FROM EMP
ORDER BY 2;
Có ph¸p
SELECT [DISTINCT ] {*, column [alias],...}
FROM table;
[WHERE condition (s)]
[ORDER BY expr/position [DESC/ASC]]
MÖnh ®Ò WHERE dïng ®Ó ®Æt ®iÒu kiÖn cho toµn bé c©u lÖnh truy vÊn. Trong mÖnh ®Ò WHERE cã thÓ cã
c¸c thµnh phÇn:
• Tªn column
• To¸n tö so s¸nh
VÝ dô:
SELECT DEPTNO, JOB, ENAME, SAL
FROM EMP
WHERE SAL BETWEEN 1000 AND 2000 ;
Truy vÊn d÷ liÖu víi nhiÒu ®iÒu kiÖn
MÖnh ®Ò WHERE cho phÐp ghÐp ®−îc nhiÒu ®iÒu kiÖn th«ng qua c¸c to¸n tö logic AND/OR. To¸n tö AND
yªu cÇu d÷ liÖu ph¶i tho¶ m·n c¶ 2 ®iÒu kiÖn. To¸n tö OR cho phÐp d÷ liÖu tho¶ m·n 1 trong 2 ®iÒu kiÖn. VÝ
dô:
SELECT DEPTNO, JOB, ENAME, SAL
FROM EMP
WHERE SAL BETWEEN 1000 AND 2000
AND JOB = ‘MANAGER’;
To¸n tö so s¸nh
• !=, ^=, '+, <\> : To¸n tö kh¸c hay kh«ng t−¬ng ®−¬ng
• [NOT] BETWEEN x AND y : [Kh«ng] lín h¬n hoÆc b»ng x vµ nhá h¬n hoÆc b»ng y.
• IN (danh s¸ch) : thuéc bÊt kú gi¸ trÞ nµo trong danh s¸ch
Chän nh©n viªn cã l−¬ng b»ng mét trong 2 gi¸ trÞ 1400 hoÆc 3000
SELECT * FROM emp WHERE sal IN (1400, 3000);
T×m tªn phßng ban nÕu phßng ®ã cã nh©n viªn lµm viÖc.
SELECT dname FROM dept WHERE EXISTS
(SELECT * FROM emp WHERE dept.deptno = emp.deptno);
x [NOT] LIKE y
SELECT ename FROM emp WHERE ename LIKE '%A\_B%'; ESCAPE '\'
V× ký hiÖu "_" dïng ®Ó ®¹i diÖn cho mét ký tù bÊt kú nªn nÕu kh«ng cã mÖnh ®Ò ESCAPE, c©u lÖnh trªn sÏ
t×m tÊt c¶ c¸c nh©n viªn tªn AAB, ABB, ACB, v.v... (nÕu kh«ng cã mÖnh ®Ò ESCAPE '\')
NÕu muèn ký hiÖu "_" mang ý nghÜa nguyªn thñy, tøc lµ kh«ng cßn ®¹i diÖn cho ký tù bÊt kú n÷a, ta ®Æt dÊu
"\" tr−íc ký hiÖu. §ång thêi khai b¸o thªm mÖnh ®Ò ESCAPE "\"
Ta còng cã thÓ dïng mét ký tù bÊt kú thay cho "\". Ch¼ng h¹n mÖnh ®Ò sau cã cïng kÕt qu¶ víi mÖnh ®Ò
trªn
SELECT ename FROM emp WHERE ename LIKE '%A^_B%'; ESCAPE '^'
Ta gäi c¸c ký tù nh− "\" hay "^" nãi trªn lµ c¸c ký tù ESCAPE.
IS [NOT] NULL
VÝ du
SELECT * FROM emp WHERE comm IS NULL ;
1. Chän nh©n viªn trong b¶ng EMP cã møc l−¬ng tõ 1000 ®Õn 2000 (chän c¸c tr−êng ENAME, DEPTNO,
SAL).
ENAME DEPTNO SAL
---------- ---------- ----------
ALLEN 30 1600
WARD 30 1250
MARTIN 30 1250
TURNER 30 1500
ADAMS 20 1100
MILLER 10 1300
Sal Between 1000 to 2000
2.HiÓn thÞ m· phßng ban, tªn phßng ban, s¾p xÕp theo thø tù tªn phßng ban.
DEPTNO DNAME
------ -----------
10 ACCOUNTING
40 OPERATIONS
20 RESEARCH
30 SALES
Order by dname
3. HiÓn thÞ danh s¸ch nh÷ng nh©n viªn lµm t¹i phßng 10 vµ 20 theo thø tù A,B,C
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ----------------- ----- ---------- ---------- ----- -----
7876 ADAMS CLERK 7788 12-01-1983 1100 20
7782 CLARK MANAGER 7839 09-06-1981 2450 10
7902 FORD ANALYST 7566 03-12-1981 3000 20
7566 JONES MANAGER 7839 02-04-1981 2975 20
7839 KING PRESIDENT 17-11-1981 5000 10
7934 MILLER CLERK 7782 23-01-1982 1300 10
7788 SCOTT ANALYST 7566 09-12-1982 3000 20
7369 SMITH CLERK 7902 17-12-1980 800 20
Where deptno in (10,20) order by ename asc
4. HiÓn thÞ tªn vµ nghÒ nghiÖp nh÷ng nh©n viªn lµm nghÒ th− ký (clerk) t¹i phßng 20.
ENAME JOB
---------- ---------
SMITH CLERK
ADAMS CLERK
Where upper(job)= upper('clerk') and deptno = '20'; (l−u ý vÊn ®Ò ch÷ Hoa-th−êng)
6. HiÓn thÞ tªn nh©n viªn, nghÒ nghiÖp, l−¬ng cña nh÷ng nh©n viªn cã gi¸m ®èc qu¶n lý.
ENAME JOB SAL
---------- --------- ----------
SMITH CLERK 800
ALLEN SALESMAN 1600
WARD SALESMAN 1250
JONES MANAGER 2975
13 rows selected.
7. HiÓn thÞ tªn nh©n viªn, m· phßng ban, ngµy gia nhËp c«ng ty sao cho gia nhËp c«ng ty trong n¨m 1983.
ENAME DEPTNO HIREDATE
---------- ---------- ---------
ADAMS 20 12-JAN-83
Where to_char(hiredate) like “%83“
8. HiÓn thÞ tªn nh©n viªn, l−¬ng mét n¨m (ANUAL_SAL ), th−ëng sao cho l−¬ng lín h¬n th−ëng vµ nghÒ
nghiÖp lµ SALEMAN, s¾p theo thø tù l−¬ng gi¶m dÇn vµ tªn t¨ng dÇn.
ANUAL_SAL COMM
---------- ----------
19200 300
18000 0
15000 500
n<0 cã SIGN(n)= -1
n=0 cã SIGN(n)= 0
n>0 cã SIGN(n)= 1
ABS(n) cho gi¸ trÞ tuyÖt ®èi =
MOD(m,n) cho phÇn d− cña phÐp chia m cho n =
Mét sè hµm kiÓu sè tham kh¶o kh¸c:
LOG(m,n) cho logarit c¬ sè m cña n =
VÝ dô hµm ROUND(n[,m])
SELECT ROUND(4.923,1),
ROUND(4.923),
ROUND(4.923,-1),
ROUND(4.923,2)
FROM DUMMY;
EXP(4)
§µo t¹o c¬ b¶n: SQL vµ PL/SQL Trang 21
C«ng ty cæ phÇn ®Çu t− ph¸t triÓn c«ng nghÖ - FPT
Gi¸o tr×nh SQL vµ PL/SQL
----------
54.59815
VÝ dô hµm SQRT(n)
SELECT SAL, SQRT(SAL), SQRT(40), SQRT (COMM)
FROM EMP
WHERE DEPTNO =10;
SAL-NVL(COMM,0)SIGN(SAL-NVL(COMM,0))NVL(COMM,0)-SAL SIGN(NVL(COMM,0)-SAL)
--------------- ----------- --------------- ---------------------
2850 1 -2850 -1
-150 -1 150 1
1300 1 -1300 -1
1500 1 -1500 -1
950 1 -950 -1
750 1 -750 -1
CONCAT(char1, char2) cho kÕt hîp cña 2 chuçi ký tù, t−¬ng tù nh− sö dông to¸n tö ||
LPAD(char1, n [,char2]) cho chuçi ký tù cã chiÒu dµi b»ng n. NÕu chuçi char1 ng¾n h¬n n th× thªm vµo
bªn tr¸i chuçi char2 cho ®ñ n ký tù. NÕu chuçi char1 dµi h¬n n th× gi÷ l¹i n ký
tõ tÝnh tõ tr¸i sang
NLS_INITCAP(char) cho chuçi víi ký tù ®Çu c¸c tõ lµ ch÷ hoa, c¸c ch÷ cßn l¹i lµ ch÷ th−êng
SUBSTR(char, m [,n]) cho chuçi con cña chuçi char lÊy tõ vÞ trÝ m vÕ ph¶i n ký tù, nÕu kh«ng chØ n th×
lÊy cho ®Õn cuèi chuçi
TRANSLATE(char, from, to) cho chuçi trong ®ã mçi ký tù trong chuçi from thay b»ng ký tù t−¬ng øng trong
chuçi to, nh÷ng ký tù trong chuçi from kh«ng cã t−¬ng øng trong chuçi to sÏ bÞ
lo¹i bá.
ASCII(char) cho ký tù ASCII cña byte ®Çu tiªn cña chuçi char
INSTR(char1, char2 [,n[,m]]) t×m vÞ trÝ chuçi char2 trong chuçi char1 b¾t ®Çu tõ vÞ trÝ n, lÇn xuÊt hiÖn thø m.
VÝ dô hµm LOWER(char)
SELECT LOWER(DNAME), LOWER(‘SQL COURSE’) FROM DEPT;
LOWER(DNAME) LOWER('SQL
-------------- ----------
accounting sql course
research sql course
sales sql course
operations sql course
VÝ dô hµm UPPER(char)
SELECT ENAME FROM EMP WHERE ENAME = UPPER(‘Smith’);
ENAME
----------
SMITH
VÝ dô hµm INITCAP(char)
SELECT INITCAP(DNAME), INITCAP(LOC) FROM DEPT;
INITCAP(DNAME) INITCAP(LOC)
-------------- -------------
Accounting New York
Research Dallas
Sales Chicago
Operations Boston
VÝ dô hµm CONCAT(char1, char2)
SELECT CONCAT(ENAME, JOB) JOB FROM EMP WHERE EMPNO = 7900;
JOB
-------------------
JAMES CLERK
VÝ dô hµm LPAD(char1, n [,char2])
SELECT LPAD(DNAME,20,’*’), LPAD(DNAME,20), LPAD(DEptno,20,’ ’)
FROM DEPT;
ENAME SOUN
---------- ----
FORD F630
VÝ dô hµm LENGTH(char)
SELECT LENGTH(‘SQL COURSE’), LENGTH(DEPTNO), LENGTH(DNAME) FROM DEPT;
§µo t¹o c¬ b¶n: SQL vµ PL/SQL Trang 24
C«ng ty cæ phÇn ®Çu t− ph¸t triÓn c«ng nghÖ - FPT
Gi¸o tr×nh SQL vµ PL/SQL
NEXT_DAY(d, char ) cho ngµy tiÕp theo ngµy d cã thø chØ bëi char.
FROM EMP
WHERE MONTHS_BETWEEN( SYSDATE,HIREDATE)>240;
MONTHS_BETWEEN(SYSDATE,HIREDATE) TWEEN('01-01-2000','05-10-2000')
-------------------------------- --------------------------------
241.271055 -9.1290323
241.206539 -9.1290323
243.367829 -9.1290323
VÝ dô hµm ADD_MONTHS(d,n)
SELECT HIREDATE, ADD_MONTHS(HIRE,3), ADD_MONTHS(HIREDATE,-3)
FROM EMP
WHERE DEPTNO=20;
ROUND(date1) tr¶ vÒ ngµy date 1 t¹i thêi ®iÓm gi÷a tr−a 12:00 AM
ROUND(date1,’MONTH’) NÕu date 1 n»m trong nöa th¸ng ®Çu tr¶ vÒ ngµy ®Çu tiªn cña thµng, ng−îc l¹i
sÏ tr¶ vÒ ngµy ®Çu tiªn cña th¸ng sau.
ROUND(date1,’YEAR’) NÕu date 1 n»m trong nöa n¨m ®Çu tr¶ vÒ ngµy ®Çu tiªn cña thµng, ng−îc l¹i
sÏ tr¶ vÒ ngµy ®Çu tiªn cña n¨m sau.
TRUNC(date1, ’MONTH’) Tr¶ vÒ ngµy ®Çu tiªn cña th¸ng chøa date1
TRUNC(date1, ’YEAR’) Tr¶ vÒ ngµy ®Çu tiªn cña n¨m chøa date1
TO_DATE(‘chsr’,’fmt’) ChuyÓn ký tù sang kiÓu ngµy víi ®Þnh d¹ng ®Æt trong fmt.
So s¸nh biÓu thøc expr víi gi¸ trÞ search nÕu ®óng tr¶ vÒ gi¸ trÞ
result nÕu kh«ng tr¶ vÒ gi¸ trÞ default.
NVL(COL|VALUE, VAL) ChuyÓn gi¸ trÞ COL|VALUE thµnh val nÕu null.
Greatest(col|value1, col|value2) Tr¶ gi¸ trÞ lín nhÊt trong d·y gi¸ trÞ.
Vd:
SELECT To_char (sysdate, ‘day, ddth month yyyy’) from dummy;
1. LiÖt kª tªn nh©n viªn, m· phßng ban vµ l−¬ng nh©n viªn ®−îc t¨ng 15% (PCTSAL).
DEPTNO ENAME PCTSAL
---------- ---------- ----------
10 KING 5000
30 BLAKE 2850
10 CLARK 2450
20 JONES 2975
30 MARTIN 1250
30 ALLEN 1600
30 TURNER 1500
30 JAMES 950
30 WARD 1250
20 FORD 3000
20 SMITH 800
20 SCOTT 3000
20 ADAMS 1100
10 MILLER 1300
2. ViÕt c©u lÖnh hiÓn thÞ nh− sau:
EMPLOYEE_AND_JOB
--------------------
KING*******PRESIDENT
BLAKE********MANAGER
CLARK********MANAGER
JONES********MANAGER
MARTIN******SALESMAN
ALLEN*******SALESMAN
TURNER******SALESMAN
JAMES**********CLERK
WARD********SALESMAN
FORD*********ANALYST
SMITH**********CLERK
SCOTT********ANALYST
ADAMS**********CLERK
MILLER*********CLERK
3. ViÕt c©u lÖnh hiÓn thÞ nh− sau:
EMPLOYEE
-----------------
KING (President)
BLAKE (Manager)
CLARK (Manager)
JONES (Manager)
MARTIN (Salesman)
ALLEN (Salesman)
TURNER (Salesman)
JAMES (Clerk)
WARD (Salesman)
FORD (Analyst)
SMITH (Clerk)
SCOTT (Analyst)
ADAMS (Clerk)
MILLER (Clerk)
4. ViÕt c©u lÖnh hiÓn thÞ nh− sau:
ENAME DEPTNO JOB
---------- ---------- ---------------
BLAKE 30 Manager
MARTIN 30 Salesperson
ALLEN 30 Salesperson
TURNER 30 Salesperson
JAMES 30 Clerk
WARD 30 Salesperson
5. T×m ngµy thø 6 ®Çu tiªn c¸ch 2 th¸ng so víi ngµy hiÖn t¹i hiÓn thÞ ngµy d−íi d¹ng 09 February 1990.
6. T×m th«ng itn vÒ tªn nh©n viªn, ngµy gia nhËp c«ng ty cña nh©n viªn phßng sè 20, sao cho hiÓn thÞ nh−
sau:
ENAME DATE_HIRED
---------- --------------------------
JONES april,SECOND 1981
FORD december,THIRD 1981
SMITH december,SEVENTEENTH 1980
SCOTT december,NINTH 1982
ADAMS january,TWELFTH 1983
7. HiÓn thÞ tªn nh©n viªn, ngµy gia nhËp c«ng ty, ngµy xÐt n©ng l−¬ng (sau ngµy gia nhËp c«ng ty 1 n¨m),
s¾p xÕp theo thø tù ngµy xÐt n©ng l−¬ng.
ENAME SALARY
---------- ------------
ADAMS BELOW 1500
ALLEN 1600
BLAKE 2850
CLARK 2450
FORD 3000
JAMES BELOW 1500
JONES 2975
KING 5000
MARTIN BELOW 1500
MILLER BELOW 1500
SCOTT 3000
SMITH BELOW 1500
TURNER On Target
WARD BELOW 1500
9. Cho biÕt thø cña ngµy hiÖn t¹i
10. §−a chuçi d−íi d¹ng nn/nn, kiÓm tra nÕu khóng khu«n d¹ng tr¶ lêi lµ YES, ng−îc l¹i lµ no. KiÓm tra víi
c¸c chuçi 12/34, 01/1a, 99\88
VALUE VALID?
----- -------
12/34 YES
11. HiÓn thÞ tªn nh©n viªn, ngµy gia nhËp c«ng ty, ngµy lÜnh l−¬ng sao cho ngµy lÜnh l−¬ng ph¶i vµo thø 6,
nh©n viªn chØ ®−îc nhËn l−¬ng sau Ýt nhÊt 15 ngµy lµm viÖc t¹i c«ng ty, s¾p xÕp theo thø tù ngµy gia nhËp
c«ng ty.
5 BiÕn runtime
NÕu dïng (&&) chØ biÕn thay thÕ th× sau c©u lÖnh biÕn thay thÕ vÉn cßn tån t¹i
VÝ dô
SELECT * FROM emp
WHERE &Condition
VÝ du 2:
Select ename, deptno, job
From emp
Where deptno = &&depno_please;
LÖnh Define
Khai b¸o vµ g¸n trÞ cho c¸c biÕn, vÝ dô khai b¸o biÕn condition cã tri 'sal > 1000'
DEFINE condition = 'sal > 1000'
Khi ®ã c©u lÖnh sau kh«ng yªu cÇu nhËp vµo gi¸ trÞ cho codition
SELECT * FROM emp
WHERE &Condition
§µo t¹o c¬ b¶n: SQL vµ PL/SQL Trang 31
C«ng ty cæ phÇn ®Çu t− ph¸t triÓn c«ng nghÖ - FPT
Gi¸o tr×nh SQL vµ PL/SQL
Khai b¸o vµ g¸n trÞ cho biÕn víi dßng hiÓn thÞ
ACCEPT variable [NUMBER/CHAR] [PROMPT/NOPROMPT 'text'] HIDE
VÝ dô
ACCEPT Salary NUMBER PROMPT 'Salary figure: '
Salary figure : 3000
Tõ kho¸ hide cho phÐp che chuçi nhËp liÖu, hay dïng khi nhËp password.
ACCEPT password CHAR PROMPT 'Enter password: ' HIDE
Password : ******
5.1 Bµi tËp
1. HiÓn thÞ tªn nh©n viªn, ngµy gia nhËp c«ng ty víi ®iÒu kiÖn ngµy gia nhËp c«ng ty n»m trong kho¶ng hai
biÕn runtime ®−îc nhËp vµo tõ bµn phÝm (&first_date, &last_date).
2. HiÓn thÞ tªn nh©n viªn, nghÒ nghiÖp, l−¬ng, m· gi¸m ®èc, m· phßng ban víi ®iÒu kiÖn nghÒ nghiÖp b»ng
mét biÕn ®−îc nhËp vµo tõ bµn phÝm. (&job)
3. §Þnh nghÜa mét biÕn tÝnh thu nhËp mét n¨m cña nh©n viªn. Dïng biÕn nµy ®Ó t×m nh÷ng nh©n viªn cã thu
nhËp lín h¬n hoÆc b»ng $30000.
4. §Þnh nghÜa mét biÕn lµ kho¶ng thêi gian nh©n viªn lµm trong c«ng ty. HiÓn thÞ tªn nh©n viªn vµ qu·ng thêi
gian nh©n viªn ®ã lµm viÖc víi ®iÒu kiÖn nh©n viªn lµ mét biÕn ®−îc nhËp vµo tõ bµn phÝm.
ENAME LENGTH OF SERVICE
---------- ---------------------
KING 19 YEAR 4 MONTHS
6 C¸c hµm nhãm ¸p dông cho lín h¬n hoÆc b»ng 1 dßng d÷ liÖu
C¸c hµm t¸c ®éng trªn nhãm c¸c dßng d÷ liÖu t¸c ®éng lªn mét tËp hîp c¸c c¸c dßng d÷ liÖu. Gåm c¸c
hµm:
Chó ý tÊt c¶ c¸c hµm trªn nhãm mÉu tin ®Òu bá qua gi¸ trÞ NULL trõ hµm COUNT. Dïng hµm NVL ®Ó
chuyÓn ®æi vµ tÝnh gi¸ trÞ NULL.
• T¸c ®éng trªn toµn bé c¸c dßng d÷ liÖu cña c©u lÖnh truy vÊn
• T¸c ®éng trªn mét nhãm d÷ liÖu cïng tÝnh chÊt cña c©u lÖnh truy vÊn. Cïng tÝnh chÊt ®−îc chØ bëi mÖnh
®Ò
[GROUP BY expr]
[HAVING condition]
VÝ dô T¸c ®éng trªn toµn bé c¸c dßng d÷ liÖu cña c©u lÖnh truy vÊn:
Select AVG(SAL)
FROM EMP:
/TÝnh møc l−¬ng trung b×nh cña toµn bé nh©n viªn /
Select MIN(SAL)
FROM EMP
WHERE JOB =’CLERK’:
/TÝnh møc l−¬ng thÊp nhÊt cña nh©n viªn lµm nghÒ CLERK /
VÝ dô t¸c ®éng trªn mét nhãm d÷ liÖu cïng tÝnh chÊt cña c©u lÖnh truy vÊn.
SELECT JOB, AVG(SAL)
FROM EMP
GROUP BY JOB;
/ TÝnh møc l−¬ng trung b×nh cña tõng lo¹i nghÒ nghiÖp/
Chó ý: ChØ ®−îc cïng ®Æt trong mÖnh ®Ó SELECT c¸c hµm nhãm hoÆc c¸c column ®· ®Æt trong mÖnh ®Ò
GROUP BY. VÝ dô
§óng: SELECT MAX(SAL), JOB FROM EMP GROUP BY JOB;
Có ph¸p:
SELECT [DISTINCT ] {*, column [alias],...}
FROM table;
[WHERE condition]
[GROUP BY expr]
[HAVING
[HAVING condition]
[ORDER BY expr/position [DESC/ASC]]
MÖnh ®Ò GROUP BY sÏ nhãm c¸c dßng d÷ liÖu cã cïng gi¸ trÞ cña expr. VÝ dô GROUP BY JOB nghÜa lµ sÏ
nhãm c¸c nghÒ gièng nhau.
MÖnh ®Ò HAVING lµ ®Æt ®iÒu kiÖn cña nhãm d÷ liÖu. MÖnh ®Ò nµy kh¸c mÖnh ®Ò WHERE ë chç mÖnh ®Ò
WHERE ®Æt ®iÒu kiÖn cho toµn bé c©u lÖnh SELECT. VÝ dô:
SELECT JOB, MAX(SAL)
FROM EMP
WHERE JOB !=’MANAGER’
GROUP BY JOB;
JOB MAX(SAL)
--------- ----------
ANALYST 3000
CLERK 1300
PRESIDENT 5000
SALESMAN 1600
JOB MAX(SAL)
--------- ----------
CLERK 1300
SALESMAN 1600
HAVING MAX(SAL)>=3000
GROUP BY JOB;
JOB MAX(SAL)
--------- ----------
ANALYST 3000
PRESIDENT 5000
1. T×m l−¬ng thÊp nhÊt, lín nhÊt vµ l−¬ng trung b×nh cña tÊt c¶ c¸c nh©n viªn
2. t×m l−¬ng nhá nhÊt vµ lín cña mçi lo¹i nghÒ nghiÖp
3. T×m xem cã bao nhiªu gi¸m ®èc trong danh s¸ch nh©n viªn.
4. T×m tÊt c¶ c¸c phßng ban mµ sè nh©n viªn trong phßng >3
5. T×m ra møc l−¬ng nhá nhÊt cña mçi nh©n viªn lµm viÖc cho mét gi¸m ®èc nµo ®ã s¾p xÕp theo thø tù t¨ng
dÇn cña møc l−¬ng.
• §Ó liªn kÕt trong mÖnh ®Ó WHERE ph¶i chØ râ tªn cña c¸c column vµ mÖnh ®Ò ®−îc ®Æt t−¬ng ®−¬ng.
Vd: emp.deptno =dept.deptno
• C¸c column trïng tªn ph¶i ®−îc chØ râ column ®ã n»m ë b¶ng n¶o th«ng qua tªn hoÆc qua alias. Tªn
trïng nµy cã thÓ ®Æt trong c¸c mÖnh ®Ò kh¸c nh− SELECT, ORDER BY..
Vd:
SELECT DEPT.DEPTNO, ENAME,JOB, DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
ORDER BY DEPT.DEPTNO;
• §Ó liªn kÕt trong mÖnh ®Ó WHERE ph¶i chØ râ tªn cña c¸c column vµ mÖnh ®Ò ®−îc ®Æt KH¤NG t−¬ng
®−¬ng.
Vd: WHERE E.SAL BETWEEN S. LOSAL AND S.HISAL
• C¸c column trïng tªn ph¶i ®−îc chØ râ column ®ã n»m ë b¶ng nµo th«ng qua tªn hoÆc qua alias. Tªn
trïng nµy cã thÓ ®Æt trong c¸c mÖnh ®Ò kh¸c nh− SELECT, ORDER BY..
VD:
SELECT E.ENAME,E.JOB, S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S. LOSAL AND S.HISAL;
§iÒu kiÖn liªn kÕt ®óng lµ sè c¸c b¶ng - 1 = sè c¸c ®iÒu kiÖn liªn kÕt
§µo t¹o c¬ b¶n: SQL vµ PL/SQL Trang 35
C«ng ty cæ phÇn ®Çu t− ph¸t triÓn c«ng nghÖ - FPT
Gi¸o tr×nh SQL vµ PL/SQL
• Mét c©u lÖnh select chØ ®Æt ®−îc 1 mèi liªn kÕt céng, dÊu (+) ®Æt ë bªn ph¶i column liªn kÕt
• Trong mÖnh ®Ò WHERE cña mèi liªn kÕt céng kh«ng ®−îc dïng to¸n tö IN hoÆc OR ®Ó nèi c¸c ®iÒu
kiÖn liªn kÕt kh¸c.
Vd:
SELECT E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO (+)=D.DEPTNO
AND D.DEPTNO IN (30, 40);
Cã thÓ liªn kÐt b¶ng víi chÝnh nã b»ng c¸ch ®Æt alias. VÝ du:
Select e.ename emp_name, e.sal emp_sal,
m.ename mgr_name, m.sal mgr_sal
from emp e, emp m
where e.mgr = m.empno
and e.sal <m.sal;
Vd:
Select job from emp where deptno = 10
Union
Select job from emp where deptno = 30;
§µo t¹o c¬ b¶n: SQL vµ PL/SQL Trang 36
C«ng ty cæ phÇn ®Çu t− ph¸t triÓn c«ng nghÖ - FPT
Gi¸o tr×nh SQL vµ PL/SQL
JOB
---------
CLERK
MANAGER
PRESIDENT
SALESMAN
1. HiÓn thÞ toµn bé tªn nh©n viªn vµ tªn phßng ban lµm viÖc s¾p xÕp theo tªn phßng ban.
2. HiÓn thÞ tªn nh©n viªn, vÞ trÝ ®Þa lý, tªn phßng víi ®iÒu kiÖn l−¬ng >1500.
ENAME LOC DNAME
---------- ------------- -----------
KING NEW YORK ACCOUNTING
BLAKE CHICAGO SALES
CLARK NEW YORK ACCOUNTING
JONES DALLAS RESEARCH
ALLEN CHICAGO SALES
FORD DALLAS RESEARCH
SCOTT DALLAS RESEARCH
3. HiÓn thÞ tªn nh©n viªn, nghÒ nghiÖp, l−¬ng vµ møc l−¬ng.
ENAME JOB SAL GRADE
---------- --------- ---------- ----------
JAMES CLERK 950 1
SMITH CLERK 800 1
ADAMS CLERK 1100 1
MARTIN SALESMAN 1250 2
WARD SALESMAN 1250 2
MILLER CLERK 1300 2
ALLEN SALESMAN 1600 3
TURNER SALESMAN 1500 3
BLAKE MANAGER 2850 4
CLARK MANAGER 2450 4
JONES MANAGER 2975 4
FORD ANALYST 3000 4
SCOTT ANALYST 3000 4
KING PRESIDENT 5000 5
4. HiÓn thÞ tªn nh©n viªn, nghÒ nghiÖp, l−¬ng vµ møc l−¬ng, víi ®iÒu kiÖn møc l−¬ng = 3.
ENAME JOB SAL GRADE
---------- --------- ---------- ----------
ALLEN SALESMAN 1600 3
TURNER SALESMAN 1500 3
5. HiÓn thÞ nh÷ng nh©n viªn t¹i DALLAS
ENAME LOC SAL
---------- ------------- ----------
JONES DALLAS 2975
FORD DALLAS 3000
SMITH DALLAS 800
SCOTT DALLAS 3000
ADAMS DALLAS 1100
6. HiÓn thÞ tªn nh©n viªn , nghÒ nghiÖp, l−¬ng, møc l−¬ng, tªn phßng lµm viÖc trõ nh©n viªn cã nghÒ lµ cleck
vµ s¾p xÕp theo chiÒu gi¶m.
ENAME JOB SAL GRADE DNAME
---------- --------- ---------- ---------- --------------
MARTIN SALESMAN 1250 2 SALES
WARD SALESMAN 1250 2 SALES
ALLEN SALESMAN 1600 3 SALES
TURNER SALESMAN 1500 3 SALES
§µo t¹o c¬ b¶n: SQL vµ PL/SQL Trang 37
C«ng ty cæ phÇn ®Çu t− ph¸t triÓn c«ng nghÖ - FPT
Gi¸o tr×nh SQL vµ PL/SQL
7. HiÓn thÞ chi tiÕt vÒ nh÷ng nh©n viªn kiÕm ®−îc 36000 $ 1 n¨m hoÆc nghÒ lµ cleck. (gåm c¸c tr−êng tªn,
nghÒ, thu nhËp, m· phßng, tªn phßng, møc l−¬ng)
ENAME JOB ANUAL_SAL DNAME GRADE
---------- --------- ---------- -------------- ----------
JAMES CLERK 11400 SALES 1
SMITH CLERK 9600 RESEARCH 1
ADAMS CLERK 13200 RESEARCH 1
MILLER CLERK 15600 ACCOUNTING 2
FORD ANALYST 36000 RESEARCH 4
SCOTT ANALYST 36000 RESEARCH 4
8. HiÓn thÞ nh÷ng phßng kh«ng cã nh©n viªn nµo lµm viÖc.
DEPTNO DNAME LOC
---------- -------------- -------------
40 OPERATIONS BOSTON
9. HiÓn thÞ m· nh©n viªn, tªn nh©n viªn, m· ng−êi qu¶n lý, tªn ng−êi qu¶n lý
10. Nh− c©u 9 hiÓn thÞ thªm th«ng tin vÒ «ng KING.
EMP_NAME EMP_SAL MGR_NAME MGR_SAL
---------- ---------- ---------- ----------
KING 5000
BLAKE 2850 KING 5000
CLARK 2450 KING 5000
JONES 2975 KING 5000
MARTIN 1250 BLAKE 2850
ALLEN 1600 BLAKE 2850
TURNER 1500 BLAKE 2850
JAMES 950 BLAKE 2850
WARD 1250 BLAKE 2850
FORD 3000 JONES 2975
SMITH 800 FORD 3000
SCOTT 3000 JONES 2975
ADAMS 1100 SCOTT 3000
MILLER 1300 CLARK 2450
13 rows selected.
11. HiÓn thÞ nghÒ nghiÖp ®−îc tuyÓn dông vµo n¨m 1981 vµ kh«ng ®−îc tuyÓn dông vµo n¨m 1994.
12. T×m nh÷ng nh©n viªn gia nhËp c«ng ty tr−íc gi¸m ®èc cña hä.
ENAME JOB
---------- --------
BLAKE MANAGER
CLARK MANAGER
JONES MANAGER
DEPTNO AVG(SAL)
--------- ----------
10 2916.66667
20 2175
SELECT * FROM emp WHERE sal = ANY (SELECT sal FROM emp WHERE deptno=30);
SELECT * FROM emp WHERE sal >= ALL ( select distinct sal From emp Where deptno =30)
Order by sal desc;
SELECT ENAME, SAL, JOB, DEPTNO
FROM EMP
WHERE SAL > SOME ( SELECT DISTINCT SAL
FROM EMP
WHERE DEPTNO =30)
ORDER BY SAL DESC;
Trong mét table cña CSDL ORACLE cã thÓ hiÖn cÊu tróc h×nh c©y. VÝ dô trong b¶ng EMP cÊu tróc thÓ hiÖn
cÊp ®é qu¶n lý.
Mgr =7839
ADAMS SMITH
Level
Level lµ mét cét gi¶ chøa cÊp ®é trong cÊu tróc h×nh c©y. VÝ dô.
SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR is NULL;
Cã thÓ ®Þnh nghÜa quan hÖ thõa kÕ trong c©u hái b»ng mÖnh ®Ò STAR WITH vµ CONNECT BY trong c©u
lªnh SELECT, mçi mÇu tin lµ mét node trong c©y ph©n cÊp. Cét gi¶ LEVEL cho biÕt cÊp cña mÉu tin hay cÊp
cña node trong quan hÖ thõa kÕ.
Có ph¸p:
SELECT [DISTINCT/ALL] [expr [c_ias]]
FROM [table/view/snapshot] [t_alias]
[WHERE condition]
[START WITH condition CONNECT BY PRIOR condition]
[GROUP BY expr] [HAVING condition]
[UNION/UNION ALL/INTERSET/MINUS select command]
[ORDER BY expr/position [DESC/ASC]]
Trong ®ã:
• START WITH §Æc t¶ ®iÓm ®Çu cña h×nh c©y. Kh«ng thÓ ®Ó column gi¶ level ë mÖnh ®Ó nµy.
• PRIOR §Þnh h−íng cÊu tróc. NÕu prior xuÊt hiÖn tr−íc mgr, Mgr sÏ ®−îc t×m tr−íc sau ®ã ®Õn
empno, ®©y lµ h×nh c©y h−íng lªn. NÕu prior xuÊt hiÖn tr−íc empno, empno sÏ ®−îc t×m tr−íc sau ®ã
®Õn empno, ®©y lµ h×nh c©y h−íng xuèng.
VÝ dô
SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR MGR = EMPNO
START WITH empno = 7876;
MÖnh ®Ò WHERE vµ CONNECT BY cã thÓ ®−îc dïng ®ång thêi trong cÊu tróc h×nh c©y. NÕu mÖnh ®Ò
WHERE lo¹i trõ mét sè row cña cÊu tróc h×nh c©y th× chØ nh÷ng row ®ã ®−îc lo¹i trõ. NÕu ®iÒu kiÖn ®Æt trong
mÖnh ®Ò CONNECT BY th× toµn bé nh¸nh cña row ®ã bÞ lo¹i trõ. V× dô
1.
SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL
FROM EMP WHERE ENAME != ‘SCOTT’
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL;
2.
SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO = MGR AND ENAME != ‘SCOTT’
START WITH MGR IS NULL;
1. T×m tÊt c¶ c¸c nh©n viªn, ngµy gia nhËp c«ng ty, tªn nh©n viªn, tªn ng−êi gi¸m ®èc vµ ngµy gia nhËp
c«ng ty cña ng−êi gi¸m ®èc Êy.
EMP_NAME EMP_SAL MGR_NAME MGR_SAL
---------- ---------- ---------- ----------
BLAKE 2850 BLAKE 2850
MARTIN 1250 BLAKE 2850
ALLEN 1600 BLAKE 2850
TURNER 1500 BLAKE 2850
JAMES 950 BLAKE 2850
13 rows selected.
2. T×m nh÷ng nh©n viªn kiÕm ®−îc l−¬ng cao nhÊt trong mçi lo¹i nghÒ nghiÖp.
JOB MAX(SAL)
--------- ---------
ANALYST 3000
CLERK 1300
MANAGER 2975
PRESIDENT 5000
SALESMAN 1600
3. T×m møc l−¬ng cao nhÊt trong mçi phßng ban, s¾p xÕp theo thø tù phßng ban.
ENAME JOB DEPTNO SAL
---------- --------- ---------- ----------
KING PRESIDENT 10 5000
SCOTT SALEMAN 20 3300
BLAKE MANAGER 30 2850
4. T×m nh©n viªn gia nhËp vµo phßng ban sím nhÊt
ENAME HIREDATE DEPTNO
---------- ---------- ----------
CLARK 09-06-1981 10
SMITH 17-12-1980 20
ALLEN 20-02-1981 30
5. HiÓn thÞ nh÷ng nh©n viªn cã møc l−¬ng lín h¬n l−¬ng TB cña phßng ban mµ hä lµm viÖc.
EMPNO ENAME SAL DEPTNO
---------- ---------- ---------- ----------
7839 KING 5000 10
7566 JONES 2975 20
7902 FORD 3000 20
7788 SCOTT 3300 20
7698 BLAKE 2850 30
7499 ALLEN 1600 30
6. HiÓn thÞ tªn nh©n viªn, m· nh©n viªn, m· gi¸m ®èc, tªn gi¸m ®èc, phßng ban lµm viÖc cña gi¸m ®èc, møc
l−¬ng cña gi¸m ®èc.
EMP_NUMBER EMP_NAME EMP_SAL MGR_NUMBER MGR_NAME MGR_DEPT MGR_GRADE
---------- --------------- ---------- ---------- ---------- ----------
7698 BLAKE 2850 7698 BLAKE 30 4
7654 MARTIN 1250 7698 BLAKE 30 4
7499 ALLEN 1600 7698 BLAKE 30 4
7844 TURNER 1500 7698 BLAKE 30 4
7900 JAMES 950 7698 BLAKE 30 4
7521 WARD 1250 7698 BLAKE 30 4
7782 CLARK 2450 7782 CLARK 10 4
7934 MILLER 1300 7782 CLARK 10 4
7566 JONES 2975 7566 JONES 20 4
7902 FORD 3000 7566 JONES 20 4
7369 SMITH 800 7566 JONES 20 4
7788 SCOTT 3300 7566 JONES 20 4
7876 ADAMS 1100 7566 JONES 20 4
13 rows selected.
§Ó t¹o mét b¶ng míi dïng lÖnh CREATE TABLE, Có ph¸p nh− sau:
CREATE TABLE tablename
(column [datatype][DEFAULT expr][column_constraint]..) [table_constraint])
[PCTFREE integer][PCTUSED integer]
[INITRANS integer][MAXTRANS integer]
[TABLESPACE tablespace]
[STORAGE storage_clause]
[AS subquery]
Trong ®ã:
tablename : Tªn table cÇn t¹o
column : Tªn column trong table
[datatype] : KiÓu d÷ liÖu cña column
[DEFAULT expr] : Gi¸ trÞ mÆc ®Þnh cña column trong tr−êng hîp
NULL lµ expr
[column_constraint] : Rµng buéc cña b¶n th©n column
[table_constraint] : rµng buéc cña toµn b¶ng
[PCTFREE integer] : % trèng
[PCTUSED integer] : % sö dông
[INITRANS integer] : Sè b¶n ghi khëi t¹o
[MAXTRANS integer] : Sè b¶n ghi lín nhÊt
§µo t¹o c¬ b¶n: SQL vµ PL/SQL Trang 44
C«ng ty cæ phÇn ®Çu t− ph¸t triÓn c«ng nghÖ - FPT
Gi¸o tr×nh SQL vµ PL/SQL
VÝ dô 1
CREATE TABLE EMP
(EMPNO NUMBER NOT NULL CONSTRAINT PK_EMP PRIMARY KEY,
ENAME VARCHAR2(10) CONSTRAINT NN_ENAME NOT NULL CONSTRAINT
UPPER_ENAME CHECK (ENAME = UPPER(ENAME)),
JOB VARCHAR2(9),
MGR NUMBER CONSTRAINT FK_MGR REFERENCES
SCOTT.EMP(EMPNO),
HIREDATE DATE DEFAULT SYSDATE,
SAL NUMBER(10,2) CONSTRAINT CK_SAL
CHECK(SAL>500),
COMM NUMBER(9,0) DEFAULT NULL,
DEPTNO NUMBER(2) CONSTRAINT NN_DEPTNO NOT NULL
CONSTRAINT FK_DEPTNO REFERENCES SCOTT.DEPT(DEPTNO))
PCTFREE 5 PCTUSED 75
VÝ du 2
CREATE TABLE SALGRADE1
(GRADE NUMBER CONSTRAINT PK_SALGRADE PRIMARY KEY,
LOSAL NUMBER,
HISAL NUMBER)
TABLESPACE USER
STORAGE (INITIAL 6144 NEXT 6144
MINEXTENTS 1 MAXEXTENTS 5 PCTINCREASE 5)
VÝ dô 3
CREATE TABLE DEPT10
AS
SELECT EMPNO, ENAME, JOB, SAL
FROM EMP WHERE DEPTNO =10;
VÝ dô 4
CREATE TABLE EMP_SAL (NAME, SALARY,GRADE)
AS
SELECT ENAME, SAL, GRADE
FROM EMP, SALGARDE
WHERE EMP.SAL BETWEEN LOSAL AND HISAL ;
§Ó t¹o mét table míi, chóng ta cÇn ph¶i chuÈn bÞ mét sè th«ng tin sau:
• Nh÷ng column mµ cho phÐp null nªn ®Þnh nghÜa sau ®Ó tiÕt kiÖm n¬i l−u tr÷.
• Cã thÓ −íc l−îng kÝch th−íc table, vµ c¸c th«ng sè cho storage.
1. TÝnh to¸n kho¶ng ®Üa cÇn thiÕt cho data block header. TÝnh theo c«ng thøc sau:
BLOCK HEADER = (FIXED HEADER + VARIABLE TRANSACTION HEADER) + ( TABLE
DIRECTORY + ROW DIRECTORY)
Trong ®ã:
fixed header = 57 bytes
variable transaction header = 23*gi¸ trÞ cña th«ng sè instrans
table directory =4
row directory = 2* sè l−îng row trong block.
2. TÝnh to¸n kho¶ng ®Üa trèng ®Ó chøa d÷ liÖu cña data block. TÝnh theo c«ng thøc sau:
Kho¶ng ®Üa trèng ®Ó chøa data = (block size -total block header) - (block
size -(fixed header+ variable transaction header))*(pctree/100)
• Tªn chØ cã thÓ chøa ký tù sè trong tËp ký tù cña CSDL. Cã thÓ dïng c¸c ký tù _, $, #. ORACLE kh«ng
khuyÕn khÝch dïng c¸c ký tù $ vµ #.
• Tªn kh«ng ®−îc trïng víi c¸c tõ ®· dïng bëi ORACLE (xemphu lôc 1)
• Tªn cã thÓ ®Æt trong cÆp dÊu nh¸y kÐp, khi ®ã tªn cã thÓ bao gåm c¸c ký tù bÊt kú, cã thÓ bao gåm
kho¶ng trèng, cã thÓ dïng c¸c tõ khãa cña ORACLE, ph©n biÖt ch÷ hoa ch÷ th−êng.
• Tªn ph¶i duy nhÊt trong "kh«ng gian tªn" nhÊt ®Þnh. C¸c object thuéc cïng kh«ng gian tªn ph¶i cã tªn
kh¸c nhau.
C¸c bÝ danh cña cét, bÝ danh b¶ng, tªn ng−êi sö dông, mËt khÈu mÆc dï kh«ng ph¶i lµ c¸c object hoÆc c¸c
thµnh phÇn con cña object nh−ng còng ph¶i ®−îc ®Æt tªn theo c¸c quy t¾c trªn, ngo¹i trõ
BÝ danh cét, bÝ danh b¶ng chØ tån t¹i khi thùc hiÖn c¸c lÖnh SQL vµ kh«ng ®−îc l−u tr÷ trong CSDL, do vËy
kh«ng ¸p dông quy t¾c 9 vÒ kh«ng gian tªn.
MËt khÈu kh«ng thuéc vÒ kh«ng gian tªn nµo vµ do ®ã còng kh«ng ¸p dông quy t¾c 9.
Nªn ®Æt tªn theo mét quy t¾c ®Æt tªn thèng nhÊt
S¬ ®å chung khi tham chiÕu c¸c object hoÆc thµnh phÇn cña c¸c object
Schema.Object.Part.@dblink
Trong ®ã
Khi tham chiÕu ®Õn mét object trong c©u lÖnh SQL, ORACLE ph©n tÝch c©u lÖnh vµ vµ x¸c ®Þnh c¸c object
trong kh«ng gian tªn. Sau khi x¸c ®Þnh c¸c object, ORACLE thùc hiÖn c¸c thao t¸c mµ c©u lÖnh quy ®Þnh
trªn object. NÕu tªn object truy cËp kh«ng thuéc kh«ng gian tªn th× c©u lÖnh kh«ng ®−îc thùc hiÖn vµ cã
th«ng b¸o lçi.
C©u lÖnh sau thªm mét mÈu tin vµo b¶ng DEPT
INSERT INTO Dept VALUES (50, 'SUPPOR', 'PARIS')
Theo ng÷ c¶nh cña c©u lÖnh, ORACLE x¸c ®Þnh b¶ng Dept cã thÓ lµ
§Ó tham chiÕu ®Õn c¸c object kh«ng thuéc schema hiÖn thêi, ph¶i chØ ra tªn cña schema chøa object muèn
truy cËp
schema.object
§Ó truy cËp ®Õn mét CSDL ë xa, sau tªn object ph¶i chØ ra tªn liªn kÕt CSDL (database link) cña CSDL chøa
object muèn truy cËp. Database link lµ mét schema object, ORACLE dïng ®Ó th©m nhËp vµ truy xuÊt CSDL
tõ xa.
KiÓu CHAR dïng ®Ó khai b¸o mét chuçi cã chiÒu dµi cè ®Þnh, khi khai b¸o biÕn hoÆc cét kiÓu CHAR víi
chiÒu dµi chØ ®Þnh th× tÊt c¶ c¸c môc tin cña biÕn hay cét nµy ®Òu cã cïng chiÒu dµi ®−îc chØ ®Þnh. C¸c môc
tin ng¾n h¬n ORACLE sÏ tù ®éng thªm vµo c¸c kho¶ng trèng cho ®ñ chiÒu dµi. ORACLE kh«ng cho phÐp
§µo t¹o c¬ b¶n: SQL vµ PL/SQL Trang 47
C«ng ty cæ phÇn ®Çu t− ph¸t triÓn c«ng nghÖ - FPT
Gi¸o tr×nh SQL vµ PL/SQL
g¸n môc tin dµi h¬n chiÒu dµi chØ ®Þnh ®èi víi kiÓu CHAR. ChiÒu dµi tèi ®a cho phÐp cña kiÓu CHAR lµ 255
byte
11.4.2 VARCHAR2
KiÓu VARCHAR2 dïng ®Ó khai b¸o chuçi ký tù víi chiÒu dµi thay ®æi. Khi khai b¸o mét biÕn hoÆc cét kiÓu
VARCHAR2 ph¶i chØ ra chiÒu dµi tèi ®a, c¸c môc tin chøa trong biÕn hay cét kiÓu VARCHAR2 cã chiÒu dµi
thùc sù lµ chiÒu dµi cña môc tin. ORACLE kh«ng cho phÐp g¸n môc tin dµi h¬n chiÒu dµi tèi ®a chØ ®Þnh ®èi
víi kiÓu VARCHAR2. ChiÒu dµi tèi ®a kiÓu VARCHAR2 lµ 2000 byte
11.4.3 VARCHAR
HiÖn t¹i ORACLE xem kiÓu VARCHAR2 vµ VARCHAR lµ nh− nhau, tuy nhiªn ORACLE khuyªn nªn dïng
VARCHAR2. ORACLE dù ®Þnh trong t−¬ng lai dïng kiÓu VARCHAR ®Ó chøa c¸c chuçi víi chiÒu dµi biÕn
®æi, nh−ng trong phÐp so s¸nh sÏ ®−îc chØ ®Þnh theo nhiÒu ng÷ nghÜa kh¸c nhau.
11.4.4 NUMBER
KiÓu sè cña ORACLE dïng ®Ó chøa c¸c môc tin d¹ng sè d−¬ng, sè ©m, sè víi dÊu chÊm ®éng.
NUMBER(p, s) trong ®ã
NUMBER sè víi dÊu chÊm ®éng víi precision b»ng 38. Nhí r»ng scale kh«ng ®−îc ¸p dông cho sè víi dÊu
chÊm ®éng.
VÝ dô sau cho thÊy c¸ch thøc ORACLE l−u tr÷ d÷ liÖu kiÓu sè tïy theo c¸ch ®Þnh precision vµ scale kh¸c
nhau
11.4.5 FLOAT
Dïng ®Ó khai b¸o kiÓu sè dÊu chÊm ®éng, víi ®é chÝnh x¸c thËp ph©n 38 hay ®é chÝnh x¸c nhÞ ph©n lµ 126.
FLOAT(b) Khai b¸o kiÓu dÊu chÊm ®éng víi ®é chÝnh x¸c nhÞ ph©n lµ b, b tõ 1 ®Õn 126. Cã thÓ chuyÓn tõ ®é
chÝnh x¸c nhÞ phËn sang ®é chÝnh x¸c thËp ph©n b»ng c¸ch nh©n ®é chÝnh x¸c nhÞ ph©n víi 0.30103
11.4.6 LONG
Dïng ®Ó khai b¸o kiÓu chuçi ký tù víi ®é dµi biÕn ®æi, chiÒu dµi tèi ®a cña kiÓu LONG lµ 2 gigabyte. KiÓu
LONG th−êng ®−îc dïng ®Ó chøa c¸c v¨n b¶n.
• Mét table kh«ng thÓ chøa nhiÒu h¬n mét cét kiÓu LONG
• D÷ liÖu kiÓu LONG kh«ng thÓ tham gia vµo c¸c rµng buéc toµn vÑn, ngo¹i trõ kiÓm tra NULL vµ kh¸c
NULL
• Kh«ng thÓ truyÒn tham sè kiÓu LONG cho hµm hoÆc thñ tôc
• Trong c©u lÖnh SQL cã truy cËp c¸c cét kiÓu LONG, th× viÖc cËp nhËt hoÆc khãa c¸c b¶ng chØ cho phÐp
trong cïng mét CSDL
Ngoµi ra, c¸c cét kiÓu LONG kh«ng ®−îc tham gia trong c¸c thµnh phÇn sau cña c©u lÖnh SQL
• C¸c mÖnh ®Ò WHERE, GROUP BY, ORDER BY, CONNECT BY hoÆc víi t¸c tö DISTINCT trong c©u
lÖnh SELECT
• C¸c hµm sö dông trong c©u lÖnh SQL nh− SUBSTR, INSTR
• Trong danh s¸ch lùa chän cña c©u lÖnh SELECT cã sö dông mÖnh ®Ò GROUP BY
• Trong danh s¸ch lùa chän cña c©u hái con, c©u hái cã sö dông c¸c to¸n tö tËp hîp
• Trong danh s¸ch lùa chän cña c©u lÖnh CREATE TABLE AS SELECT
11.4.7 DATE
Dïng ®Ó chøa d÷ liÖu ngµy vµ thêi gian. MÆc dï kiÓu ngµy vµ thêi gian cã thÓ ®−îc chøa trong kiÓu CHAR vµ
NUMBER.
Víi gi¸ trÞ kiÓu DATE, nh÷ng th«ng tin ®−îc l−u tr÷ gåm thÕ kû, n¨m, th¸ng, ngµy, giê, phót, gi©y. ORACLE
kh«ng cho phÐp g¸n gi¸ trÞ kiÓu ngµy trùc tiÕp, ®Ó g¸n gi¸ trÞ kiÓu ngµy, b¹n ph¶i dïng TO_DATE ®Ó chuyÓn
gi¸ trÞ kiÓu chuçi ký tù hoÆc kiÓu sè.
NÕu g¸n mét gi¸ trÞ kiÓu ngµy mµ kh«ng chØ thêi gian th× thêi gian mÆc ®Þnh lµ 12 giê ®ªm, NÕu g¸n gi¸ trÞ
kiÓu ngµy mµ kh«ng chØ ra ngµy, th× ngµy mÆc ®Þnh lµ ngµy ®Çu cña th¸ng. Hµm SYSDATE cho biÕt ngµy vµ
thêi gian hÖ thèng.
§èi víi d÷ liÖu kiÓu ngµy, b¹n cã thÓ thùc hiÖn c¸c phÐp to¸n céng vµ trõ.
VÝ dô
SYSDATE+1 ngµy h«m sau
SYSDATE-7 c¸ch ®©y mét tuÇn
SYSDATE+(10/1440) m−êi phót sau
Ngµy Julian: Lµ gi¸ trÞ sè cho biÕt sè ngµy kÓ tõ ngµy 1 th¸ng giªng n¨m 4712 tr−íc c«ng nguyªn.
VÝ dô
KiÓu RAW vµ LONG RAW dïng ®Ó chøa c¸c chuçi byte, c¸c d÷ liÖu nhÞ ph©n nh− h×nh ¶nh, ©m thanh. C¸c
d÷ liÖu kiÓu RAW chØ cã thÓ g¸n hoÆc truy cËp chø kh«ng ®−îc thùc hiÖn c¸c thao t¸c nh− ®èi víi chuçi ký
tù.
KiÓu RAW gièng nh− kiÓu VARCHAR2 vµ kiÓu LONG RAW gièng kiÓu LONG, chØ kh¸c nhau ë chæ ORACLE
tù ®éng chuyÓn ®æi c¸c gi¸ trÞ kiÓu CHAR, VARCHAR2 vµ LONG gi÷a tËp hîp ký tù cña CSDL vµ tËp ký tù
cña c¸c øng dông.
11.4.9 ROWID
Mçi mÉu tin trong CSDL cã mét ®Þa chØ cã kiÓu ROWID. ROWID gåm
block.row.file, trong ®ã
11.4.10 MLSLABEL
KiÓu MLSLABEL dïng ®Ó chøa label d¹ng nhÞ ph©n mµ ORACLE dïng ®Ó ®¶m b¶o ho¹t ®éng cña b¶n th©n
hÖ thèng.
Nãi chung mét biÓu thøc kh«ng thÓ gåm c¸c gi¸ trÞ thuéc nhiÒu kiÓu kh¸c nhau, tuy nhiªn ORACLE cho phÐp
chuyÓn ®æi gi−· c¸c kiÓu d÷ liÖu. ORACLE tù ®éng chuyÓn kiÓu cña d÷ liÖu trong mét sè tr−êng hîp sau
• Khi INSERT hoÆc UPDATE g¸n gi¸ trÞ cho cét cã kiÓu kh¸c, ORACLE sÏ tù ®éng chuyÓn gi¸ trÞ sang
kiÓu cña cét.
• Khi sö dông c¸c hµm hoÆc c¸c to¸n tö mµ c¸c tham sè cã kiÓu kh«ng t−¬ng thÝch th× ORACLE sÏ tù
®éng chuyÓn kiÓu.
• Khi sö dông to¸n tö so s¸nh mµ c¸c gi¸ trÞ cã c¸c kiÓu kh¸c nhau, ORACLE sÏ tù ®éng chuyÓn kiÓu.
VÝ dô 1
SELECT ename FROM emp WHERE hiredate = '12-MAR-1993'
ORACLE ®· tù ®éng chuyÓn chuçi '12-MAR-1993' sang kiÓu DATE trong phÐp so s¸nh
VÝ dô 2
SELECT ename FROM emp WHERE ROWID = '00002514.0001.0001'
ORACLE ®· tù ®éng chuyÓn chuçi '00002514.0001.0001' sang kiÓu ROWID trong phÐp so s¸nh
11.5 Constraint
NULL/NOT NULL: rµng buéc column trèng hoÆc kh«ng trèng, trong vÝ dô mÖnh ®Ò rµng buéc:
CREATE TABLE DEPT (
DEPTNO NUMBER(2) NOT NULL,
DNAME CHAR(14),
LOC CHAR(13),
CONSTRAINT DEPT_PRIMARY_KEY PRIMARY KEY (DEPTNO));
UNIQUE: ChØ ra rµng buéc duy nhÊt, c¸c gi¸ trÞ cña column chØ trong mÖnh ®Ò UNIQUE trong c¸c row cña
table ph¶i cã gi¸ trÞ kh¸c biÖt. Gi¸ trÞ null lµ cho phÐp nªu UNIQUE dùa trªn mét cét. Vd:
CREATE TABLE DEPT (
DEPTNO NUMBER(2),
DNAME CHAR(14),
LOC CHAR(13),
CONSTRAINT UNQ_DEPT_LOC UNIQUE(DNAME, LOC));
PRIMARY KEY: ChØ ra rµng buéc duy nhÊt (gièng UNIQUE), tuy nhiªn kho¸ lµ d¹ng kho¸ UNIQUE cÊp cao
nhÊt. Mét table chØ cã thÓ cã mét PRIMARY KEY. C¸c gi¸ trÞ trong PRIMARY KEY ph¶i NOTT NULL.
Có ph¸p khi ®Æt CONSTRAINT ë møc TABLE
[CONSTRAINT constraint_name] PRIMARY KEY (column, Column..)
FOREIGN KEY ( Referential ): ChØ ra mèi liªn hÖ rµng buéc tham chiÕu gi÷a table nµy víi table kh¸c, hoÆc
trong chÝnh 1 table. Nã chØ ra mèi liªn hÖ cha-con vµ chØ rµng buéc gi÷a FOREIGN KEY b¶ng nµy víi
PRIMARY KEY hoÆc UNIQUE Key cña b¶ng kh¸c. VÝ dô quan hÖ gi÷a DEPT vµ EMP th«ng qua tr−êng
DEPTNO.
Tõ kho¸ ON DELETE CASCADE ®−îc hØ ®Þnh trong d¹ng kho¸ nµy ®Ó chØ khi d÷ liÖu cha bÞ xo¸ (trong b¶ng
DEPT) th× d÷ liÖu con còng tù ®éng bÞ xo¸ theo (trong b¶ng EMP).
JOB VARCHAR2(9),
MGR NUMBER CONSTRAINT FK_MGR REFERENCES
SCOTT.EMP(EMPNO),
HIREDATE DATE DEFAULT SYSDATE,
SAL NUMBER(10,2) CONSTRAINT CK_SAL
CHECK(SAL>500),
COMM NUMBER(9,0) DEFAULT NULL,
DEPTNO NUMBER(2) CONSTRAINT NN_DEPTNO NOT NULL
CONSTRAINT FK_DEPTNO REFERENCES SCOTT.DEPT(DEPTNO);
1. T¹o b¶ng PROJECT víi c¸c column ®−îc chØ ra d−íi ®©y, PROJID lµ promary key, vµ P_END_DATE >
P_START_DATE.
Column name Data Type Size.
------------------------------------
PROJID NUMBER 4
P_DESC VARCHAR2 20
P_START_DATE DATE
P_END_DATE DATE
BUDGET_AMOUNT NUMBER 7,2
MAX_NO_STAFF NUMBER 2
2.. T¹o b¶ng ASSIGNMENTS víi c¸c column ®−îc chØ ra d−íi ®©y, ®ång thêi cét PROJID lµ foreign key tíi
b¶ng PROJECT, cét EMPNO lµ foreign key tíi b¶ng EMP.
Column name Data Type Size.
------------------------------------------------
PROJID NUMBER 4 NOT NULL
EMPNO NUMBER 4 NOT NULL
A_START_DATE DATE
A_END_DATE DATE
BILL_AMOUNT NUMBER 4,2
ASSIGN_TYPE VARCHAR2 2
Dïng lÖnh ALTER TABLE ®Ó chØnh söa cÊu tróc b¶ng. Có ph¸p nh− sau:
ALTER TABLE tablename [ADD/MODIFY/DROP options ([column [column constraint)
[ENABLE clause] [DISABLE clause]
Trong ®ã:
ADD: thªm column hay constraint.
MODIFY: söa ®æi kiÓu c¸c column
DROP: bá constraint.
ENABLE/DISABLE: Che khuÊt hoÆc ®−a vµo sö dông c¸c CONSTRAINT mµ kh«ng xãa
h¼n
Chó ý:
• KhÝ dïng mÖnh ®Ò MODIFY kh«ng thÓ chuyÓn tÝnh chÊt cña COLUMN cã néi dung lµ NULL chuyÓn
thµnh NOT NULL;
• Kh«ng thÓ ®−a thªm mét cét NOT NUL nÕu table ®· cã sè liÖu. Ph¶i thªm cét NULL, ®iÒn ®Çy sè liÖu,
sau ®ã chuyÓn thµnh NOT NULL.
• Kh«ng thÓ chuyÓn ®æi kiÓu kh¸c nhau nÕu column ®· chøa sè liÖu
• Kh«ng thÓ dïng mÖnh ®Ò MODIFY ®Ó ®Þnh nghÜa c¸c CONSTRAINT trõ rµng buéc NULL/NOT NULL.
Muèn söa CONSTRAINT cÇn xo¸ chóng sau ®ã ADD thªm vµo.
VÝ dô 1
ALTER TABLE emp ADD (spouse_name CHAR(10);
VÝ dô 2
ALTER TABLE emp MODIFY (ename CHAR(25);
VÝ dô 3
ALTER TABLE emp DROP CONSTRAINT emp_mgr;
ALTER TABLE DROP PRIMARY KEY;
VÝ dô 4
ALTER TABLE dept DISABLE CONSTRAINT dept_prim;
• ChØ ng−êi t¹o ra table hay DBA míi cã thÓ xãa table
Dïng lÖnh RENAME ®Ó thay ®æi tªn object. Có ph¸p nh− sau:
RENAME old TO new
Trong ®ã:
Old: Tªn cò
New: tªn míi
VÝ dô
RENAME emp TO employee
12.2.4 Xãa d÷ liÖu cña table
Dïng lÖnh TRUNCATE TABLE ®Ó xãa d÷ liÖu cña table, xãa tÊt c¶ c¸c row trong table. Có ph¸p nh− sau:
TRUNCATE TABLE table_name [REUSE STORAGE]
Trong ®ã:
Option REUSE STORAGE gi÷ l¹i khung ®Ó chøa, chØ xãa d÷ liÖu
Trung t©m cña c¬ së d÷ liÖu ORACLE lµ data dictionary. Data dictionary tù ®éng ®−îc t¹o ra khi c¬ së d÷
liÖu ORACLE ®−îc t¹o. ORACLE cËp nhËt lªn data dictionary b»ng c¸c lÖnh DDL (Data Define Language).
C¸c table cña tõ ®iÓn d÷ liÖu ®−îc t¹o ra b»ng lÖnh CREATE DATABASE vµ chØ ®−îc t¹o tõ user SYS. C¸c
view trong tõ ®iÓn d÷ liÖu chøc c¸c th«ng tin d−íi d¹ng dÔ nh×n h¬n b¶ng.
• USER_xxx: lµ nh÷ng ®èi t−îng thuéc user , vÝ dô c¸c b¶ng ®−îc t¹o bëi user
• DICTIONARY: Th«ng tin vÒ toµn bé c¸c table, view, snapshot trong tõ ®iÓn d÷ liÖu
• TABLE_PRIVILEGES: Th«ng tin vÒ viÖc g¸n quyÒn trªn c¸c ®èi t−îng
Muèn hiÓn thÞ toµn bé th«ng tin vÒ c¸c table, view, snapshot trong tõ ®iÓn d÷ liÖu dïng lÖnh
SELECT * FROM DICTIONARY;
HiÓn thÞ cÊu cña USER_OBJECT
DESCRIBE USER_OBJECT;
HiÓn thÞ tÊt c¶ c¸c b¶ng m· user ®ã së h÷u:
SELECT OBJECT_NAME
FROM USER_OBJECT
WHERE OBJECT_TYPE = ‘TABLE’;
1. Thªm column COMMENTS kiÓu LONG vµo b¶ng PROJECTS. Thªm column HOURS kiÓu NUMBER
vµo b¶ng ASSIGNMENTS.
2. Sö dông view USER_OBJECTS hiÓn thÞ tÊt c¶ c¸c ®èi t−îng user së h÷u.
3. Thªm rµng buéc duy nhÊt (UNIQUE) cho 2 column PROJECT_ID vµ EMPNO cña b¶ng ASSIGNMENTS.
§Ó chÌn mét row vµo table dïng lÖnh INSERT. Có ph¸p nh− sau:
INSERT INTO tablename ([column, column, ...])
VALUES (value, value ...);
VÝ dô
INSERT INTO dept (depno, dname, loc)
VALUES (50, 'MARKETING', 'SAN JOSE')
ChÐp d÷ liÖu tõ table kh¸c
INSERT INTO table [(column, column...)]
SELECT select_list
FROM table(s)
VÝ dô
INSERT INTO emp_tmp (ename, sal)
SELECT ename, sal FROM emp WHERE sal > 1000
Chó thÝch:
- CËp nhËt c¸c nh©n viªn ë Dallas hoÆc Detroit
- Thay DEPTNO cña c¸c nh©n viªn nµy b»ng DEPTNO cña Boston
- Thay l−¬ng cña mçi nh©n viªn b»ng l−¬ng trung b×nh cña bé phËn * 1.1
- Thay commission cña mçi nh©n viªn b»ng commission trung b×nh cña bé phËn
* 1.5
Th«ng th−êng khi thùc hiÖn c¸c lÖnh thao t¸c d÷ liÖu hay gÆp ph¶i c¸c lçi rµng buéc toµn vÑn d÷ liÖu. C¸c lçi
nµy xuÊt hiÖn khi cã c¸c rµng buéc tr−íc ®ã mµ d÷ liÖu nhËp vµo, chØnh söa hay khi xo¸ ®i kh«ng ®¶m b¶o
c¸c ®iÒu kiÖn toµn vÑn. M· lçi:
ORA_02292: INTEGRITY CONSTRAINT
Sau ®ã b¸o tªn cña Constraint bÞ lçi.
Mét giao dÞch b¾t ®Çu khi mét lÖnh SQL ®−îc thùc hiÖn
Mét giao dÞch kÕt thóc mét trong c¸c tr−êng hîp sau:
COMMIT KÕt thóc giao dÞch hiÖn t¹i, thùc hiÖn c¸c chuyÓn ®æi d÷ liÖu
ROLLBACK [TO SAVEPOINT name] Quay l¹i d÷ liÖu ë ®iÓm SAVEPOINT hoÆc toµn bé giao dÞch.
SET AUTO[COMMIT] ON/OFF Tù ®éng COMMIt khi thùc hiÖn c¸c lÖnh Insert, update, delete.
VÝ dô:
INSERT INTO DEPT
VALUES (50,’TESTING’,’LAS VEGAS’);
SAVEPOINT INSERT_DONE;
UPDATE DEPT
SET DNAME = ‘MARKETING’;
ROLLBACK TO INSERT_DONE ;
COMMIT;
14 Sequence vµ index
14.1 Sequence
14.1.1 T¹o Sequence
Sequence lµ danh s¸ch tuÇn tù cña con sè, vµ ®−îc t¹o bëi Oracle sever. Sequence dïng ®Ó t¹o khãa
chÝnh mét c¸ch tù ®éng cho d÷ lÖu.
Sequence th−êng dïng ®Ó t¹o khãa chÝnh trong sinh m· tù ®éng. Cã thÓ dïng chung cho nhiÒu ®èi t−îng.
Con sè sequence nµy cã chiÒu dµi tèi ®a lµ 38 sè.
Trong ®ã:
INCREMENT BY : chØ ®Þnh kho¶ng c¸ch cña d·y sè tuÇn tù
START WITH : ChØ ®Þnh sè ®Çu tiªn cña d·y sè tuÇn tù
MAXVALUE : Gi¸ trÞ lín nhÊt cña d·y tuÇn tù
MINVALUE : Gi¸ trÞ nhá nhÊt cña d·y tuÇn tù
CYCLE/NO CYCLE: D·y tuÇn tù cã quay vßng khi ®Õn ®iÓm cuèi. MÆc ®Þnh lµ NO
CYCLE
VÝ dô:
CREATE SEQUENCE sample_sequence INCREMENT 1 STRAT WITH 2 MAXVALUE 100;
§Ó lµm viÖc víi c¸c sequence, dïng lÖnh SQL víi c¸c cét gi¶ sau
NEXTVAL T¨ng gi¸ tri hiÖn thêi cña sequence vµ cho gi¸ trÞ sau khi t¨ng ph¶i x¸c ®Þnh tªn sequence
tr−íc currval vµ nextval
sequence.CURRVAL
sequence.NEXTVAL
§Ó truy cËp c¸c sequence kh«ng thuéc schema hiÖn thêi, th× ph¶i chØ ra tªn schema
schema.sequence.CURRVAL
schema.sequence.NEXTVAL
§Ó truy cËp c¸c sequence tõ xa, th× cßn ph¶i chØ ra datalink
schema.sequence.CURRVAL@dblink
schema.sequence.NEXTVAL@dblink
Sö dông sequence
CURRVAL vµ NEXTVAL cã thÓ ®−îc sö dông trong c¸c tr−êng hîp sau:
• Kh«ng ®−îc sö dông CURRVAL vµ NEXTVAL trong c¸c tr−êng hîp sau
• Trong c©u lÖnh SELECT cã sö dông c¸c phÐp to¸n tËp hîp nh− UNION, INTERSET, MINUS
• GÝa trÞ DEFAULT cña cét trong c©u lÖnh CREATE TABLE hay ALTER TABLE
Index lµ mét cÊu tróc c¬ së d÷ liÖu, ®−îc sever sö dông ®Ó t×m mét row trong b¶ng mét c¸ch nhanh chãng.
Index bao gåm mét key value ( mét cét (column) trong hµng (row) ) vµ rowid.
Có ph¸p:
CREATE [UNIQUE]] INDEX index_name
ON TABLE ( column [,column...]);
§µo t¹o c¬ b¶n: SQL vµ PL/SQL Trang 58
C«ng ty cæ phÇn ®Çu t− ph¸t triÓn c«ng nghÖ - FPT
Gi¸o tr×nh SQL vµ PL/SQL
• Dïng Index khi mµ viÖc lÊy d÷ liÖu <15% sè row trong b¶ng.
• Index nh÷ng column nµo dïng ®Ó nèi gi÷a c¸c b¶ng lÉn nhau.
• Kh«ng nªn dïng Index cho c¸c b¶ng nµo chØ cã vµi row.
• Primaryvµ unique key ( khãa chÝnh vµ khãa duy nhÊt) tù ®éng cã index, nh−ng nªn cã index cho foreign
key( khãa ngo¹i).
Sè l−îng index cho mét table lµ kh«ng giíi h¹n. Tuy nhiªn nÕu cã qu¸ nhiÒu index sÏ g©y ¶nh h−ëng ®Õn sè
liÖu khi mµ d÷ liÖu trong table bÞ thay ®æi thø tù theo index. VÝ dô: Thªm mét row vµo b¶ng tÊt c¶ c¸c Index
sÏ ®−îc update. Nªn chän lùa gi÷a yªu cÇu query, vµ insert, update ®Ó cã mét index hîp lý. §èi víi c¸c
kho¸ PRIMARY KEY vµ UNIQUE KEY tõ kho¸ UNIQUE ®−îc tù ®éng thªm khi t¹o INDEX.
VÝ dô:
CREATE INDEX i-ENAME ON EMP (ENAME);
Xo¸ INDEX b»ng lÖnh:
DROP INDEX index_name ;
2. HiÓn thÞ danh s¸ch cña nh©n viªn thuéc sù qu¶n lý cña ng−êi cã tªn lµ 1 biÕn ®−îc nhËp tõ bµn phÝm
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------- ------------- ---------- ----- ------ ----------
7698 BLAKE MANAGER 7839 01-05-1981 2850 30
7654 MARTIN SALESMAN 7698 28-09-1981 1250 1400 30
7499 ALLEN SALESMAN 7698 20-02-1981 1600 300 30
7844 TURNER SALESMAN 7698 08-09-1981 1500 0 30
7900 JAMES CLERK 7698 03-12-1981 950 30
7521 WARD SALESMAN 7698 22-02-1981 1250 500 30
15 T¹o view
15.1 View
View lµ mét table logic, view kh«ng ph¶i lµ n¬i l−u tr÷ d÷ liÖu ë møc vËt lý. C¸c thµnh phÇn cña view dùa
trªn table hoÆc lµ trªn view kh¸c. Mäi t¸c ®éng lªn view ®Òu g©y ¶nh h−ëng tíi table cña view ®ã, vµ ng−îc
l¹i. §Ó ®Þnh nghÜa mét view dïng query trªn mét b¶ng hay mét view nµo ®ã.
Có ph¸p
CREATE [OR REPLACE] [FORCE] VIEW view_name [(column, column,...)]
AS
SELECT statement
[WITH CHECK OPTION [CONSTRAINT constraint_name]];
Trong ®ã
OR REPLACE : ®Ó t¹o view chÌn lªn view cïng tªn
FORCE : ®Ó t¹o view c¶ khi table hay view nµo ®ã kh«ng
tån t¹i trong c©u lÖnh SELECT.
column, column, :Tªn c¸c column cña view
WITH CHECK OPTION : nÕu cã lÖnh insert hoÆc update lªn vie−, ql sÏ
kiÓm tra ®iÒu kiÖn phï hîp trong mÖnh ®Ò where cña
view. NÕu kh«ng d÷ liÖu sÏ chØ kiÓm tra c¸c rµng
buéc toµn vÑn cña b¶ng.
CONSTRAINT : chØ ra tªn cña ®iÒu kiÖn kiÓm tra.
§µo t¹o c¬ b¶n: SQL vµ PL/SQL Trang 59
C«ng ty cæ phÇn ®Çu t− ph¸t triÓn c«ng nghÖ - FPT
Gi¸o tr×nh SQL vµ PL/SQL
VÝ dô 1
CREATE VIEW emp_view
AS
SELECT empno, ename, sal FROM emp WHERE deptno = 10;
VÝ dô 2
CREATE VIEW dept_summary
(name, minsal, maxsal, avsal)
AS
SELECT dname, min(sal), max(sal), avg(sal) FROM emp, dept
FROM emp, dept
WHERE emp.deptno = dept.deptno
GROUP BY dname;
VÝ dô 3
CREATE VIEW dept_view
AS
SELECT eame, sal*12 Annsal
FROM emp
WHERE deptno = 20
WITH CHECK OPTIION CONSTRAINT dept_check;
• Select
• Comment
• Kh«ng thÓ insert, update trªn view, khi query cña view chøa c¸c to¸n tö join, set, distinct, group by,
group.
• Kh«ng thÓ nµo insert, update trªn view, nÕu nh− trong view cã dïng with check option.
• Kh«ng thÓ nµo insert trªn view, trªn table cã nh÷ng cét not Null mµ kh«ng dïng default value ( bëi v×
trong tr−êng hîp nµy view sÏ cã Ýt colunm h¬n table table. Nªn insert 1 row vµo view, thùc chÊt lµ insert
row ®ã vµo table sÏ kh«ng hîp lÖ).
• Kh«ng thÓ nµo insert trªn view, nÕu view nµy cã dïng biÓu thøc decode.
• Nh÷ng query cña view kh«ng thÓ nµo tham kh¶o vµo 2 column gi¶ nextval, currval (nextval, currval dïng
cho sequence).
2. T¹o view ®Ó nhËp sè liÖu vµo b¶ng ASIGNMENT víi c¸c ®iÒu kiÖn sau:
PROJID <2000, P_START_DATE<P_END_DATE
C¸c gi¸ trÞ cã thÓ chÊp nhËn cña assign_type lµ PS, WT hoÆc ED
EMPNO cã gi¸ trÞ NOT NULL
BILL_RATE < 50 Víi ASSIGN_TYPE Lµ PS
BILL_RATE < 60 Víi ASSIGN_TYPE Lµ WT
BILL_RATE < 70 Víi ASSIGN_TYPE Lµ ED
2. §Þnh nghÜa b¶ng MESSAGES cã cÊu tróc
Column name Data Type
---------------------------------------------------
NUMCOL1 NUMBER(9,2)
NUMCOL2 NUMBER(9,2)
CHARCOL1 VARCHAR2(60)
CHARCOL2 VARCHAR2(60)
DATECOL1 DATE
DATECOL2 DATE
16 QuyÒn vµ b¶o mËt
Privileges lµ c¸c quyÒn h¹n ®−îc thùc hiÖn c¸c thao t¸c hoÆc thùc hiÖn viÖc truy nhËp ®Õn c¸c ®èi t−îng d÷
liÖu. Trong Oracle b¹n sÏ kh«ng thÓ thùc hiÖn ®−îc c¸c thao t¸c mµ kh«ng cã c¸c quyÒn t−¬ng øng. C¸c
quyÒn h¹n nµy ®−îc g¸n cho User ®Ó cã thÓ thùc hiÖn c¸c thao t¸c trªn c¸c ®èi t−îng chØ ®Þnh. ViÖc g¸n
quyÒn ®−îc thùc hiÖn bëi ng−êi qu¶n trÞ c¬ së d÷ liÖu.
G¸n quyÒn hoÆc lo¹i bá: §Ó thùc hiÖn g¸n quyÒn cho mét ®èi t−îng dïng lÖnh Grant lo¹i bá quyÒn h¹n dïng
Revoke (hoÆc b»ng c¸c c«ng cô hç trî kh¸c nh− Oracle Enterprise manager)
• QuyÒn trªn ®èi t−îng: Thao t¸c nèi dung cña c¸c ®èi t−îng CSDL
CSDL: Khi cµi ®Æt xong hÖ qu¶n trÞ CSDL ORACLE mÆc ®Þnh ®· cã 2 user.
QuyÒn hÖ thèng
Trong c¸c quyÒn hÖ thèng quyÒn DBA lµ lín nhÊt. DBA cã quyÒn
• ...
G¸n quyÒn
GRANT privilege[,privilege...] TO user [,user...]
Xo¸ quyÒn
REVOKE privilege[,privilege...] FROM user [,user...]
16.2 ROLE
Role lµ tªn cña mét nhãm c¸c quyÒn h¹n. Nã ®−îc t¹o ®Ó qu¶n lý quyÒn h¹n cho c¸c øng dông hoÆc nhãm
c¸c User. ViÖc dïng role cho phÐp qu¶n lý thèng nhÊt trªn c¸c ®èi t−îng, t¨ng tÝnh mÒm dÎo trong qu¶n trÞ,
dÔ dµng thay ®æi. VÝ dô hai ®èi t−îng X, Y cã quyÒn trªn role A tøc lµ role A cã quyÒn g× th× X, Y cã quyÒn
t−¬ng øng khi role A bÞ thay ®æi quyÒn h¹n th× X, Y còng bÞ thay ®æi quyÒn h¹n theo.
• CONNECT
• RESOURCE
LÖnh g¸n vµ xo¸ Role gièng nh− lÖnh g¸n vµ xo¸ Privilege. Chi tiÕt xem trong phÇn qu¶n trÞ ORACLE.
16.3 Synonym
Synonyms lµ bÝ danh cho mäi ®èi t−îng cña Oracle. C¸c ®èi t−îng cña Oracle lµ table, view, snapshot,
sequence, procedure, function, package vµ c¸c synonym kh¸c. Có ph¸p
CREATE PUBLIC SYNONYM synonym_name
FROM [OWNER.]object_name;
Dïng Synonyms cã nh÷ng lîi ®iÓm sau:
• Kh«ng tèn thªm n¬i l−u tr÷ kh¸c bëi v× nã ®· ®−îc cÊt trªn tõ ®iÓn d÷ liÖu.
• Cã thÓ cho phÐp mäi ng−êi (public) truy xuÊt c¸c ®èi t−îng cña Oracle.
Khi lËp tr×nh th× ph¶i truy xuÊt theo emp_01. EMPLY, tªn dµi nh− vËy th× ®o¹n ch−¬ng tr×nh sÏ dµi sÏ dÔ lÇm
lÉn. Nªn chóng ta ph¶i dïng synonym
CREATE SYNONYM EMP FOR EMP_01.EMPLY;
Cã thÓ t¹o mét synonym cho phÐp mäi ng−êi cã thÓ tham kh¶o tíi
CREATE PUBLIC EMP FOR EMP_01.EMPLY;
TÝnh b¶o mËt lµ v× synonym lµ bÝ danh, nªn ng−êi sö dông dïng bÝ danh nµy sÏ kh«ng ®o¸n ®−îc thªm th«ng
tin g×.
• LÖnh ®Þnh nghÜa CSDL (DDL) kh«ng ®−îc sö dông trong PL/SQL
VÝ dô 1
DECLARE
empno NUMBER(4):=7788;
BEGIN
UPDATE emp SET sal = 9000
WHERE empno = 0001;
....
END;
VÝ dô 2
DECLARE
v_deptno NUMBER(2);
v_loc VARCHAR2(15);
BEGIN
SELECT deptno, loc
INTO v_deptno, v_loc
FROM dept
WHERE dname = 'SALES';
END;
Trong Procedure Builder cã thÓ x©y dùng c¸c ®o¹n ch−¬ng tr×nh PL/SQL nh− program units, libraries, vµ
database triggers ë c¶ client-side vµ server-side. Procedure Builder cã mét sè thµnh phÇn sau:
• Object Navigator lµ phÇn hiÓn thÞ mäi ®èi tîng trong Procedure Builder's
• PL/SQL Interpreter
• Wizard
• Cã thÓ connect vµo CSDL ®Ó xem th«ng tin vÒ c¸c ®èi t−îng trong CSDL
• T¸c dông: Dïng ®Ó so¹n th¶o ®o¹n ch−¬ng tr×nh PL/SQL dÔ dµng
• C¸ch gäi:
NhÊn ®óp vµo icon bªn tr¸i cña program unit. HoÆc
NhÊn ®óp vµo nót (+) ®Ó t¹o Program unit míi
• TiÖn Ých
Compile: DÞch
PL/SQL Interpreter
• Khi chän mét program unit nµo ®ã. Néi dung cña program unit sÏ hiÖn lªn cöa sè Interpreter ®Ó debug.
• Cöa sè interpreter cßn cã phÇn ®¸nh lÖnh PL/SQL sau dÊu nh¾c PL/SQL>
Wizard
• Cöa sæ Wizard hiÓn thÞ khi t¹o mét program unit míi b»ng c«ng cô Wizard.
• C«ng cô nµy gióp dÔ dµng h¬n trong viÖc x©y dùng c¸c program unit.
• T¹o míi b»ng c¸ch nhÊn vµo nót (+) trªn thanh toolbar.
• So¹n th¶o
Trî gióp so¹n th¶o b»ng menu edit.
Cã thÓ dïng import vµ export trªn menu file ®Ó ®−a thªm/lo¹i bá ®o¹n text
Chän Syntax palete trong menu program ®Ó trî gióp vÒ có ph¸p
Compile ®Ó t×m lçi, th«ng b¸o lçi hiÖn lªn t¹i dßng cuèi cña cöa sè
Database Trigger
• T¹o míi: NhÊn vµo nót (+), chän lo¹i database Trigger
• So¹n th¶o:
Gièng nh− víi Program unit
Thªm c¸c lùa chän thuéc tÝnh cña trigger.
• T×m vÕt, söa lçi c¸c Program Unit trong PL/SQL interpreter gåm cã:
Toolbar
Command line
• T¹o c¸c breakpoint (nhÊn ®óp vµo sè dßng lÖnh) ®Ó dõng ®o¹n ch−¬ng tr×nh, kiÓm tra c¸c biÕn runtime,
d÷ liÖu...
• C¸c PL/SQL Program Unit th−êng ®−îc tæ chøc l¹i trong c¸c library (.PLL/.PPL).
Create: T¹o mét library míi
Open: Më library
Save: Ghi l¹i thay ®æi
• Attached library: Sö dông c¸c program unit trong c¸c Attached library nh− c¸c hµm mÆc ®Þnh.
• Stored Program Unit: CÊt Program Unit thµnh c¸c Stored Program Unit trong CSDL
18.1 IF
IF condition THEN actions [ELSIF condition THEN actions] [ELSE actions]
END IF
VÝ dô 1
IF ename := 'SCOTT' THEN
beam_me_up := 'YES';
COMMIT;
ELSE
beam_me_up := 'NO';
ROLLBACK;
END IF;
VÝ dô 2
IF choice= 1 THEN action := 'Run payroll';
ELSIF choice=2 THEN action:='Run';
ELSIF choice=3 THEN action:='Backup';
ELSE action:='Invalid';
END IF;
COMMIT;
EXIT;
END IF;
END LOOP;
VÝ dô 2:
LOOP
.....
EXIT WHEN total_sals = 60000;
....
END LOOP;
18.3 FOR
FOR control_variable IN [REVERSE] low_value .. high_value
VÝ dô
FOR I IN 1..2000
LOOP
INSERT INTO numbered_rows VALUES (i);
preserve_i:=i;
....
END LOOP;
18.4 WHILE
WHILE condition
VÝ dô
WHILE Bill<250
LOOP
actions;
END LOOP;
18.5 GOTO
GOTO label
VÝ dô
BEGIN
<<label1>>
.....
GOTO label1
19 cursor
Cursor: lµ kiÓu biÕn cã cÊu tróc, cho phÐp ta xö lý d÷ liÖu gåm nhiÒu dßng. Sè dßng phô thuéc vµo c©u lÖnh
query sau nã. Trong qu¸ tr×nh xö lý cursor nh− lµ mét con trá vÞ trÝ cña row ®ang xö lý
C¸c b−íc sö dông biÕn cursor: Khai b¸o -> më -> lÊy d÷ liÖu ®Ó xö lý -> ®ãng
Khai b¸o
cursor <ten( danh s¸ch biÕn)> is <c©u lÖnh select>: Më vïng d÷ liÖu cÊt
tr÷ th«ng tin xö lý.
vd: cursor x is select deptno from dept where deptno=10;
vd: cursor x(b number) is select * from dept where deptno>b;
Më cursor
open <ten (trÞ cña biÕn)>
vd: open x;
vd: open x(10);
LÊy d÷ liÖu
Fetch <tªn cursor> into <tªn biÕn>
Vd: fetch x into b;
§ãng cursor
Close <tªn cursor>
vd: Close x;
C¸c thuéc tÝnh
%isopen : tr¶ l¹i gi¸ trÞ True nÕu cursor ®ang më
%notfound : tr¶ l¹i gi¸ trÞ True nÕu lÖnh fetch hiÖn thêi tr¶ l¹i kh«ng cã row
%found : tr¶ l¹i gi¸ tri true cho ®Õn khi fetch kh«ng cßn row nµo
%rowcount : tr¶ l¹i sè row ®· ®−îc thùc hiÖn b»ng lÖnh fetch
VÝ dô1:
declare
cursor v_a is select * from emp;
m v_a%rowtype;
begin
open v_a;
loop
fetch v_a into m;
insert into t_thu(empno, ename,job) values (m.empno,m.ename, m.job);
exit when v_a%notfound;
end loop;
close v_a;
end;
vÝ dô 2:
DECLARE
CURSOR c1 IS SELECT dname, loc FROM dept FOR UPDATE OF loc;
dept_rec c1%ROWTYPE;
sales_count NUMBER:=0;
non_sales NUMBER:=0;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO dept_rec;
EXIT WHEN c1%NOTFOUND;
IF dept_rec.dname = 'SALES' AND dept_rec.loc!='DALLAS'
THEN
UPDATE dept SET loc='DALLAS' WHERE CURRENT OF c1;
sales_count:=sales_count+1;
ELSIF
dept rec.dname!='SALES' AND dept_rec.loc!='NEWYORK'
THEN
UPDATE dept SET loc ='NEWYORK' WHERE CURRENT OF c1;
non_sales:=non_sales+1;
END IF;
END LOOP;
CLOSE c1;
INSERT INTO counts (sales_set, non_sales_set)
VALUES (sales_count, non_sales);
COMMIT;
END;
Có ph¸p:
TYPE type_name IS TABLE OF datatype
[NOT NULL] INDEX BY BINARY_INTEGER;
var type_name;
VÝ dô
TYPE NAME IS TABLE OF EMP.ENAME%TYPE;
First_name NAME;
Last_name NAME;
KiÓu d÷ liÖu Record
Có ph¸p
TYPE type_name IS RECORD OF
(Col1 datatype
[NOT NULL{:=|DEFAULT} expr],
(Col2 datatype
[NOT NULL{:=|DEFAULT} expr]...);
var type_name;
VÝ dô
§µo t¹o c¬ b¶n: SQL vµ PL/SQL Trang 69
C«ng ty cæ phÇn ®Çu t− ph¸t triÓn c«ng nghÖ - FPT
Gi¸o tr×nh SQL vµ PL/SQL
Emp_record emp_rec;
19.3 Sao kiÓu d÷ liÖu
B¶n ghi trong PL/SQL. lµ mét biÕn cã thÓ gi÷ nhiÒu gi¸ trÞ vµ lµ mét tËp hîp c¸c biÕn t−¬ng øng víi c¸c
tr−êng trong table.
Trong ®ã
Var : biÕn b¶n ghi
Varref : Tªn b¶ng
VÝ dô:
X emp%ROWTYPE;
§Ó truy nhËp ®Õn c¸c tr−êng trong d÷ liÖu b¶n ghi dïng gièng nh− trong 1 row. VÝ dô
x.empno, x.sal...
§Ó sao kiÓu d÷ liÖu cña mét biÕn nµo ®ã.
X salgade%TYPE
Có ph¸p
SELECT col1, col2...
INTO var1, var2... [cursor_var]
FROM table1, table2...
[WHERE condition1, condition2... ]
[GROUP BY col1, col2 ...]
[HAVING condition1, condition2...]
[FOR UPDATE];
trong ®ã:
INTO var1, var2... [cursor_var] ®Ó ®−a gi¸ trÞ trong table vµo trong c¸c
biÕn ( cã thÓ lµ biÕn cursor ).
VÝ dô:
SELECT deptno, loc
INTO v_deptno, v_loc
FROM dept
WHERE dname = ‘SALES’;
1. ViÕt ®o¹n ch−¬ng tr×nh t×m kiÕm c¸c hµng trong b¶ng EMP víi biÕn ®−îc ®−a tõ ngoµi vµo lµ &1 d¹ng
JOb_type(emp.job%type)vµ ®−a ra th«ng b¸o thÝch hîp vµo b¶ng MESSAGES.
2. ViÕt ®o¹n ch−¬ng tr×nh ghi d÷ liÖu vµo b¶ng MESSAGES víi cét NUMCOL1 mang gi¸ trÞ lµ 1 nÕu lµ row 1
®−îc Insert, 2 nÕu row 2 ®−îc Insert.... Kh«ng ®−îc Insert nh÷ng row cã gi¸ trÞ lµ 6 hoÆc 8, tho¸t khái vßng
lÆp insert sau gi¸ trÞ 10. Commit sau vßng lÆp.
3. LiÖt kª c¸c cét ENAME, HIREDATE, SAL Víi ®iÒu kiÖn EMPNO b»ng gi¸ trÞ biÕn &EMPLOYEE_NO ®−îc
®−a vµo, sau ®ã kiÓm tra
vµ ®−a gi¸ trÞ kiÓm tra nµy vµo b¶ng message cét charcol1 (thö víi c¸c gi¸ trÞ 7654, 7369, 7900, 7876)
WHERE numcol1 = v;
nÕu bÊt kú mét lÇn update nµo ®ã cã sè l−îng row >1 th× exit khái vßng lÆp.
20 procedure vµ funtion
20.1 Procedure
Lµ mét nhãm c¸c lÖnh thùc hiÖn chøc n¨ng nµo ®ã nh»m t¨ng kh¶ n¨ng xö lý, kh¶ n¨ng sö dông c¸c thñ tôc
chung, t¨ng tÝnh b¶o mËt vµ an toµn d÷ liÖu, tiÖn Ých trong ph¸t triÓn.
Có ph¸p:
Argument : Gåm tªn cña danh s¸ch c¸c biÕn vµ kiÓu cña nã.
IN : ChØ ®Þnh r»ng b¹n ph¶i ®−a trÞ khi gäi procedure.
OUT : ChØ ra r»ng Procedure sÏ tr¶ l¹i trÞ cho biÕn tíi m«i tr−êng gäi nã.
IN OUT : ChØ ra r»ng b¹n ph¶i g¸n trÞ cho argument khi gäi procedure vµ procedure sÏ tr¶ l¹i trÞ
argument tíi m«i tr−êng gäi.
NÕu kh«ng ghi IN, OUT hoÆc IN OUT th× ngÇm ®Þnh sÏ lµ IN
Datatype : Lµ kiÓu cña argument, ë ®©y chØ ®−îc khai b¸o kiÓu mµ kg«ng ®−îc khai b¸o c¸c chiÒu dµi
argument. VÝ dô kh«ng ®−îc khai b¸o argument lµ VARCHAR2(10) mµ ph¶i khai b¸o lµ VARCHAR2.
VÝ dô:
Muèn thùc hiÖn procedure t¹i SQL plus thù hiÖn dïng lÖnh execute <ten(danh s¸ch gi¸ trÞ). Cßn trong c¸c
thñ tôc kh¸c dïng lÖnh gäi b×nh th−êng
20.2 Function
Có ph¸p:
C¸c tham gièng nh− procedure nh−ng kh¸c lµ sau khi gäi hµm tr¶ l¹i trÞ
VÝ dô:
§Ó gäi hµm get_dname ta gäi trùc tiÕp hoÆc th«ng qua c¸c phÐp g¸n.
VÝ dô:
GET_DNAME(20)
--------------------------------------------------------
§µo t¹o c¬ b¶n: SQL vµ PL/SQL Trang 72
C«ng ty cæ phÇn ®Çu t− ph¸t triÓn c«ng nghÖ - FPT
Gi¸o tr×nh SQL vµ PL/SQL
RESEARCH
20.3 Bµi tËp
1. ViÕt hµm lÊy tªn gi¸m ®èc theo biÕn empno ®−îc nhËp vµo,
2. ViÕt thñ tôc nhËp th«ng tin vµo b¶ng message c¸c tr−êng
numcol1: M· phßng
charcol1: tªn phßng ban
numcol2: tæng l−¬ng cña phßng
3. ViÕt thñ tôc dïng cursor; lÊy sè liÖu vÒ n ng−êi (n lµ mét biÕn ®−îc ®−a vµo tõ man h×nh) cã møc l−¬ng
cao nhÊt trong b¶ng emp ®−a vµo b¶ng top_sal víi c¸c gi¸ trÞ t−¬ng øng trong num=empno, name = ename,
salary = sal). B¶ng top_sal cã cÊu tróc nh− sau:
NUM NUMBER(4)
NAME VARCHAR2(25)
SALARY NUMBER(11,2)
21 pakage
21.1 Package
Lµ tËp hîp cña c¸c ®èi t−îng gåm c¸c procedure, function, variable, constant, cursor vµ c¸c exception.
ViÖc t¹o c¸c package cho phÐp t¨ng kh¶ n¨ng mÒm dÎo, t¨ng tÝnh b¶o mËt, t¹o sù thuËn lîi trong viÖc qu¶n
lý hÖ thèng ®ång thêi t¨ng hiÖu suÊt xö lý cña hÖ thèng.
Víi c¸c releases tr−íc ®©y cña PL/SQL viÖc gäi c¸c functions chØ cã thÓ ®−îc thùc hiÖn b»ng c¸c lÖnh cña
procedure, nh−ng giê th× c¸c lêi gäi nµy cã thÓ xuÊt hiÖn trong c©u lÖnh SQL gièng nh− lÖnh procedure. §iÒu
nµy cã nghÜa lµ ta cã thÓ sö dông c¸c functions gièng nh− c¸c built-in SQL functions. B»ng c¸c më réng SQL
ta cã thÓ tËp hîp ph©n tÝch ngay bªn trong Oracle Server mµ ta kh«ng cÇn lÊy d÷ liÖu vµo trong øng dông
®iÒu nµy lµm t¨ng tÝnh ®éc lËp cña c¬ së d÷ liÖu.
Tuy nhiªn ®Ó cã thÓ gäi ®−îc tõ SQL th× c¸c function ph¶i ®¶m b¶o ch¾c ch¾n viÖc kiÓm so¸t kÕt qu¶. Víi
c¸c standalone functions th× Oracle cã thÓ thùc hiÖn ®iÒu nµy b»ng viÖc kiÓm tra function body. Tuy nhiªn víi
body cña package lµ Èn cho nªn c¸c packaged functions ta ph¶i sö dông pragma
RESTRICT_REFERENCES ®Ó ®¶m b¶o luËt nµy.
Trong ®ã:
WNDS: Write no database state
RNDS: Read no database state
WNPS: Write no package state
RNPS: Read no package state
VÝ dô:
Mét Database Trigger ®−îc t¹o vµ l−u tr÷ trong PL/SQL block t−¬ng øng víi table. Nã ®−îc tù ®éng gäi ®Õn
khi cã sù truy nhËp ®Õn table t−¬ng øng víi c¸c hµnh ®éng ®Þnh nghÜa.
Create or replace : lÖnh t¹o hoÆc t¹o l¹i trigger nÕu nã ®· tån t¹i.
Before : ChØ ra r»ng trigger sÏ ®−îc thùc hiÖn tr−íc khi thùc hiÖn lÖnh.
Affter : ChØ ra r»ng trigger sÏ ®−îc thùc hiÖn sau lÖnh gäi tíi nã.
Delete, Insert, Update of <column> on <table>: trigger sÏ ®−îc gäi khi cã c¸c hµnh ®éng t−¬ng øng trªn
tõng column cña b¶ng.
Referencing : ChØ tªn quan hÖ tíi c¸c trÞ cò (OLD) vµ míi (NEW) cña row .
For each row : Trigger thùc hiÖn t−¬ng øng víi mçi row cã ®iÒu kiÖn øng víi mÖnh ®Ò trong
WHEN.
Pl/sql_block : Lµ khèi lÖnh PL/SQL thùc hiÖn c¸c xö lý theo mong muèn.
VÝ dô:
1. ViÕt trigger ®Ó khi nhËp sè liÖu vµo b¶ng emp th× nã còng nhËp sè liÖu vµo b¶ng emp1 víi ®iÒu kiÖn cÊu
tróc b¶ng emp1 cã empno, ename, job, dname
2. Thªm 1 cét vµo b¶ng DEP tªn lµ SUMSAL. ViÕt trigger ®Ó cét SUMSAL lu«n chøa tæng l−¬ng cña phßng
ban ®ã ( d÷ liÖu lÊy t−¬ng øng tõ b¶ng emp)
3. LËp 1 b¶ng tªn lµ BACKUP cã cÊu tróc gièng b¶ng EMP sao cho mçi b¶n ghi trong emp bÞ xo¸ sÏ l−u
sang backup
4. øng víi c¸c theo t¸c insert, update, delete trªn b¶ng emp, l−u l¹i c¸c theo t¸c ®ã vµo b¶ng message, víi
d÷ liÖu t−¬ng øng charcol1 = tªn thao t¸c, datecol2 = Ngµy giê thùc hiÖn.
23 error handing
Error handing lµ lçi xuÊt hiÖn trong khèi lÖnh PL/SQL, tÊt c¶ c¸c lçi nµy sÏ ch¹y vÒ phÇn EXCEPTION trong
khèi lÖnh ®Ó xö lý.
Cã 2 nhãm exception:
• C¸c exception cña b¶n th©n Oracle nh−: NO_DATA_FOUND, FOUND, TOO_MANY_ROW ...
C¸c exception hÖ thèng tù ®éng bÞ kÝch ho¹t trong c¸c tr−êng hîp nhÊt ®Þnh. C¸c exception ng−êi sö dông
®Þnh nghÜa ph¶i tù kÝch ho¹t, vÝ dô
RAISE exception_identifier;
Tªn M· lçi M« t¶
NO_DATA_FOUND ORA_01403 C©u lÖnh SELECT INTO kh«ng tr¶ vÒ row nµo
TOO_MANY_ROW ORA_01422 C©u lÖnh SELECT INTO kh«ng tr¶ vÒ lín h¬n 1
row
DUP_VAL_ON_INDEX ORA_00001 Lçi gi¸ trÞ bÞ trïng l¾p trong mét UNI QUE INDEX
VÝ dô Xo¸ nh÷ng nh©n viªn trong b¶ng emp nÕu t¹i phßng nh©n viªn ®ã lµm viÖc chØ cã mét nh©n viªn; trong
Procedure buider
PROCEDURE DELEMP
(V_EMP IN EMP.EMPNO%TYPE) IS
V_ID EMP.EMPNO%TYPE;
BEGIN
SELECT EMPNO
INTO V_ID
FROM EMP
WHERE EMPNO = V_EMP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
ROLLBACK;
TEXT_IO.PUT_LINE(TO_CHAR(V_EMP)||'KHONG CO');
Mçi exception hÖ thèng ®−îc g¸n mét sè x¸c ®Þnh, cã thÓ ®Æt tªn cho c¸c exception ®Ó dÔ sö dông h¬n.
PRAGMA EXCEPTION_INIT (exception_identifier, number)
VÝ dô
DECLARE
fetch_failed EXCEPTION;
PRAGMA EXCEPTION_INIT (fetch_failed, -1002);
BEGIN
....
EXCEPTION
WHEN fetch_failed THEN ....
END;
1. Dïng EXCEPTION b¾t lçi chÆt h¬n cho c¸c bµi tËp tõ phÇn 19-22.