Nhp môn H qun tr c s d liu DB2
147
Mt ng dng cn xác nh “s b” s hàng trong mt bng. Hiu sut rt là quan tr&ng.
Con tr" c yêu cu mc cô l#p n nh vi ngoi l ca mt câu lnh SQL:
SELECT COUNT(*) FROM tab1 WITH UR
Vi SQL nhúng, các mc thit l#p c t ti thi im óng gói, còn vi SQL ng
các mc c t thi gian chy.
Vic ch&n s dng mc cô l#p nào ph thuc vào ng dng ca các bn. Nu ng dng
ca các bn không yêu cu có nhng giá tr nh ví d, ch&n cô l#p UR. Nu ng dng
ca các bn yêu cu iu khin rt cht trên d liu làm vic vi nó, ch&n cô l#p RR.
13.5 Khóa leo thang
Mi khóa do DB2 to ra s, s dng lng b nh nào ó. Khi b ti u cho rng nó tt
hn là mt khóa trên toàn b bng, thay vì khóa nhiu hàng, s leo thang khóa xut
hin.
Hình 13.9 minh h&a cho iu này:
Hình 13.9 – Khóa leo thang
Có hai tham s cu hình c s d liu chính liên quan n khóa leo thang:
• LOCKIST - S lng ca b nh (trong trang 4k) d tr qun lý nhng khóa
cho m&i ng dng c ni. S mc nh là nm mi ln trang 4K (200K) trên
Windows.
• MAXLOCKS - Phn trm cc i ca toàn b danh sách khóa cho mt ng
dng. Mc nh là 22%.
Bi v#y, nu nhng giá tr ngm nh c s dng, khóa leo thang xut hin khi
mt ng dng n yêu cu hn 44K trong tng b nh khóa (200K * 22% = 44K).
Nu s leo thang khóa xut hin thng xuyên vi s thit l#p này, tng giá tr ca
LOCKIST và MAXLOCKS. Khóa leo thang không tt cho hiu nng nhng li gim
s xung t.
Tp nh#t ký triu chng ca DB2 có th c dùng xác nh liu có
Nhp môn H qun tr c s d liu DB2
148
phi s leo thang khóa ang xut hin. (db2diag.log, thng tp này nm trong th
mc: C:\Program Files\IBM\SQLLIB\DB2)
13.6 Kim soát khóa
Bn có th theo dõi nhng s s dng khóa bng nh chp nhanh khóa ng dng DB2.
/ b#t nhng nh chp nhanh cho khóa, ta dùng lnh:
UPDATE MONITOR SWICTHES USING LOCK ON
Sau khi c cho phép, thông tin theo dõi s, c t#p hp. / thu c mt báo cáo
ca khóa vào mt thi gian nht nh, dùng lnh sau:
GET SNAPSHOT FOR LOCKS FOR APPLICATION AGENT ID <handle>
Hình 13.9: 8nh chp nhanh kt qu ca mt ví d s dng ng dng khóa
Figue 13.9 – 0nh chp nhanh khóa ca các ng dng
13.7 Ch khóa
Khi hai hoc nhiu các ng dng cn thc hin mt phép toán trên cùng mt i tng,
mt trong s ó có th phi i nh#n c khóa. Theo mc nh mt ng dng s,
Application Lock Snapshot
Snapshot timestamp = 11-
05-2002 00:09:08.672586
Application handle = 9
Application ID =
*LOCAL.DB2.00B9C5050843
Sequence number = 0001
Application name =
db2bp.exe
Authorization ID =
ADMINISTRATOR
Application status = UOW
Waiting
Status change time = Not
Collected
Application code page = 1252
Locks held = 4
Total wait time (ms) = 0
List Of Locks
Lock Name =
0x05000700048001000000000052
Lock Attributes = 0x00000000
Release Flags = 0x40000000
Lock Count = 255
Hold Count = 0
Lock Object Name = 98308
Object Type = Row
Tablespace Name = TEST4K
Table Schema = ADMINISTRATOR
Table Name = T2
Mode = X
Nhp môn H qun tr c s d liu DB2
149
i vô hn. Thi gian ch i mt ng dng ca mt khóa c kim soát bi tham s
cu hình c s d liu. Giá tr ngm nh ca tham s này là -1 (i vô hn).
Thanh ghi CURENT LOCK TIMEOUT cn c dùng t thi gian ch khóa cho mt
kt ni ã cho. Theo mc nh, thanh ghi này c t giá tr ca LOCKTIMEOUT. S
dng SET LOCK TIMEOUT thay i giá tr ca nó. Mt khi giá tr ca thanh ghi ã
c t cho mt kt ni, nó s, t+n ti qua m&i giao dch.
Ví d:
SET LOCK TIMEOUT=WAIT n
13.8 Vn khóa ph thuc và phát hin
Mt s b tc (deadlock) xut hin khi hai hoc nhiu các ng dng c ni ti cùng
c s d liu. S ch i cha bao gi c gii quyt bi vì mi ng dng ang gi
mt tài nguyên mà nó phc v cho nhng nhu cu khác nhau. Trong thit k ng dng,
nhng s b tc luôn là mt vn chim nhiu thi gian.
Hình 13.10: Minh h&a mt tình hung b tc.
Hình 13.10 - K$ch bn s b tc
Trong hình 13.10, ngi A gi c bt nho khô và gi s s, không cho phép ngi
khác dùng cho n khi ông ta có sa. Mt khác, ngi B gi c sa, và s, không cho
phép ngi khác cho n khi ông ta có bt nho khô. Bi v#y, chúng ta có mt tình
hung b tc.
/ mô ph"ng mt tình hung b tc DB2, theo nhng bc sau ây:
1. M hai ca s son tho lnh ca DB2 (chúng tôi s, g&i là "CLP1" và "CLP2"
tng ng). Chúng i din cho hai ng dng khác nhau kt ni ti c s d
liu.
2. T* CLP1 thc hin các lnh sau:
db2 connect to sample
db2 +c update employee set firstnme = ‘Mary’ where empno =
‘000050’
/u tiên, chúng ta ang kt ni ti c s d liu có tên SAMPLE, và sau ó thc
hin mt lnh c#p nh#t hàng trên bng employee làm vi "empno= 50000". La
Nhp môn H qun tr c s d liu DB2
150
ch&n "+c " trong câu lnh ch- ra rng, chúng tôi không mun ca s lnh ca
DB2 t ng cam kt lnh này. Chúng tai ang c ý làm iu này sao cho chúng
ta gi c khóa.
3. T* CLP2 thc hin nhng lnh sau:
db2 connect to sample
db2 +c update employee set firstnme = ‘Tom’ where empno =
‘000030’
4 ca s ca CLP2, nó i din cho ng dng th hai, chúng ta c.ng ni vào c
s d liu SAMPLE, nhng li c#p nh#t mt hàng khác bng employee.
4. Lnh t* CLP1:
db2 +c select firstnme from employee where empno = ‘000030’
Sau khi nhn Enter thc hin câu lnh SELECT trên, câu lnh SELECT này có
v2 s, treo. Nó th#t s là không phi là treo, mà là i khóa ca hàng này tr v
do CLP2 ã gi trong bc 3. Ti im này, nu CLOCKTIMEOUT ã c
li vi giá tr ngm nh ca nó là -1, ng dng CLP1 i mãi mãi.
5. Lnh t* CLP2:
db2 +c select firstnme from employee where empno = ‘000050’
Bng vic ánh lnh SELECT trên, bây gi chúng ta ang to ra mt s b
tc. Phát biu SELECT này c.ng có v2 treo, thc ra nó ang i khóa CLP1
ang gi tr v.
Trong kch bn b tc trên, DB2 s, kim tra tham s cu hình c s d liu
DLCHKTIME. Tham s này s, t khong thi gian kim tra cho nhng s b tc.
Ch!ng hn, giá tr ca tham s này c t ti 10 giây, DB2 s, s dng mt gii thu#t
bên trong xác nh giao dch nào cn phi quay lui (h+i x), và mt giao dch nào s,
c tip tc.
Nu bn ang gp nhiu tình hung b tc, bn cn phi tái kim tra nhng giao dch
hin hu xem xem có th t chc li c không.
13.9 Truy cp ng thi và thc tin khóa tt nht
Sau ây là mt s m7o nh" truy c#p +ng thi và thc ti0n khóa tt nht:
1. Gi nhng giao dch càng ngn càng tt. /iu này có th t c bng cách phát
hành thng xuyên nhng lnh COMMIT (th#m chí cho nhng giao dch ch- &c)
khi ng dng ca bn cho phép.
2. Ch- ghi nh#t ký thông tin giao dch khi có yêu cu.
3. T y d liu ã s dng nhanh chóng:
ALTER TABLE ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE
4. Thc hin nhng thay i d liu theo lô/nhóm. Ch!ng hn
DELETE FROM (
SELECT *FROM tedwas.t1 WHERE c1 = … FETCH FIRST s3000 ROWS
ONLY)
Nhp môn H qun tr c s d liu DB2
151
5. S dng nhng c tính tng tranh ca nhng công c chuyn i d liu
trong DB2.
6. /t tham s mc LOCKTIMEOUT cho c s d liu (khong gia 30-120
giây). Bn *ng nên cho giá tr ngm nh ca nó là -1. Bn có th c.ng s dng
khóa gii hn thi gian (timeout) trên trên t*ng phiên làm vic.
7. Không khôi phc nhiu d liu hn cn thit. Ch!ng hn, s dng mnh
FETCH FIRST n ROWS ONLY trong câu lnh SELECT.
Nhp môn H qun tr c s d liu DB2
152
PH1N 3: H2C DB2 – PHÁT TRI3N 4NG D5NG
Trong phn này, chúng ta s, tho lu#n v các i tng ca c s d liu nm tng
di ca ng dng nh th tc lu (stored procedure), hàm do ngi dùng nh ngh'a
và b%y s kin (trigger). Rng bn có th h&c c cách l#p trình s dng DB2 nh mt
máy ch d liu bng nhiu ngôn ng khác nhau bng cách kho sát các ng dng m%u
i kèm trong th mc SQLLIB\samples khi chúng ta cài t máy ch DB2. Hình di ây
là mt s chng trình m%u vit bng Java, s dng DB2 trên nn Windows.
Mt s chng trình Java m%u i kèm DB2.
Nhp môn H qun tr c s d liu DB2
153
14
Chng 14 – Các th tc SQL PL
Trong chng này chúng ta s, tho lu#n v “th tc lu” (stored procedure). Th tc lu
là mt i tng ng dng c s d liu, có th óng gói các câu lnh SQL và các
nghip v. Lu tr hp lí mt phn ng dng trong c s d liu cho phép ci tin hiu
sut thc hin nh gim kh nng k7t ng truyn mng. Hn na, các th tc cho
phép lu tr t#p trung ti mt ni nào ó các ng dng khác c.ng có th s dng
c.
Th tc lu trong DB2 có th vit bng SQL PL, C/C++, Java, Cobol, các ngôn ng
c h tr CLR (Common Language Runtime) và OLE. Trong chng này, chúng ta
s, t#p trung vào SQL PL vì tính ph bin và n gin ca nó.
Hình 14.1 mô t cách hot ng ca stored procedure.
Hình 14.1 - Gim k.t ng truyn mng b6ng th tc.
4 góc trên bên trái ca hình, ta thy mt vài câu lnh SQL c thc thi ln lt ht cái
này n cái kia. Mi câu SQL c gi t* máy khách n máy ch, và máy ch tr kt
qu v li máy khách. Nu nhiu câu SQL c thc thi theo kiu ó thì lng d liu
truyn trên mng s, tng lên. Tuy nhiên, góc di phi, ta thy th tc lu “myproc”
c lu trên máy ch cha nhng câu SQL tng t trên; và sau ó ti máy khách
(bên phía trái), lnh CALL c dùng g&i thc hin th tc. Cách th hai g&i thc
Nhp môn H qun tr c s d liu DB2
154
hin mt th tc hiu qu hn vì ch- có mt lnh g&i c truyn trên mng và mt kt
qu tr v cho máy khách.
Th tc lu c.ng rt hu ích trong mc ích bo m#t c s d liu vì ngi s dng s,
c phân cp các quyn thc thi hoc ch- c xem các th tc; iu ó giúp cho
h thng c che chn và không cho ngi dùng ly thông tin nu h& không có quyn.
Kh nng này là hoàn toàn kh thi vì ngi dùng không òi h"i nhng quyn tng
minh trên các bng hoc khung nhìn (view) trong th tc mà h& thc thi; h& ch- cn
c cp quyn thc hin các th tc ó.
14.1 DB2 Developer Workbench
DB2 Developer Workbench (DWB) là công c c xây dng trên nn tng Eclipse,
phc v cho vic phát trin các th tc, hàm, truy vn XML, ng dng SQLJ,… DWB
n nh mt hình nh riêng r, (nó không phi là mt phn trong gói cài t DB2) nhng
hoàn toàn mi0n phí. Có th ti DWB v t* trang “Download” trên a ch-
Hình 14.2 Giao din ca DWB.
Hình 14.2 – DB2 Developer Workbench
14.1.2 To mt th tc lu trong DWB
/ to mt th tc bng Java hay SQL PL, hãy làm theo các bc sau. Lu ý rng
không th to c các th tc c vit bng các ngôn ng khác trong DWB.
Bc 1: To mt d án DWB (project)
T* menu, ch&n File -> New -> Project và ch&n Data Development Project. Xem hình
14.3 di ây.
Nhp môn H qun tr c s d liu DB2
155
Hình 14.3 – Data development project
T*ng bc làm theo hng d%n nh#p tên d án, ch&n c s d liu bn mun s
dng và xác nh rõ th mc JDK (cái nào mc nh thng là úng).
Bc 2: To mt th tc
Sau khi to xong d án, phía bên phi ca ca s (data perspective) s, xut hin d án
mi v*a to. Trong hình 14.4 bn s, thy d án mi to trong tình trng m rng.
Nhp môn H qun tr c s d liu DB2
156
Hình 14.4 – D án “myProject”
Hình 14.4 Cho thy các th mc khác nhau trong d án ca bn. Khi mun to mt th
tc, bn nhn chut phi vào th mc th tc và ch&n New -> Stored Procedure. Hoàn
thành các thông tin c yêu cu trong t*ng bc to mi mt th tc nh: th tc ó
kt hp vi d án nào, tên và ngôn ng vit th tc (lu ý rng ch- có SQL PL và
Java c h tr trong DWB) và các câu lnh SQL dùng trong th tc. Mc nh, DWB
s, cung cp cho bn câu lnh SQL m%u ví d. Ti ây bn có th nhn Finish và th tc
s, c to ra và trong ó có s dng on mã m%u và các câu lnh SQL trong ví d
c cung cp trên. Xem hình 14.5
Nhp môn H qun tr c s d liu DB2
157
Hình 14.5 – Mt th tc m%u
Trong hình 14.5, on mã m%u cho th tc “PROCEDURE1” c phát sinh. Bn có th
thay th on mã ó bng on mã riêng ca bn. / n gin chúng ta s, dùng các
on mã m%u trên tip tc kho sát quyn sách này.
Bc 3: Biên d$ch mt th tc
Khi mt th tc ã c to, bn biên dch và trin khai bng cách nhp phi vào nó
trong khung bên trái và ch&n Deploy. Hình 14.6 minh ho cho bc này.
Nhp môn H qun tr c s d liu DB2
158
Hình 14.6 – Biên d$ch mt th tc
Bc 4: Thc thi mt th tc
Khi mt th tc ã c biên dch, bn có th thc thi nó bng cách nhp phi chut
vào nó và ch&n Run. Kt qu s, xut hin trong khung “Result” góc di phi
/ thc thi mt th tc bng dòng lnh, bn có th s dng câu lnh CALL
<procedure name>
14.2 Mt s khái nim v th tc SQL PL:
Nhng th tc lu vi ngôn ng th tc rt d0 to và h&c. Trong DB2 th tc có hiu
sut tt nht. Th tc lu SQL PL (hay nói tt là “Th tc SQL”) là tiêu im ca chng
này.
14.2.1 Cu trúc ca th tc
Cú pháp ca th tc
CREATE PROCEDURE proc_name [({tham s tùy chn})]
[thuc tính tùy chn ca th tc] <câu lnh>
Trong ó <câu lnh> là mt câu lnh hoc mt t#p các câu lnh c nhóm bi cu
trúc BEGIN [ATOMIC]……………[END]
14.2.2 Nhng thuc tính tùy chn ca th tc
Sau ây là 1 vài thuc tính tùy ch&n ca th tc:
• LANGUAGE SQL
Thuc tính này ch- ra ngôn ng mà th tc s, s dng. LANGUAGE SQL là giá
tr mc nh. Vi nhng ngôn ng khác nh JAVA hay C thì ta s dng tng
ng thuc tính LANGUAGE JAVA hay LANGUAGE C
Nhp môn H qun tr c s d liu DB2
159
• RESULT SETS <n>
Thuc tính này cn thit nu th tc ca bn s, tr v t#p hp kt qu n
• SPECIFIC my_unique_name
/ây là tên duy nht c gán cho th tc. Mt th tc có th c np è, ngh'a
là, nhiu th tc lu tr có th có cùng mt tên, nhng vi s lng tham s
khác nhau. Bng cách s dng t* khóa SPECIFIC bn có th gn mt tên duy
nht vi nhng th tc này, và iu này to ra s d0 dàng cho vic qun lí các
th tc lu tr. Ví d, xóa mt th tc s dng t* khóa SPECIFIC bn có th
dng câu lnh: DROP SPECIFIC PROCEDURE. Nu t* khóa SPECIFIC không
c s dng thì vi câu lnh xóa th tc lu tr nh trên, DB2 bit c th
tc nào cn c xóa (vì có rt nhiu th tc có tên ging nhau c ghi è) thì
bn phi ch- ra danh sách tham s i kèm ca th tc ó.
14.2.3 Các loi tham s
Có 3 loi tham s trong th tc lu tr SQL PL:
• IN - Tham s vào
• OUT - Tham s ra
• INOUT - Tham s v*a vào và ra
Ví d:
CREATE PROCEDURE proc(IN p1 INT, OUT p2 INT, INOUT p3 INT)
Khi g&i th tc, tt c các tham s cn phi c a vào trong câu lnh CALL. Ví d,
g&i th tc trên bn phi g&i nh sau:
CALL proc (10, ?, 4)
Du h"i (?) c dùng cho các tham s tr v ca câu lnh CALL.
/ây là mt ví d khác ca th tc lu mà bn có th th:
CREATE PROCEDURE P2 ( IN v_p1 INT,
INOUT v_p2 INT,
OUT v_p3 INT)
LANGUAGE SQL
SPECIFIC myP2
BEGIN
my second SQL procedure
SET v_p2 = v_p2 + v_p1;
SET v_p3 = v_p1;
END
/ g&i th tc này t* dòng lnh, ta dùng câu lnh:
CALL P2 (3,4,?)
14.2.4 Chú thích trong th tc SQL PL
Có hai cách chú thích trong th tc SQL PL:
• S dng 2 du gch ngang ( ), ví d:
ây là 1 chú thích theo kiu SQL
Nhp môn H qun tr c s d liu DB2
160
• S dng nh dng nh ngôn ng l#p trình C, ví d:
/* ây là 1 chú thích dng C */
14.2.5 Câu lnh ghép
Mt câu lnh ghép trong th tc là mt câu lnh trong ó cha rt nhiu lnh th tc và
các câu lnh SQL c bao bi t* khóa BEGIN và END. Khi t* khóa ATOMIC c s
dng theo sau t* khóa BEGIN, câu lnh ghép c xem nh là mt n v, ngh'a là, tt
c các ch- th hay câu lnh trong câu lnh ghép phi hoàn thành câu lnh ghép c
hoàn thành. Nu có mt câu lnh tht bi, tt c s, c tr v trng thái ban u (roll
back). Hình 14.7 cho ta 1 minh h&a v câu lnh ghép.
Hình 14.7 – Câu lnh ghép
14.2.6 Khai báo bin
/ khai báo bin, s dng câu lnh DECLARE nh sau:
DECLARE var_name <data type> [DEFAULT value];
/ây là mt vài ví d:
DECLARE temp1 SMALLINT DEFAULT 0;
DECLARE temp2 INTEGER DEFAULT 10;
DECLARE temp3 DECIMAL(10,2) DEFAULT 100.10;
DECLARE temp4 REAL DEFAULT 10.1;
DECLARE temp5 DOUBLE DEFAULT 10000.1001;
DECLARE temp6 BIGINT DEFAULT 10000;
DECLARE temp7 CHAR(10) DEFAULT 'yes';
DECLARE temp8 VARCHAR(10) DEFAULT 'hello';
DECLARE temp9 DATE DEFAULT '1998-12-25';
DECLARE temp10 TIME DEFAULT '1:50 PM';
DECLARE temp11 TIMESTAMP DEFAULT '2001-01-05-12.00.00';
DECLARE temp12 CLOB(2G);
DECLARE temp13 BLOB(2G);
14.2.7 Câu lnh gán
/ gán mt giá tr cho mt bin, s dng câu lnh SET. Ví d:
SET total = 100;
Nhp môn H qun tr c s d liu DB2
161
Câu lnh trên c.ng tng ng vi câu lnh:
VALUES(100) INTO total;
Ngoài ra, bt kì bin nào c.ng có th c gán vi giá tr NULL
SET total = NULL
Mt biu thc iu kin s, c thit l#p nu có nhiu hn mt dòng thì ch- ly dòng
u tiên trong bng
SET total = (select sum(c1) from T1);
SET first_val = (select c1 from T1 fetch first 1 row only)
Bn c.ng có th gán bin vi các thuc tính ngoài ca c s d liu
SET sch = CURRENT_SCHEMA;
14.3 Các con tr+ (cursor)
Mt con tr" là mt t#p hp cha kt qu ca câu lnh SELECT. Cú pháp khai báo,
m, chuyn giá tr (fetch) và óng con tr" nh sau:
DECLARE <tên con tr> CURSOR [WITH RETURN <ích tr v>]
<câu lnh SELECT>;
OPEN <tên con tr>;
FETCH < tên con tr > INTO <các bin>;
CLOSE < tên con tr>;
Khi mt con tr" c khai báo, mnh WITH RETURN có th c s dng vi
nhng giá tr sau:
• CLIENT: Kt qu s, c tr v cho ng dng máy khách
• CALLER: Kt qu s, c tr v cho máy khách hoc th tc lu ã g&i nó.
/ây là mt ví d ca th tc s dng con tr":
CREATE PROCEDURE set()
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN
DECLARE cur CURSOR WITH RETURN TO CLIENT
FOR SELECT name, dept, job
FROM staff
WHERE salary > 20000;
OPEN cur;
END
14.4 *iu khin lung
Nh trong rt nhiu ngôn ng khác, SQL PL có rt nhiu câu lnh có th c dùng
iu khin lu+ng thc hin mc logic. Di ây là mt vài câu lnh c h tr:
CASE (ch&n ra mt nhánh thc thi (tìm kim n gin))
IF
FOR (thc thi mi dòng trong bng)
Nhp môn H qun tr c s d liu DB2
162
WHILE
ITERATE (buc phi thc hin vòng lp tip theo. Tng t vi câu lnh CONTINUE
trong C)
LEAVE (ri kh"i mt khi hay vòng lp)
LOOP (lp vô hn nh)
REPEAT
GOTO
RETURN
CALL (g&i th tc)
14.5 Gi th tc
Nhng on mã sau ây s, ch- ra cách g&i mt th tc bng các ngôn ng l#p trình
khác nhau.
Gi th tc t& ng dng CLI/ODBC
SQLCHAR *stmt = (SQLCHAR *)
“CALL MEDIAN_RESULT _SET( ? )” ;
SQLDOUBLE sal = 20000.0; /*Ch ra parameter marker trong stmt */
SQLINTEGER salind = 0; /*Ch nh giá tr (variable) cho sal */
sqlrc = SQLPrepare(hstmt, stmt, SQL_NTS);
sqlrc = SQLBindParameter(hstmt, 1, SQL_PARAM_OUTPUT,
SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &sal, 0, &salind);
SQLExecute(hstmt);
if (salind == SQL_NULL_DATA)
printf(“Median Salary = NULL\n”);
else
printf(“Median Salary = %.2f\n\n”, sal);
/* Ly tp kt qu u tiên */
sqlrc = StmtResultPrint(hstmt);
if (sqlrc == SQL_SUCCESS) {
/* Có 1 kt qu khác */
sqlrc = SQLMoreResult(hstmt);
}
Xem chi tit tp ví d ca DB2: sqllib/samples/sqlproc/rsultset.c
Gi th tc t& ng dng VB.NET
Try
‘ To mt DB2 Command chy th tc
Dim procName As String = “TRUNC_DEMO”
Dim cmd As DB2Command = conn.CreateCommand()
Dim parm As DB2Parameter
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = procName
‘ ng ký các tham s u ra cho DB2Command
parm = cmd.Parameters.Add(“v_lastname”, DB2Type.VarChar)
parm.Direction = ParameterDirection.Output
parm = cmd.Parameter.Add(“v_msg”, DB2Type.VarChar)
parm.Direction = ParameterDirection.Output
‘ Gi li th tc
Nhp môn H qun tr c s d liu DB2
163
Dim reader As DB2DataReader = cmd.ExecuteReader
Catch myException As DB2Exception
DB2ExceptionHandler(myException)
Catch
UnhandledExceptionHandler()
End Try
Gi th tc t& ng dng Java
try
{
// Kt ni CSDL mu
String url = “jdbc:db2:sample”;
con = DriverManager.getConnection(url);
CallableStatement cs = con.prepareCall(“CALL
trunc_demo(?, ?)”);
// ng ký tham s u ra
callStmt.registerOutParameter(1, Types.VARCHAR);
callStmt.registerOutParameter(2, Types.VARCHAR);
cs.execute();
con.close();
}
catch (Exception e)
{
/* x lý ngoi l ây */
}
14.6 Li và x" lý iu kin
Trong DB2, các t* khóa SQLCODE và SQLSTATE c dùng xác nh s thành
công hay tht bi trong vic thc thi mt câu lnh SQL. Nhng t* khóa này cn c
khai báo tng minh trong phn ngoài cùng ca th tc nh sau:
DECLARE SQLSTATE CHAR[5];
DECLARE SQLCODE INT;
DB2 s, thit l#p giá tr mt cách t ng cho nhng t* khóa trên sau mi thao tác trên
SQL (SQL operation). /i vi SQLCODE, giá tr c thit l#p nh sau:
• = 0, thành công
• > 0, thành công nhng có cnh báo
• < 0, không thành công
• = 100, không tìm thy d liu (ví d nh: câu lnh FETCH không tr v d liu)
/i vi SQLSTATE, các giá tr ca nó nh sau:
• Thành công: SQLSTATE ‘00000’
• Không thy: SQLSTATE ‘02000’
• Cnh báo: SQLSTATE ‘01XXXX’
• Trng hp c bit: các giá tr khác
SQLCODE là mt c t cho c s d liu, chi tit hn c SQLSTATE. SQLSTATE là
tiêu chu n trong các h qun tr cho c s d liu nhng tng quát hn. Nhiu
Nhp môn H qun tr c s d liu DB2
164
SQLCODE có th trùng vi SQLSTATE. SQLCODE và SQLSTATE s, c nói rõ hn
Ph lc A, X lý s c.
Mt iu kin có th c to ra bng bt kì câu lnh SQL nào và s, trùng vi mt
SQLSTATE. Ví d, mt iu kin c th nh SQLSTATE ‘01004’ c to ra khi có mt
giá tr c làm tròn s trong quá trình thi hành câu lnh SQL. Thay vì dùng SQLSTATE
‘01004’ kim tra iu kin này, mt tên g&i có th c gán. Trong ví d c th này,
tên “trunc” có th c gán cho iu kin SQLSTATE ‘01004’ nh sau.
DECLARE trunc CONDITION FOR SQLSTATE ‘01004’
Các iu kin khác ã c nh ngh'a trc:
• SQLWARNING
• SQLEXCEPTION
• NOT FOUND
X" lý iu kin
/ x lý mt iu kin, bn có th to ra mt trình x lý iu kin, và phi ch- rõ các yu
t sau:
• /iu kin mà nó phi x lý
• Ni phc h+i li quá trình thc thi (da vào kiu ca trình x lý: CONTINUE,
EXIT or UNDO)
• Hành ng c thi hành x lý iu kin. Nhng hành ng này có th là
bt c câu lnh nào, bao g+m c các cu trúc iu khin.
Nu mt iu kin SQLEXCEPTION c to ra, và không có trình x lý nào, th tc s,
kt thúc và tr v cho máy khách mt thông báo li.
Các loi trình x" lý
Có 3 loi trình x lý:
CONTINUE – X lý này dùng ch- ra rng, sau khi ngoi l xy ra, và trình x lý ã x
lý iu kin, dòng x lý s, TI9P T:C i n câu lnh tip theo sau câu lnh v*a c
to ra.
EXIT – x lý này dùng ch- ra rng, sau khi ngoi l xy ra, và trình x lý ã x lý iu
kin, dòng x lý s, i n cui th tc.
UNDO – x lý này c dùng ch- ra rng, sau khi ngoi l xy ra, và trình x lý ã x
lý iu kin, dòng x lý s, i n cui th tc, và s, không làm gì i hoc khôi phc bt
kì câu lnh nào ã c thc thi (roll back).
Hình 14.8 minh h&a s khác nhau gia các trình x lý iu kin và hành vi ca nó
Nhp môn H qun tr c s d liu DB2
165
Hình 14.8 – Kiu ca các trình x" lý iu kin
14.7 SQL ng
Trong SQL ng, trái ngc vi SQL t'nh, toàn b câu lnh SQL không c nh#n bit
trong thi gian chy. Ví d nu col1 và tabname là các bin trong câu lnh này, chúng
ta s, thc hin vi SQL ng nh sau:
‘SELECT ‘ || col1 || ‘FROM ‘ || tabname;
SQL ng c.ng c ngh dùng cho DDL tránh các vn ph thuc và sai sót
khi óng gói. Nó c.ng c yêu cu khi thc hin quy.
SQL ng có th c thc thi theo hai cách:
• Dùng lnh EXECUTE IMMEDIATE – ây là ý tng cho vic thc thi th tc
SQL n.
• Dùng lnh PREPARE song song vi lnh EXECUTE – ý tng này c dùng
thc thi a th tc SQL.
/on mã sau a ra mt ví d v SQL ng s dng c hai cách trên. Ví d này gi s
rng có mt bng T2 ã c to nh sau:
CREATE TABLE T2 (c1 INT, c2 INT)
CREATE PROCEDURE dyn1 (IN value1 INT, INT value2 INT)
SPECIFIC dyn1
BEGIN
DECLARE stmt varchar(255);
DECLARE st STATEMENT;
SET stmt = ‘INSERT INTO T2 VALUE (?, ?)’;
PREPARE st FROM stmt;
EXECUTE st USING value1, value1;
EXECUTE st USING value2, value2;
SET stmt = INSERT INTO T2 VALUES (9, 9)’;
EXECUTE IMMEDIATE stmt;
END
Nhp môn H qun tr c s d liu DB2
166
15
Chng 15 – Hàm ni tuyn, hàm ngi dùng $nh
ngh-a, các hàm x" ký các s kin b%y (Inline SQL PL,
UDF, Triggers)
Trong chng này, chúng ta s, xem xét v các hàm ni tuyn SQL các i tng khác
ca CSDL nh hàm do ngi dùng nh ngh'a (UDF) và các b%y s kin.
15.1 Hàm ni tuyn SQL
Trong chng 14, chúng ta ã tho lu#n v vic to các th tc lu s dng ngôn ng
SQL PL. Ngôn ng SQL PL này c.ng có th c s dng ni tuyn, ngh'a là có có th
ng mt mình, không nm trong mt th tc nào c. Các lnh SQL PL c s dng
trong các UDF và hàm b%y s kin c.ng là ni tuyn vì các mã lnh ã c thêm vào
mã lnh ca các UDF và hàm b%y s kin, bn thân nó ã là các SQL ng. SQL PL ni
tuyn ch- h tr mt t#p con trong toàn b các lnh SQL PL, sau ây là các t* khóa ca
SQL PL ni tuyn:
DECLARE <variable>
SET
CASE
FOR
GET DIAGNOSTICS
GOTO
IF
RETURN
SIGNAL
WHILE
ITERATE
LEAVE
/ây là nhng t* khóa không nm trong SQL PL ni tuyn:
ALLOCATE CURSOR
ASSOCIATE LOCATORS
DECLARE <cursor>
DECLARE HANDLER
PREPARE
EXECUTE
EXECUTE IMMEDIATE
LOOP
REPEAT
RESIGNAL
CALL
COMMIT/ROLLBACK
Nhp môn H qun tr c s d liu DB2
167
Di ây là ví d ca SQL ng s dng SQL PL ni tuyn. Nu các bn mun th nó,
bn các th ly nó làm mt phn ca ca tp kch bn, và bn phi chc chn là ã tp
c các bng nh sau:
CREATE TABLE T1 (c1 INT)
CREATE TABLE T3 (c1 INT)
BEGIN ATOMIC
DECLARE cnt INT DEFAULT 0;
DECLARE sumevens INT DEFAULT 0;
DECLARE err_msg VARCHAR(1000) DEFAULT '';
WHILE (cnt < 100) DO
IF mod(cnt,2) = 0 THEN
SET sumevens = sumevens + cnt;
END IF;
SET cnt=cnt+1;
END WHILE;
INSERT INTO T3 values (sumevens);
SET cnt = (SELECT 0 FROM SYSIBM.SYSDUMMY1);
FOR cur1 AS SELECT * FROM T1 DO
IF cur1.c1 > 100 THEN
SET cnt = cnt + 1;
END IF;
END FOR;
SET err_msg = 'Rows with values > 100 is:' ||
char(cnt);
SIGNAL SQLSTATE '80000' SET MESSAGE_TEXT = err_msg;
END!
Nu bn lu on chng trình ni tuyn trên vào tp kch bn tên là “myScript.txt” thì
bn có th thc hin nó bng lnh sau;
db2 -td! –vf myScript.txt
15.2 B%y s kin (Triggers)
B%y s kin là các i tng c s d liu kt hp vi mt bng c nh ngh'a bi
các thao tác c thc hin khi có mt trong các thao tác INSERT, UPDATE, hoc
DELETE c thc hin trên bng ó. Chúng c thi hành mt cách t ng. Các
thao tác là nguyên nhân các b%y này c thc thi, g&i là triggering.
15.2.1 Các loi b%y s kin
Có 3 loi b%y ó là: b%y trc (before), b%y sau (after) và b%y thay th (instead of)
B%y trc
Các b%y trc c kích hot trc khi mt dòng c thêm, sa hay xóa i. Các thao
tác c thc hin bi b%y này thì không th kích hot c các b%y khác (vì th các
thao tác INSERT, UPDATE và DELETE không c phép có trong b%y).
Mt ví d n gin v b%y trc c ch- ra trên hinh 15.1