Nhp môn H qun tr c s d liu DB2
168
Hình 15.1 – Ví d v b%y trc
Trong hình 15.1, b%y “defalt_class_end” s, b%y trc lnh khi INSERT SQL c thc
hin trong bng cl_sched. Bng này là mt phn ca c s d liu SAMPLE, ban có th
to và th kim tra b%y này khi kt ni vi c s d liu này. Bin “n” trong nh ngh'a
ca b%y s, i din cho giá tr mi ca lnh INSERT, giá tr s, chèn vào. B%y này s,
kim tra s hp l ca các giá tr chèn vào. Nu ct “ending” không có giá tr gì khi chèn,
thì b%y này s, m bo chc chn là có giá tr ca ct “starting” cng 1 c chèn vào.
Các lnh sau giúp ta kim tra b%y này
C:\Program Files\IBM\SQLLIB\BIN>db2 insert into cl_sched
(class_code, day, starting) values ('abc',1,current time)
DB20000I The SQL command completed successfully.
C:\Program Files\IBM\SQLLIB\BIN>db2 select * from cl_sched
CLASS_CODE DAY STARTING ENDING
042:BF 4 12:10:00 14:00:00
553:MJA 1 10:30:00 11:00:00
543:CWM 3 09:10:00 10:30:00
778:RES 2 12:10:00 14:00:00
044:HD 3 17:12:30 18:00:00
abc 1 11:06:53 12:06:53
6 record(s) selected.
Th tc b%y “validate_sched” di ây cho phép m rng hàm b%y “default_class_end”
ã mô t trc ây. Xin nhc li rng, bn có th to ra nó và kim tra nó da vào c s
d liu SAMPLE.
CREATE TRIGGER validate_sched
NO CASCADE BEFORE INSERT ON cl_sched
REFERENCING NEW AS n
FOR EACH ROW
MODE DB2SQL
BEGIN ATOMIC
supply default value for ending time if null
Nhp môn H qun tr c s d liu DB2
169
IF (n.ending IS NULL) THEN
SET n.ending = n.starting + 1 HOUR;
END IF;
ensure that class does not end beyond 9pm
IF (n.ending > '21:00') THEN
SIGNAL SQLSTATE '80000'
SET MESSAGE_TEXT='class ending time is beyond 9pm';
ELSEIF (n.DAY=1 or n.DAY=7) THEN
SIGNAL SQLSTATE '80001'
SET MESSAGE_TEXT='class cannot be scheduled on a
weekend';
END IF;
END
B%y sau
B%y sau c kích hot sau khi các SQL triggering thc hin thành công. Các thao tác
trong b%y này có th kích hot các b%y khác (s ni tng c cho phép n 16 mc).
B%y sau h tr các thao tác INSERT, UPDATE và DELETE. Di ây là ví d ca mt
b%y sau
CREATE TRIGGER audit_emp_sal
AFTER UPDATE OF salary ON employee
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
MODE DB2SQL
INSERT INTO audit VALUES (
CURRENT TIMESTAMP, ' Employee ' || o.empno || ' sal-
ary changed from ' || CHAR(o.salary) || ' to ' ||
CHAR(n.salary) || ' by ' || USER)
Trong ví d này thì th tc b%y audit_emp_sal c s dng thc hin vic kim
tra trên ct salary ca bng employee. Khi mt ai ó to s thay i trong ct này thì
on mã này s, thc hin vic ghi thông tin v vic thay i liên quan n bng Salary
vào trong bàng khácg&i là audit. Ti dòng “OLD as o NEW as n ” ch- ra tin t “o” này
s, c dùng i din giá tr c. hoc giá trì t+n ti trong bng, và tin t “n” s, c
s dng i din giá tr mi sau ó t* câu lnh UPDATE. Nh v#y, “o.salary” miêu t
giá tr c. hoc giá tr t+n ti trong bng Salary còn “n.salary” miêu t giá tr c c#p
nh#t mi vào ct d liu Salary.
B%y s kin thay th
B%y thay th c nh ngh'a trên các khung nhìn (view). /nh ngh'a mt cách logic b%y
này s, thc hin vic c#p nh#t cho các lnh SQL triggering. Ví d nh, nu bn thc
hin mt thao tác c#p nh#t trên mt khung nhìn, b%y thay th s, c thc thi thc
hin vic c#p nh#t các bng gc mà các khung nhìn này th hin.
Các th tc b%y không c to t* DB2 Developer Workbench. Chúng có th c to
t* trung tâm iu khin hoc t* các công c dòng lnh khác (Command Window,
Command Line Processor, hoc Command Editor)
Nhp môn H qun tr c s d liu DB2
170
Bài tp nhanh #10 - Khi to mt b%y b6ng Trung tâm iu khin.
Mc tiêu
B%y là mt i tng c s d liu c s dng hoàn thành công vic kinh doanh
mt cách cht ch, khi xy ra thay i d liu trên bng (chèn, sa, xóa). Trong bài t#p
nhanh này, bn s, to mt b%y bng vic s dng Trung tâm iu khin. Cái b%y này s,
lu nh#t ký bán hàng trong bng SALES (bán hàng) cho mc ích kim tra s sách. Bn
s, ghi vào nh#t ký bán hàng mã ca ngi bán hàng (user ID) cùng vi thi im bán.
Th tc:
1. M Trung tâm iu khin.
2. Vi bài t#p nhanh này, bn s, cn khi to mt bng ph c s dng
ghi nh#t ký bán hàng. Khi to mt bng theo các thuc tính sau:
Tên bng: saleslog (nh#t ký bán hàng)
Ct u tiên:
Tên: userid (mã )
Kiu d liêu: VARCHAR(128)
Các thuc tính khác: NOT NULL
Ct th hai:
Tên: daytime (thi im)
Kiu d liu: TIMESTAMP
Các thuc tính khác: NOT NULL
Gi ý: Khi to bng này s dng CREATE TABLE có trong ca s nh#p
lnh, hoc s dng Create table wizard t* Trung tâm iu khin.
3. T* Trung tâm iu khin, m rng tài liu c s d liu EXPRESS. Nhp
chut phi trong th mc Trigger, và ch&n mc “Create”. Ca s i thoi
khi to b%y m ra.
4. /in y theo thông tin trong ca s i thoi:
S + b%y (Trigger schema): User ID (mã) ca ngi bán ã c nh#p vào
(nên c cài t mc nh)
Tên b%y (Trigger name): audit_sales (Kim tra bán hàng)
Bng hay s + hin th: User ID (mã) ca ngi bán ã c nh#p vào (nên
c cài t mc nh)
Bng hay tên hin th (Table or view name): SALES (bán hàng)
Thi gian b%y hot ng (Time to trigger action): After (sau)
Khi nào thì b%y c thc hin (Operation that causes the trigger to be
executed): Update of columns (không lit kê bt c ct nào vì chúng ta mun
b%y thc hin khi bt c ct nào trong s các ct c c#p nh#t)
Chú thích (Comment): Logs all update actions on Sales table (Ghi nh#t ký tt
c các hot ng c#p nh#t trong bng Sales)
Nhp môn H qun tr c s d liu DB2
171
5. Trong bng Triggerred action, ch&n STATEMENT trong mc tùy ch&n For
Each. Nh#p on mã ngu+n sau vào mc hành ng ca b%y:
WHEN (1=1)
BEGIN ATOMIC
INSERT INTO saleslog (userid, daytime) VALUES (CURRENT
USER, CURRENT TIMESTAMP);
END
(Ghi chú: on b%y s, c thc hin mt ln sau khi b%y c kích hot và kt thúc
hoàn toàn. B%y theo dòng ngh'a là hot ng ca b%y s, thc hin mt khi SQL
triggering tác ng vào mt dòng.)
Nhp môn H qun tr c s d liu DB2
172
Kích ch&n nút OK khi to b%y.
6. Bây gi bn nên xem li b%y ã c khi to trong tài liu Triggers th
mc Trung tâm iu khin.
7. Truy vn bng Saleslog m bo cha có d liu trong bng này. Loi b"
nhng hàng có d liu trong bng bng lnh DELETE FROM saleslog.
8. Th c#p nh#t mt bn ghi trong bng sales (Gi ý: s dng Command Editor
hoc SQL Assist Wizard).
9. Kim tra li mt ln na ni dung ca bng saleslog. Xem có bao nhiêu hàng
trong ó.
15.3 Hàm ngi dùng $nh ngh-a (UDF)
Hàm ngi dùng nh ngh'a là mt i tng ng dng c s d liu, nó c sp xp
thành b d liu nh#p và d liu xut. Ví d: mt hàm có th ly kích thc d liu vào
bng inch, và tr li kt qu bng centimetes.
DB2 h tr to nhng hàm s dng SQL PL, C/C++, Java, CLR (Common Language
Runtime), và OLE (Object Linking and Embedding). Trong cun sách này, chúng tôi nói
ch yu v hàm SQL PL bi tính n gin, ph bin và hiu sut ca chúng.
Có là 4 loi hàm: hàm vô hng (Scalar Funcitons), hàm bng (Table Functions) , hàm
dòng (Row Functions), và hàm ct (Column Functions). Trong bài này chúng tôi ch- t#p
trung vào hàm vô hng và hàm bng.
15.3.1 Hàm vô hng
Hàm vô hng tr li mt giá tr n. Nó không th cha các câu lnh SQL, các câu
lnh INSERT, UPDATE và DELETE s, làm thay i trng thái ca c s d liu thì
không c chp nh#n. Mt vài hàm vô hng c cài t s)n là SUM(), AVG(),
DIGITS(), COALESCE(), và SUBSTR().
Nhp môn H qun tr c s d liu DB2
173
DB2 cho phép bn tùy bin xây dng hàm ngi dùng nh ngh'a, t* ó bn có th
thng xuyên s dng nó theo ý ngh'a logic. Ví d, tính n s chuyn i ng dng
ca bn t* Oracle sang DB2. Trong ng dng này, bn g&i hàm NVL() ca Oracle
khp ni. Hàm tng ng cài t s)n trong DB2 c g&i là COALESCE. Thay vì
bn phi i tên tt c các hàm NVL trong ng dng thành COLALESCE, bn có th to
mt UDF trong DB2 g&i nó là NVL, và nó s, kích hot hàm COLALESCE khi c g&i;
ta s, vit hàm NLV nh di ây:
CREATE FUNCTION NVL (p_var1 VARCHAR(30) ,
p_var2 VARCHAR(30))
SPECIFIC nvlvarchar30
RETURNS VARCHAR(30)
RETURN COALESCE (p_var1 , p_var2)
Hàm COALESCE trong trng hp này tr li i s u tiên là không rng (not NULL)
Di ây là mt ví d khác ca hàm vô hng. Hàm c g&i là “deptname”, và nó tr
li mã s ca phòng/ban (department) ca mt nhân viên da trên các mã (ID) ca h&:
CREATE FUNCTION deptname(p_empid VARCHAR(6))
RETURNS VARCHAR(30)
SPECIFIC deptname
BEGIN AUTOMIC
DECLARE v_department_name VARCHAR(30);
DECLARE v_err VARCHAR(70);
SET v_department_name =(
SELECT d.deptname FROM department d,employee e
WHERE e.workdept = d.deptno AND e.empno = p_empid);
SET v_err = ‘Error:employee’ || p_empid || ‘was not found’;
IF v_department_name IS NULL THEN
SIGNAL SQLSTATE ‘80000’ SET MESSAGE_TEXT = v_err;
END IF;
RETURN v_department_name;
END
/ kim tra li hàm, th li trong Command Window hoc Linux/UNIX vi lnh:
db2 “values (deptname(‘000300’))”
Gi hàm vô hng
Hàm vô hng ca ngi dùng có th c g&i trong câu lnh SQL, bt k âu giá tr
vô hng c s dng, hoc trong mnh liên quan n mt “Giá tr”. /ây là hai ví
d biu di0n li g&i hàm vô hng COALESCE:
SELECT DEPTNAME, COALESCE(MGRNO,‘ABSENT’)FROM DEPARMENT
VALUES COALESCE(‘A’,‘B’)
15.3.2 Hàm bng
Hàm bng tr li mt bng ca các bn ghi. Bn có th g&i chúng trong mnh FROM
ca mt truy vn. Hàm bng ngc li vi hàm vô hng là có th thay i trng thái c
s d liu, bi v#y, các câu lnh INSERT, UPDATE và DELETE c chp nh#n. Mt
vài hàm bng c cài t s)n là SNAPSHOT_DYN_SQL() và MQREADALL(). Hàm
bng c.ng ging nh khung nhìn (view), nhng ây nó cho phép các lnh làm thay i
Nhp môn H qun tr c s d liu DB2
174
d liu (chèn, sa, xóa) mt cách mnh hn. /in hình là chúng thng tr li mt bng
hoc gi li mt bn ghi kim tra.
Di ây là mt ví d ca hàm bng lit kê mt nóm nhân viên trong phòng:
CREATE FUNCTION getEnumEmployee(p_dept VARCHAR(3))
RETURNS TABLE
(empno CHAR(6),
lastname VARCHAR(15),
firstnme VARCHAR(12))
SPECIFIC getEnumEmployee
RETURN
SELECT e.empno, e.lastname, e.firstnme
FROM employee e
WHERE e.workdept = p_dept
/ kim tra hàm trên, th li vi câu lnh sau:
db2 “SELECT * FROM table(getEnumEmployee(‘D11’)) AS t”
Gi hàm bng
Mt hàm bng ngi dùng nh ngh'a c g&i trong mnh FROM ca câu lnh
SQL. Hàm TABLE() cn s dng và ph i có bí danh. Hình 15.2 minh h&a mt ví d ca
cách g&i hàm “getEnumEmployee” mà chúng tôi ã kim tra.
Hình 15.3 - L
i gi mt hàm bng.
Nhp môn H qun tr c s d liu DB2
175
Bài tp nhanh #11 - Khi to UDF s" dng DB2 Developer Wordbench
Mc ích:
DB2 Developer Workbench (DWB) là mt công c phát trin (IDE) vit các th tc và
các hàm.Trong bài t#p nhanh này, các bn s, phi to mt hàm vô hng do ngi
dùng nh ngh'a trong DWB. Vic này s, em li cho bn nhiu kinh nghim hn vi
DBW, tt cho vic trau d+i kin thc vi ngôn ng SQL PL xây dng các hàm ngi
dùng nh ngh'a.
Quy trình thc hin:
1. M DBW ( Gi ý: có s)n trong bng ch&n Start)
2. T* ca s Data Project Explorer ch&n d án bn ã to bài t#p nhanh trc và
ch&n Open Project.
3. Kích chut phi vào th mc User-Defined Functions. Ch&n mc New. Sau ó
ch&n mc SQL User-Defined Function. Bn có th ch&n mc User-Defined
Function using Wizard nu cn c hng d%n trong sut quá trình s dng.
4. Trình son tho m vi hàm chính. R+i sa i mã lnh nh di ây:
CREATE FUNCTION booktitle(p_bid INTEGER)
RETURNS VARCHAR(300)
SQL UDF (Scalar)
SPECIFIC booktitle
F1: BEGIN ATOMIC
DECLARE v_book_title VARCHAR(300);
DECLARE v_err VARCHAR(70);
SET v_book_title = (SELECT title FROM books WHERE
p_bid = book_id);
SET v_err = ‘Error: The book with ID ‘ || CHAR(p_bid) ||
‘was Not found.’;
IF v_book_title IS NULL THEN SIGNAL SQLSTATE ‘80000’
SET MESSAGE_TEXT = v_err;
END IF;
RETURN v_book_title;
END
5. Xây dng hàm bng cách kích chut phi trên hàm và ch&n Deploy.
6. Cho chy hàm bng cách kích chut vào nút Run trên thanh công c.
7. Sau khi hàm chp nh#n nh#p mt tham s vào, mt ca s thông báo hin ra yêu
cu bn in giá tr cho tham s.
Nh#p giá tr: 80002
Kt qu là gì?
Th li vi giá tr: 1002
/iu gì xy ra lúc này? (gi ý: Nhìn vào on Messages ca Out-put view)
8. /óng DBW khi bn ã hoàn thành.
Nhp môn H qun tr c s d liu DB2
176
16
Chng 16 – SQL/XML và XQuery
Trong chng này chúng ta bàn v pureXML, mt công ngh mi c cung cp trong
DB2 phiên bn 9 h tr vic lu tr thun XML. Nhiu ví d và khái nim c bàn
lu#n trong chng này c ly t* sách " IBM: DB2 9: Tng quan và Bt u nhanh
vi pureXML (IBM Redbook: DB2 9: pureXML overview and fast start). Xem phn tài
nguyên bit thêm thông tin. Hình 16.1 th hin phn kin thc trong bc tranh tng
quát ca DB2 s, c c#p trong chng này.
Hình 16.1 – Bc tranh tng quát DB2: các lnh DB2, SQL/XML và XQuery
16.1 S" dng XML vi các c s d liu
Các tài liu XML c lu di dng t#p tin vn bn, kho XML, hay c s d liu. Có
hai nguyên nhân chính là ti sao nhiu công ty xut lu tr XML bng c s d liu:
Nhp môn H qun tr c s d liu DB2
177
• Qun lý lng ln h+ s XML là mt vn v c s d liu. XML là d liu
ging nh các d liu khác, ch- khác phn nh dng. Nhng nguyên nhân
tng t lu tr d liu quan h trên c s( d liu XML: các c s d liu
cung cp chc nng tìm kim và rút trích hiu qu, h tr tính bn vng ca d
liu mt cách tin c#y, sao lu và phc h+i, h tr giao dch, tính hiu qu và kh
nng m rng.
• Tính tích hp: bng cách lu tr các tài liu quan h và XML cùng vi nhau, bn
có th tích hp d liu XML mi cùng vi d liu quan h ã có, và kt hp SQL
vi XPath hay XQuery trong mt câu truy vn. Hn na, d liu quan h có th
c chuyn thành XML và ngc li. Thông qua vic tích hp, các c s d
liu có th h tr các ng dng web (web applications), SOA (Service Oriented
Architecture) và các dch v web (web services).
16.2 C s d liu XML
Có hai loi c s d liu lu tr d liu, h+ s XML:
C s d liu h tr XML
C s d liu thun XML
16.2.1 c s d liu h tr XML
Mt c s d liu h tr XML s, s dng mô hình quan h là mô hình chính lu tr
d liu. /iu này cn s ánh x gia mô hình d liu XML và mô hình d liu quan h,
hoc là lu tr d liu XML nh là i tng ln có thuc tính. Trong khi xem xét vic
này nh là công ngh c. thì nhiu nhà cung cp c s d liu v%n s dng cách nh
trên. Hình 16.2 gii thích chi tit hn hai la ch&n cho c s d liu h tr XML.
Hình 16.2 – Hai la chn lu tr d liu XML trong c s d liu h tr XML
Bên trái hình 16.2 cho thy phng thc lu tr tài liu XML trong c s d liu “CLOB
và Varchar”. Tài liu XML dùng phng thc này c lu bng c nh CLOB và ct
kiu Varchar trong c s d liu. Phng thc này không linh hot bi vì khó tìm c
các phn t bên trong nh. Hiu nng ca nó c.ng không cao vì các nh XML thng
rt ln do ó tn b nh. Nhiu máy ch d liu, bao g+m máy ch DB2, không ti hình
nh vào b nh, mà x lý trc tip trên 'a. S dng hình nh hin nhiên s, không t
hiu nng tt.
Nhp môn H qun tr c s d liu DB2
178
La ch&n còn li cho c s d liu h tr XML là phng thc phân rã, phng thc
này c minh h&a bên phi ca hình 16.2. Toàn b tài liu XML dùng phng thc này
b phân rã thành nhiu phn (phn t) r+i lu trong các bng. S dng phng pháp
này mô hình phân cp ca tài liu XML b chuyn thành mô hình quan h. Phng pháp
này c.ng không linh hot: mt thay i trong tài liu XML không d0 gì lan truyn n các
bng tng ng và có th phi to nhiu bng khác khi cn thit. Phng thc này
c.ng không hiu qu: nu bn cn ly li tài liu XML ban u, bn phi thc hin các
tác v SQL vi chi phí cao, vic này còn tn chi phí khi s lng bng c kt ni càng
nhiu.
16.2.2 C s d liu thun XML
C s d liu thun XML s dng mô hình phân cp ca d liu XML lu tr và x
lý XML bên trong. /nh dng lu tr thì ging nh nh dng x lý: không có s ánh x
n mô hình quan h, và không lu các tài liu XML thành dng nh. Khi s dng các
câu ln XPath hay XQuery, mt c ch (engine) s, x lý các câu lnh ó ch không
chuyn sang SQL. /ây là nguyên nhân ti sao g&i các c s d liu này là c s d
liu thun XML. Hin ti, DB2 9 là máy ch thng mi duy nht cung cp tính nng
này.
16.3 XML trong DB2
Hình 16.3 bên di phác h&a cách thc lu tr d liu quan h và d liu phân cp
(các tài liu XML) trong DB2 phiên bn 9. Trong hình, gi s nh ngh'a bng dept nh
sau :
CREATE TABLE dept (deptID char(8) ,…, deptdoc XML);
Hình 16.3 – XML trong DB2
Chú ý rng khi nh ngh'a bng dept có s dng kiu d liu mi XML cho ct deptdoc.
M.i tên bên trái ca hình trên cho thy ct deptID c lu tr bng nh dng quan
h (dng bng), trong khi ct detdoc c lu bng nh dng phân cp ã c
phân rã. Hình 16.4 minh h&a bn cách truy xut d liu trong DB2 phiên bn 9:
S dng SQL truy xut d liu quan h.
S dng SQL vi XML m rng truy xut d liu XML
S dng XQuery truy xut d liu XML
S dng XQuery truy xut d liu quan h
Nhp môn H qun tr c s d liu DB2
179
Hình 16.4 – Bn cách truy xut d liu trong DB2
Vì v#y, trong khi mt ngi s dng SQL xem DB2 nh là mt h qun tr c s d liu
quan h (RDBMS – Relational Database Management System) cp cao c.ng có h tr
XML, còn mt ngi s dng XML thì s, xem DB2 nh là kho tr XML cp cao có h
tr SQL.
Chú ý rng IBM dùng thu#t ng pureXML thay vì “native XML” mô t công ngh này.
Trong khi các hãng khác v%n dùng công ngh c. CLOB/Varchar hay phân rã lu tr
các tài liu XML, h& g&i nhng công ngh c. ó là “native XML”. IBM quyt nh dùng
thu#t ng mi pureXML tránh s nhm l%n và t thng hiu tên này các hãng
khác v c s d liu hay XML không s dng trùng thu#t ng biu th cho các công
ngh khác. Chú ý, s h tr pureXML ch- c cung cp khi to ra c s d liu
Unicode.
16.3.1 7u im ca công ngh pureXML trong DB2 9
S dng công ngh pureXML em li nhiu u im sau :
1. Bn có th nâng cao kh nng dùng d liu quan h, bng cách lu tr các tài
liu XML trong các ct ca bng có s dng kiu d liu mi XML.
2. Bn có th gim phc tp ca mã. Ví d, trong hình 16.5 minh h&a mt on
mã PHP c vit v*a s dng và không s dng pureXML. S dng pureXML
(hp màu xanh) giúp gim các dòng mã lnh. /iu này không ch- có ngh'a là mã
lnh ít phc tp mà hiu nng toàn th c ci thin vì s dòng phân tích và
bo trì trong mã lnh ít hn.
Nhp môn H qun tr c s d liu DB2
180
Hình 16.5 - * phc tp khi s" dng hay không s" dng pureXML
3. S dng XML và công ngh pureXML thay i lc + (schema) ca bn d0
dàng hn. Hình 16.6 minh h&a mt ví d v s tng tính linh ng. Trong hình,
gi s rng bn ã có c s d liu g+m các bng Employee và Department.
Mc nh là c s d liu không có XML, nu nhà qun lí ca bn yêu cu bn
lu tr không ch- mi nhân viên mt s in thoi (s in thoi nhà) mà còn lu
thêm s th hai (s di ng) thì bn có th thêm mt ct trong bng Employee và
lu s in thoi di ng trong ct mi ó. Tuy nhiên, cách làm này không úng
vi các lu#t chu n hóa trong c s d liu quan h. Nu bn mun gi úng các
lu#t này thì bn to mt bng Phone mi và chuyn toàn b thông tin s in
thoi qua bng này. Bn c.ng có th thêm nhiu s in thoi di ng. To ra
bng Phone mi thì tn chi phí, bi vì không nhng lng d liu ã có cn
c chuyn ln mà còn tt c các câu SQL trong các ng dng s, phi thay i
im n là bng mi.
Thay vào ó, chúng tôi a ra cách thc hin vic này s dng XML bên trái
hình bên di. Nu nhân viên “Christine” c.ng có mt s in thoi di ng, thì
thêm mt th2 (tag) mi lu thông tin này. Nu nhân viên “Michael” không có
s in thoi di ng thì trng.
Nhp môn H qun tr c s d liu DB2
181
Hình 16.6 – T ng s mm d)o khi s" dng XML
4. Bn có th ci thin hiu nng ng dng XML ca mình. Thc hin các kim tra
dùng công ngh pureXML cho thy s ci thin áng k cho nhiu ng dng
XML. Hình 16.7 cho thy các kt qu ánh giá cho vic mt công ty chuyn sang
s dng công ngh pureXML. Ct gia cho thy kt qu làm vic vi XML
bng phng thc c., và ct th ba là kt qu s dng pureXML trong DB2 9.
Hình 16.7 – S t ng hiu n ng khi s" dng công ngh pureXML
16.3.2 Khái nim c bn v XPath
XPath là mt ngôn ng mà ta có th dùng nó truy vn các tài liu XML. Hình 16.8 mô
t mt tài liu XML và hình 16.9 c.ng minh h&a tài liu ó c trình bày vi dng "phân
tích phân cp" (c.ng c g&i là nút (node) hay lá (leaf)). Chúng ta s, x dng nh
dng "phân tích phân cp" gii thích XPath hot ng nh th nào.
Nhp môn H qun tr c s d liu DB2
182
Hình 16.8 - Mt tài liu XML
Hình 16.9 - Trình bày tài liu XML hình 16.8 theo dng “phân tích phân cp”
Mt cách nhanh chóng h&c XPath ó là so sánh nó vi câu lnh i th mc (CD)
trong MS-DOS hay trong Linux/UNIX. S dng câu lnh CD bn i qua mt cây th mc
nh sau:
cd /directory1/directory2/
Tng t, trong XPath bn s dng nhng du gch chéo (/) chuyn t* mt thành
phn này n mt thành phn khác trong tài liu XML. Ví d, bng cách s dng tài liu
trong hình 16.9 vi XPath bn có th ly ra tên ca tt c các nhân viên thông qua câu
truy vn sau:
/dept/employee/name
Các biu thc XPath
Các biu thc XPath s dng ng d%n y nh ra các thành phn và/hay các
thuc tính. Kí hiu "@" dùng ch- thuc tính. / ch- ly giá tr (text node) ca mt
thành phn, ta s dng hàm "text()". Bng 16.1 minh h&a mt vài câu truy vn XPath và
kt qu tng ng khi áp dng trên tài liu XML ã cho hình 16.9
Nhp môn H qun tr c s d liu DB2
183
XPath Kt qu
/dept/@bldg 101
/dept/employee/@id 901
902
/dept/employee/name <name>Peter Pan</name>
<name>John Doe</name>
/dept/employee/name/text() Peter Pan
John Doe
Bng 16.1 – Các ví d v biu thc XPath
Các kí t i din
Có 2 kí t i din chính trong XPath:
• "*" thay th cho bt kì tên th2 nào
• "//" là kí t i din cho "t* ây tr xung" (descendent-or-self)
Bng 16.2 cho ta thêm vài ví d da trên tài liu XML hình 16.9
XPath Kt qu
/dept/employee/*/text() John Doe
408 555 1212
344
Peter Pan
408 555 9918
216
/dept/employee/@id 901
902
/dept/employee/name <name>Peter Pan</name>
<name>John Doe</name>
/dept/employee/name/text() Peter Pan
John Doe
/dept//phone <phone>408 555 1212</phone>
<phone>408 555 9918</phone>
Bng 16.2 - Các ví d v kí t i din trong XPath
Các v$ t& ca XPath
Các v t* ca XPath c t trong cp du ngoc vuông []. Mt cách tng t, bn có
th ngh' chúng nh là mt thành phn tng ng vi mnh WHERE trong SQL. Ví
d [@id="902"] có th c hiu là "vi iu kin thuc tính id có giá tr bng 902".
Trong mt biu thc XPath có th có nhiu v t*. / ch- ra mt v t* có v trí, ta s dng
[n] vi ý ngh'a là thành phn con th n s, c ch&n. Ví d employee[2] ngh'a là ngi
công nhân th 2 s, c ch&n. Bng 16.3 s, cho ta nhiu ví d hn:
XPath Kt qu
/dept/employee[@id=”902”]/name <name>Peter Pan</name>
/dept[@bldg=”101”]/employee[office
> “300”]/name
<name>John Doe</name>
//employee[office=”304” OR office=”216”]/@id 901
902
/dept/employee[2]/@id 902
Bng 16.3 - Các ví d v v$ t& XPath
Nhp môn H qun tr c s d liu DB2
18
4
Trc cha XPath:
Tng t vi MS-DOS hay Linux/UNIX, bn có th dùng mt du chm (.) nh ra
trong biu thc rng bn tham chiu n v trí hin ti, và hai du chm ( ) tham
chiu n ví trí trên nó mt cp (mc cha).
Bng 16.4 cho ta thêm vài ví d
XPath Kt qu
/dept/employee/name[ /@id=”902”] <name>Peter Pan</name>
/dept/employee/office[.>”300”] <office>344</office>
/dept/employee[office > “300”]/office <office>344</office>
/dept/employee[name = “John Doe”]/ /@bldg 101
/dept/employee/name[.=”John Doe”]/ / /@bldg 101
Bng 16.4 – Trc cha Xpath
16.3.3 *$nh ngh-a XQuery
XQuery là mt ngôn ng truy vn c to ra cho XML. XQuery h tr các biu thc
ng d%n nh v trí trong cu trúc phân cp XML. Thc t XPath là mt t#p con ca
XQuery, do ó, tt c nhng gì chúng ta ã h&c trc ây v XPath c.ng c áp dng
vi XQuery. XQuery h tr c d liu có kiu và d liu không có kiu. XQuery không
cha giá tr null vì tài liu XML b" i nhng d liu thiu hay không xác nh. XQuery tr
v mt chui các d liu XML.
Mt chú ý quan tr&ng là các biu thc XQuery và XPath phân bit ký t vit hoa và vit
thng.
XQuery h tr biu thc FLWOR (&c nh flower). Trong SQL nó s, tng ng vi biu
thc SELECT-FROM-WHERE. Phn tip theo s, gii thích rõ hn v FLWOR
XQuery: Biu thc FLWOR
FLWOR vit tt cho:
• FOR: lp qua tt c các phn t ca mt dãy các thành phn và gán mt bin
cho các thành phn.
• LET: Gán mt bin vi mt dãy.
• WHERE: loi ra các thành phn trong quá trình lp
• ORDER: sp xp li các thành phn trong khi lp
• RETURN: to ra giá tr tr v cho câu truy vn.
/ây là mt biu thc cho phép ta thao tác vi các tài liu XML, cho phép bn tr v
nhng biu thc khác. Ví d, gi s bn ã có 1 bng vi nh ngh'a nh sau:
CREATE TABLE dept (deptID CHAR(8), deptdoc XML);
Và tài liu XML sau c thêm vào trong các ct ca deptdoc:
<dept bldg=”101”>
<employee id=”901”>
<name>John Doe</name>
Nhp môn H qun tr c s d liu DB2
185
<phone>408 555 1212</phone>
<office>344</office>
</employee>
<employee id=”902”>
<name>Peter Pan</name>
<phone>408 555 9918</phone>
<office>216</office>
</employee>
</dept>
Thì khi ó câu lnh XQuery sau s dng FLWOR có th c thc hin:
xquery
for $d in db2-fn:xmlcolumn(‘dept.deptdoc’)/dept
let $emp := $d//employee/name
where $d/@bldg > 95
order by $d/@bldg
return
<EmpList>
{$d/@bldg, @emp}
</EmpList>
Và s, cho ta kt qu sau:
<EmpList bldg=”101”>
<name>
John Doe
</name>
<name>
Peter Pan
</name>
</EmpList>
16.3.4 Chèn các tài liu XML
Vic chèn các tài liu XML vào c s d liu DB2 có th thc hin bng câu lnh
INSERT SQL, hay công c IMPORT. Không th dùng XQuery chèn tài liu XML khi
nó cha c nh ngh'a trong chu n.
Kim tra tp kch bn sau, nó có th chy trong DB2 Command Window hoc Linux shell
dùng lnh này.
db2 -tvf table_creation.txt
table_creation.txt
(1)
drop database mydb
;
(2)
create database mydb using codeset UTF-8 territory US
;
(3)
connect to mydb
;
(4)
create table items (
Nhp môn H qun tr c s d liu DB2
186
id int primary key not null,
brandname varchar(30),
itemname varchar(30),
sku int,
srp decimal(7,2),
comments xml
);
(5)
create table clients(
id int primary key not null,
name varchar(50),
status varchar(10),
contact xml
);
(6)
insert into clients values (77, 'John Smith', 'Gold',
'<addr>111 Main St., Dallas, TX, 00112</addr>')
;
(7)
IMPORT FROM "D:\Raul\clients.del" of del xml from "D:\Raul" INSERT INTO CLIENTS
(ID, NAME, STATUS, CONTACT)
;
(8)
IMPORT FROM "D:\Raul\items.del" of del xml from "D:\Raul" INSERT INTO ITEMS (ID,
BRANDNAME, ITEMNAME, SKU, SRP, COMMENTS)
Lu ý rng tp kch bn này và nhng tp liên quan c cung cp trong tp nén ex-
pressc_book_quicklabs.zip i kèm vi sách. Bên di chúng ta mô t t*ng dòng lnh
trong tp kch bn.
1. Xóa c s d liu “mydb”. Thao tác này thng c thc hin trong các tp
kch bn làm nhim v d&n d7p. Nu nh trc ó cha có “mydb”, bn s,
nh#n c c mt thông báo li, nhng nó không gây nh hng n vic ta
ang làm.
2. To c s d liu “mydb” s dng b mã UTF-8. Mt c s d liu UNICODE
c òi h"i h tr pureXML, vì v#y bc này là cn thit to mt c s d
liu thành mt c s d liu UNICODE.
3. Kt ni n c s d liu “mydb” v*a mi c to. Lnh này cn thit to ra
các i tng trong c s d liu.
4. To bng “items”. / ý thy ct cui cùng trong bng (ct “comments”) c
nh ngh'a nh là mt ct XML s dng kiu d liu XML mi.
5. To bng “clients”. Ct cui trong bng (ct “contact”) c.ng c nh ngh'a vi
kiu d liu XML mi.
6. Dùng lnh SQL INSERT này, chèn mt tài liu XML vào mt ct XML. Trong
câu lnh INSERT bn truyn tài liu XML vào nh là mt chui bao bi du nháy
n.
7. Dùng lnh IMPORT, chèn hoc nh#p nhiu tài liu XML cùng vi d liu quan
h vào c s d liu. Lnh 7, bn nh#p d liu t* tp clients.del (mt tp ascii
Nhp môn H qun tr c s d liu DB2
187
c du phân cách), và bn c.ng có th ch- ra ni mà d liu XML c tham
chiu bi tp clients.del ó c nh v (trong ví d này là th mc D:\Raul).
Chúng ta s, tìm hiu k$ hn tp clients.del, nhng trc ht, hãy xem ni dung ca th
mc D:\Raul (Hình 16.10)
Hình 16.10 – Ni dung ca th mc D:\Raul vi các tài liu XML
/ây là ni dung ca tp clients.del
clients.del
3227,Ella Kimpton,Gold,<XDS FIL='Client3227.xml' />,
8877,Chris Bontempo,Gold,<XDS FIL='Client8877.xml'/>,
9077,Lisa Hansen,Silver,<XDS FIL='Client9077.xml' />
9177,Rita Gomez,Standard,<XDS FIL='Client9177.xml'/>,
5681,Paula Lipenski,Standard,<XDS FIL='Client5681.xml' />,
4309,Tina Wang,Standard,<XDS FIL='Client4309.xml'/>
Trong tp clients.del, “XDS FIL=” c dùng tr" n mt tp tài liu XML c th. Hình
16.11 cho thy trung tâm iu khin sau khi chy tp kch bn trên.
Nhp môn H qun tr c s d liu DB2
188
Hình 16.11 – Trung tâm iu khin sau khi thc hin table_creation.txt
Trong hình là ni dung ca bng CLIENTS. Ct cui cùng “Contact” là mt ct XML. Khi
bn nhp vào nút có ba du chm, mt ca s khác m ra cho bn thy ni dung tài liu
XML. Ca s này nm góc di bên phi ca hình 16.11
16.3.5 Truy vn d liu XML
Trong DB2, có 2 cách truy vn d liu XML:
• S dng SQL vi các lnh m rng cho XML (SQL/XML)
• S dng XQuery
Trong c 2 cách trên, DB2 u tuân theo chu n XML quc t.
Truy vn d liu XML vi SQL/XML
S dng nhng câu lnh SQL thun túy cho phép bn làm vic vi c dòng và ct. Mt
câu lnh SQL làm vic c vi nguyên c tài liu XML; tuy nhiên nó li không có kh
nng làm vic vi ch- mt phn ca tài liu XML. Trong trng hp này, bn cn s
dng SQL vi các lnh m rng cho XML (SQL/XML).
Bng 16.5 bên di mô t mt s hàm SQL/XML có s)n vi chu n SQL 2006
Tên hàm Mô t
XMLPARSE Tách (phân tích) thuc tính hoc d liu nh phân trong 1 i
tng ln, ly ra giá tr XML
XMLSERIALIZE Chuyn giá tr XML sang thuc tính hoc d liu nh phân
trong 1 i tng ln
XMLVALIDATE /ánh giá giá tr ca XML vi s + XML (XML Schema) và
ghi chú kiu các giá tr ca XML
XMLEXISTS Xác nh (kim tra) câu truy vn XQuery có giá tr tr v không
(ví d mt dãy giá tr hay nhiu hn)