Tải bản đầy đủ (.pdf) (21 trang)

nhập môn hệ quản trị Cơ sở dữ liệu phần 9 docx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.15 MB, 21 trang )

Nhp môn H qun tr c s d liu DB2

168


















Hình 15.1 – Ví d v b%y trc

Trong hình 15.1, b%y “defalt_class_end” s, b%y trc lnh khi INSERT SQL c thc
hin trong bng cl_sched. Bng này là mt phn ca c s d liu SAMPLE, ban có th
to và th kim tra b%y này khi kt ni vi c s d liu này. Bin “n” trong nh ngh'a
ca b%y s, i din cho giá tr mi ca lnh INSERT, giá tr s, chèn vào. B%y này s,
kim tra s hp l ca các giá tr chèn vào. Nu ct “ending” không có giá tr gì khi chèn,
thì b%y này s, m bo chc chn là có giá tr ca ct “starting” cng 1 c chèn vào.

Các lnh sau giúp ta kim 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 tc b%y “validate_sched” di ây cho phép m rng hàm b%y “default_class_end”
ã mô t trc ây. Xin nhc li rng, bn có th to ra nó và kim tra nó da vào c s
d liu 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
Nhp môn H qun tr c s d liu 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 hot sau khi các SQL triggering thc hin thành công. Các thao tác
trong b%y này có th kích hot các b%y khác (s ni tng c cho phép n 16 mc).
B%y sau h tr các thao tác INSERT, UPDATE và DELETE. Di ây là ví d ca mt
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 tc b%y audit_emp_sal c s dng  thc hin vic kim
tra trên ct salary ca bng employee. Khi mt ai ó to s thay i trong ct này thì
on mã này s, thc hin vic ghi thông tin v vic thay i liên quan n bng Salary
vào trong bàng khácg&i là audit. Ti dòng “OLD as o NEW as n ” ch- ra tin t “o” này
s, c dùng  i din giá tr c. hoc giá trì t+n ti trong bng, và tin t “n” s, c
s dng  i din giá tr mi sau ó t* câu lnh UPDATE. Nh v#y, “o.salary” miêu t
giá tr c. hoc giá tr t+n ti trong bng Salary còn “n.salary” miêu t giá tr c c#p
nh#t mi vào ct d liu Salary.

B%y s kin thay th
B%y thay th c nh ngh'a trên các khung nhìn (view). /nh ngh'a mt cách logic b%y
này s, thc hin vic c#p nh#t cho các lnh SQL triggering. Ví d nh, nu bn thc
hin mt thao tác c#p nh#t trên mt khung nhìn, b%y thay th s, c thc thi  thc
hin vic c#p nh#t các bng gc mà các khung nhìn này th hin.

Các th tc b%y không c to t* DB2 Developer Workbench. Chúng có th c to
t* trung tâm iu khin hoc t* các công c dòng lnh khác (Command Window,
Command Line Processor, hoc Command Editor)

Nhp môn H qun tr c s d liu DB2

170
Bài tp nhanh #10 - Khi to mt b%y b6ng Trung tâm iu khin.

Mc tiêu

B%y là mt i tng c s d liu c s dng  hoàn thành công vic kinh doanh

mt cách cht ch, khi xy ra thay i d liu trên bng (chèn, sa, xóa). Trong bài t#p
nhanh này, bn s, to mt b%y bng vic s dng Trung tâm iu khin. Cái b%y này s,
lu nh#t ký bán hàng trong bng SALES (bán hàng) cho mc ích kim tra s sách. Bn
s, ghi vào nh#t ký bán hàng mã ca ngi bán hàng (user ID) cùng vi thi im bán.

Th tc:

1. M Trung tâm iu khin.
2. Vi bài t#p nhanh này, bn s, cn khi to mt bng ph c s dng 
ghi nh#t ký bán hàng. Khi to mt bng theo các thuc tính sau:

Tên bng: saleslog (nh#t ký bán hàng)

Ct u tiên:
Tên: userid (mã )
Kiu d liêu: VARCHAR(128)
Các thuc tính khác: NOT NULL

Ct th hai:
Tên: daytime (thi im)
Kiu d liu: TIMESTAMP
Các thuc tính khác: NOT NULL

Gi ý: Khi to bng này s dng CREATE TABLE có trong ca s nh#p
lnh, hoc s dng Create table wizard t* Trung tâm iu khin.
3. T* Trung tâm iu khin, m rng tài liu c s d liu EXPRESS. Nhp
chut phi trong th mc Trigger, và ch&n mc “Create”. Ca s i thoi
khi to b%y m ra.
4. /in y  theo thông tin trong ca s i thoi:


S + b%y (Trigger schema): User ID (mã) ca ngi bán ã c nh#p vào
(nên c cài t mc nh)

Tên b%y (Trigger name): audit_sales (Kim tra bán hàng)

Bng hay s + hin th: User ID (mã) ca ngi bán ã c nh#p vào (nên
c cài t mc nh)

Bng hay tên hin th (Table or view name): SALES (bán hàng)

Thi gian  b%y hot ng (Time to trigger action): After (sau)

Khi nào thì b%y c thc hin (Operation that causes the trigger to be
executed): Update of columns (không lit kê bt c ct nào vì chúng ta mun
b%y thc hin khi bt c ct nào trong s các ct c c#p nh#t)

Chú thích (Comment): Logs all update actions on Sales table (Ghi nh#t ký tt
c các hot ng c#p nh#t trong bng Sales)
Nhp môn H qun tr c s d liu DB2

171





5. Trong bng Triggerred action, ch&n STATEMENT trong mc tùy ch&n For
Each. Nh#p on mã ngu+n sau vào mc hành ng ca b%y:

WHEN (1=1)

BEGIN ATOMIC
INSERT INTO saleslog (userid, daytime) VALUES (CURRENT
USER, CURRENT TIMESTAMP);
END

(Ghi chú: on b%y s, c thc hin mt ln sau khi b%y c kích hot và kt thúc
hoàn toàn. B%y theo dòng ngh'a là hot ng ca b%y s, thc hin mt khi SQL
triggering tác ng vào mt dòng.)


Nhp môn H qun tr c s d liu DB2

172


Kích ch&n nút OK  khi to b%y.

6. Bây gi bn nên xem li b%y ã c khi to trong tài liu Triggers  th
mc Trung tâm iu khin.
7. Truy vn bng Saleslog  m bo cha có d liu trong bng này. Loi b"
nhng hàng có d liu trong bng bng lnh DELETE FROM saleslog.
8. Th c#p nh#t mt bn ghi trong bng sales (Gi ý: s dng Command Editor
hoc SQL Assist Wizard).
9. Kim tra li mt ln na ni dung ca bng saleslog. Xem có bao nhiêu hàng
trong ó.
15.3 Hàm ngi dùng $nh ngh-a (UDF)
Hàm ngi dùng nh ngh'a là mt i tng ng dng c s d liu, nó c sp xp
thành b d liu nh#p và d liu xut. Ví d: mt hàm có th ly kích thc d liu vào
bng inch, và tr li kt qu bng centimetes.


DB2 h tr to nhng hàm s dng SQL PL, C/C++, Java, CLR (Common Language
Runtime), và OLE (Object Linking and Embedding). Trong cun sách này, chúng tôi nói
ch yu v hàm SQL PL bi tính n gin, ph bin và hiu sut ca chúng.

Có là 4 loi hàm: hàm vô hng (Scalar Funcitons), hàm bng (Table Functions) , hàm
dòng (Row Functions), và hàm ct (Column Functions). Trong bài này chúng tôi ch- t#p
trung vào hàm vô hng và hàm bng.
15.3.1 Hàm vô hng
Hàm vô hng tr li mt giá tr n. Nó không th cha các câu lnh SQL, các câu
lnh INSERT, UPDATE và DELETE s, làm thay i trng thái ca c s d liu thì
không c chp nh#n. Mt vài hàm vô hng c cài t s)n là SUM(), AVG(),
DIGITS(), COALESCE(), và SUBSTR().
Nhp môn H qun tr c s d liu DB2

173

DB2 cho phép bn tùy bin xây dng hàm ngi dùng nh ngh'a, t* ó bn có th
thng xuyên s dng nó theo ý ngh'a logic. Ví d, tính n s chuyn i ng dng
ca bn t* Oracle sang DB2. Trong ng dng này, bn g&i hàm NVL() ca Oracle 
khp ni. Hàm tng ng cài t s)n trong DB2 c g&i là COALESCE. Thay vì
bn phi i tên tt c các hàm NVL trong ng dng thành COLALESCE, bn có th to
mt UDF trong DB2 g&i nó là NVL, và nó s, kích hot hàm COLALESCE khi c g&i;
ta s, vit hàm NLV nh di â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 trng hp này tr li i s u tiên là không rng (not NULL)

Di ây là mt ví d khác ca hàm vô hng. Hàm c g&i là “deptname”, và nó tr
li mã s ca phòng/ban (department) ca mt nhân viên da trên các mã (ID) ca 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

/ kim tra li hàm, th li trong Command Window hoc Linux/UNIX vi lnh:

db2 “values (deptname(‘000300’))”

Gi hàm vô hng
Hàm vô hng ca ngi dùng có th c g&i trong câu lnh SQL,  bt k âu giá tr
vô hng c s dng, hoc trong mnh  liên quan n mt “Giá tr”. /ây là hai ví
d biu di0n li g&i hàm vô hng COALESCE:


SELECT DEPTNAME, COALESCE(MGRNO,‘ABSENT’)FROM DEPARMENT
VALUES COALESCE(‘A’,‘B’)
15.3.2 Hàm bng
Hàm bng tr li mt bng ca các bn ghi. Bn có th g&i chúng trong mnh  FROM
ca mt truy vn. Hàm bng ngc li vi hàm vô hng là có th thay i trng thái c
s d liu, bi v#y, các câu lnh INSERT, UPDATE và DELETE c chp nh#n. Mt
vài hàm bng c cài t s)n là SNAPSHOT_DYN_SQL() và MQREADALL(). Hàm
bng c.ng ging nh khung nhìn (view), nhng  ây nó cho phép các lnh làm thay i
Nhp môn H qun tr c s d liu DB2

174
d liu (chèn, sa, xóa) mt cách mnh hn. /in hình là chúng thng tr li mt bng
hoc gi li mt bn ghi kim tra.

Di ây là mt ví d ca hàm bng  lit kê mt 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

/ kim tra hàm trên, th li vi câu lnh sau:

db2 “SELECT * FROM table(getEnumEmployee(‘D11’)) AS t”


Gi hàm bng
Mt hàm bng ngi dùng nh ngh'a c g&i trong mnh  FROM ca câu lnh
SQL. Hàm TABLE() cn s dng và ph i có bí danh. Hình 15.2 minh h&a mt ví d ca
cách g&i hàm “getEnumEmployee” mà chúng tôi ã kim tra.



Hình 15.3 - L
i gi mt hàm bng.

Nhp môn H qun tr c s d liu DB2

175
Bài tp nhanh #11 - Khi to UDF s" dng DB2 Developer Wordbench

Mc ích:

DB2 Developer Workbench (DWB) là mt công c phát trin (IDE)  vit các th tc và
các hàm.Trong bài t#p nhanh này, các bn s, phi to mt hàm vô hng do ngi
dùng nh ngh'a trong DWB. Vic này s, em li cho bn nhiu kinh nghim hn vi
DBW, tt cho vic trau d+i kin thc vi ngôn ng SQL PL  xây dng các hàm ngi
dùng nh ngh'a.

Quy trình thc hin:

1. M DBW ( Gi ý: có s)n trong bng ch&n Start)
2. T* ca s Data Project Explorer ch&n d án bn ã to  bài t#p nhanh trc và
ch&n Open Project.
3. Kích chut phi vào th mc User-Defined Functions. Ch&n mc New. Sau ó

ch&n mc SQL User-Defined Function. Bn có th ch&n mc User-Defined
Function using Wizard nu cn c hng d%n trong sut quá trình s dng.
4. Trình son tho m vi hàm chính. R+i sa i mã lnh nh di â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 dng hàm bng cách kích chut phi trên hàm và ch&n Deploy.
6. Cho chy hàm bng cách kích chut vào nút Run trên thanh công c.
7. Sau khi hàm chp nh#n nh#p mt tham s vào, mt ca s thông báo hin ra yêu
cu bn in giá tr cho tham s.

Nh#p giá tr: 80002


Kt qu là gì?

Th li vi giá tr: 1002

/iu gì xy ra lúc này? (gi ý: Nhìn vào on Messages ca Out-put view)
8. /óng DBW khi bn ã hoàn thành.


Nhp môn H qun tr c s d liu DB2

176
16
Chng 16 – SQL/XML và XQuery

Trong chng này chúng ta bàn v pureXML, mt công ngh mi c cung cp trong
DB2 phiên bn 9  h tr vic lu tr thun XML. Nhiu ví d và khái nim c bàn
lu#n trong chng này c ly t* sách " IBM: DB2 9: Tng quan và Bt u nhanh
vi pureXML (IBM Redbook: DB2 9: pureXML overview and fast start). Xem phn tài
nguyên  bit thêm thông tin. Hình 16.1 th hin phn kin thc trong bc tranh tng
quát ca DB2 s, c  c#p trong chng này.


Hình 16.1 – Bc tranh tng quát DB2: các lnh DB2, SQL/XML và XQuery
16.1 S" dng XML vi các c s d liu
Các tài liu XML c lu di dng t#p tin vn bn, kho XML, hay c s d liu. Có
hai nguyên nhân chính là ti sao nhiu công ty  xut lu tr XML bng c s d liu:

Nhp môn H qun tr c s d liu DB2

177

• Qun lý lng ln h+ s XML là mt vn  v c s d liu. XML là d liu
ging nh các d liu khác, ch- khác phn nh dng. Nhng nguyên nhân
tng t  lu tr d liu quan h trên c s( d liu XML: các c s d liu
cung cp chc nng tìm kim và rút trích hiu qu, h tr tính bn vng ca d
liu mt cách tin c#y, sao lu và phc h+i, h tr giao dch, tính hiu qu và kh
nng m rng.

• Tính tích hp: bng cách lu tr các tài liu quan h và XML cùng vi nhau, bn
có th tích hp d liu XML mi cùng vi d liu quan h ã có, và kt hp SQL
vi XPath hay XQuery trong mt câu truy vn. Hn na, d liu quan h có th
c chuyn thành XML và ngc li. Thông qua vic tích hp, các c s d
liu có th h tr các ng dng web (web applications), SOA (Service Oriented
Architecture) và các dch v web (web services).
16.2 C s d liu XML
Có hai loi c s d liu  lu tr d liu, h+ s XML:
C s d liu h tr XML
C s d liu thun XML
16.2.1 c s d liu h tr XML
Mt c s d liu h tr XML s, s dng mô hình quan h là mô hình chính  lu tr
d liu. /iu này cn s ánh x gia mô hình d liu XML và mô hình d liu quan h,
hoc là lu tr d liu XML nh là i tng ln có thuc tính. Trong khi xem xét vic
này nh là công ngh c. thì nhiu nhà cung cp c s d liu v%n s dng cách nh
trên. Hình 16.2 gii thích chi tit hn hai la ch&n cho c s d liu h tr XML.


Hình 16.2 – Hai la chn  lu tr d liu XML trong c s d liu h tr XML

Bên trái hình 16.2 cho thy phng thc lu tr tài liu XML trong c s d liu “CLOB
và Varchar”. Tài liu XML dùng phng thc này c lu bng c nh CLOB và ct
kiu Varchar trong c s d liu. Phng thc này không linh hot bi vì khó tìm c

các phn t bên trong nh. Hiu nng ca nó c.ng không cao vì các nh XML thng
rt ln do ó tn b nh. Nhiu máy ch d liu, bao g+m máy ch DB2, không ti hình
nh vào b nh, mà x lý trc tip trên 'a. S dng hình nh hin nhiên s, không t
hiu nng tt.
Nhp môn H qun tr c s d liu DB2

178

La ch&n còn li cho c s d liu h tr XML là phng thc phân rã, phng thc
này c minh h&a bên phi ca hình 16.2. Toàn b tài liu XML dùng phng thc này
b phân rã thành nhiu phn (phn t) r+i lu trong các bng. S dng phng pháp
này mô hình phân cp ca tài liu XML b chuyn thành mô hình quan h. Phng pháp
này c.ng không linh hot: mt thay i trong tài liu XML không d0 gì lan truyn n các
bng tng ng và có th phi to nhiu bng khác khi cn thit. Phng thc này
c.ng không hiu qu: nu bn cn ly li tài liu XML ban u, bn phi thc hin các
tác v SQL vi chi phí cao, vic này còn tn chi phí khi s lng bng c kt ni càng
nhiu.
16.2.2 C s d liu thun XML
C s d liu thun XML s dng mô hình phân cp ca d liu XML  lu tr và x
lý XML bên trong. /nh dng lu tr thì ging nh nh dng x lý: không có s ánh x
n mô hình quan h, và không lu các tài liu XML thành dng nh. Khi s dng các
câu ln XPath hay XQuery, mt c ch (engine) s, x lý các câu lnh ó ch không
chuyn sang SQL. /ây là nguyên nhân ti sao g&i các c s d liu này là c s d
liu thun XML. Hin ti, DB2 9 là máy ch thng mi duy nht cung cp tính nng
này.
16.3 XML trong DB2
Hình 16.3 bên di phác h&a cách thc lu tr d liu quan h và d liu phân cp
(các tài liu XML) trong DB2 phiên bn 9. Trong hình, gi s nh ngh'a bng dept nh
sau :


CREATE TABLE dept (deptID char(8) ,…, deptdoc XML);


Hình 16.3 – XML trong DB2

Chú ý rng khi nh ngh'a bng dept có s dng kiu d liu mi XML cho ct deptdoc.
M.i tên bên trái ca hình trên cho thy ct deptID c lu tr bng nh dng quan
h (dng bng), trong khi ct detdoc c lu bng nh dng phân cp ã c
phân rã. Hình 16.4 minh h&a bn cách truy xut d liu trong DB2 phiên bn 9:

 S dng SQL truy xut d liu quan h.
 S dng SQL vi XML m rng  truy xut d liu XML
 S dng XQuery  truy xut d liu XML
 S dng XQuery  truy xut d liu quan h
Nhp môn H qun tr c s d liu DB2

179

Hình 16.4 – Bn cách truy xut d liu trong DB2

Vì v#y, trong khi mt ngi s dng SQL xem DB2 nh là mt h qun tr c s d liu
quan h (RDBMS – Relational Database Management System) cp cao c.ng có h tr
XML, còn mt ngi s dng XML thì s, xem DB2 nh là kho tr XML cp cao có h
tr SQL.

Chú ý rng 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ã  lu tr
các tài liu XML, h& g&i nhng công ngh c. ó là “native XML”. IBM quyt nh dùng
thu#t ng mi pureXML  tránh s nhm l%n và t thng hiu tên này  các hãng
khác v c s d liu hay XML không s dng trùng thu#t ng biu th cho các công

ngh khác. Chú ý, s h tr pureXML ch- c cung cp khi to ra c s d liu
Unicode.
16.3.1 7u im ca công ngh pureXML trong DB2 9
S dng công ngh pureXML em li nhiu u im sau :

1. Bn có th nâng cao kh nng dùng d liu quan h, bng cách lu tr các tài
liu XML trong các ct ca bng có s dng kiu d liu mi XML.

2. Bn có th gim  phc tp ca mã. Ví d, trong hình 16.5 minh h&a mt on
mã PHP c vit v*a s dng và không s dng pureXML. S dng pureXML
(hp màu xanh) giúp gim các dòng mã lnh. /iu này không ch- có ngh'a là mã
lnh ít phc tp mà hiu nng toàn th c ci thin vì s dòng  phân tích và
bo trì trong mã lnh ít hn.
Nhp môn H qun tr c s d liu DB2

180

Hình 16.5 - * phc tp khi s" dng hay không s" dng pureXML

3. S dng XML và công ngh pureXML thay i lc + (schema) ca bn d0
dàng hn. Hình 16.6 minh h&a mt ví d v s tng tính linh ng. Trong hình,
gi s rng bn ã có c s d liu g+m các bng Employee và Department.
Mc nh là c s d liu không có XML, nu nhà qun lí ca bn yêu cu bn
lu tr không ch- mi nhân viên mt s in thoi (s in thoi nhà) mà còn lu
thêm s th hai (s di ng) thì bn có th thêm mt ct trong bng Employee và
lu s in thoi di ng trong ct mi ó. Tuy nhiên, cách làm này không úng
vi các lu#t chu n hóa trong c s d liu quan h. Nu bn mun gi úng các
lu#t này thì bn to mt bng Phone mi và chuyn toàn b thông tin s in
thoi qua bng này. Bn c.ng có th thêm nhiu s in thoi di ng. To ra
bng Phone mi thì tn chi phí, bi vì không nhng lng d liu ã có cn

c chuyn ln mà còn tt c các câu SQL trong các ng dng s, phi thay i
im n là bng mi.

Thay vào ó, chúng tôi a ra cách thc hin vic này s dng XML  bên trái
hình bên di. Nu nhân viên “Christine” c.ng có mt s in thoi di ng, thì
thêm mt th2 (tag) mi  lu thông tin này. Nu nhân viên “Michael” không có
s in thoi di ng thì  trng.
Nhp môn H qun tr c s d liu DB2

181

Hình 16.6 – T ng s mm d)o khi s" dng XML

4. Bn có th ci thin hiu nng ng dng XML ca mình. Thc hin các kim tra
dùng công ngh pureXML cho thy s ci thin áng k cho nhiu ng dng
XML. Hình 16.7 cho thy các kt qu ánh giá cho vic mt công ty chuyn sang
s dng công ngh pureXML. Ct  gia cho thy kt qu làm vic vi XML
bng phng thc c., và ct th ba là kt qu s dng pureXML trong DB2 9.

Hình 16.7 – S t ng hiu n ng khi s" dng công ngh pureXML
16.3.2 Khái nim c bn v XPath
XPath là mt ngôn ng mà ta có th dùng nó  truy vn các tài liu XML. Hình 16.8 mô
t mt tài liu XML và hình 16.9 c.ng minh h&a tài liu ó c trình bày vi dng "phân
tích phân cp" (c.ng c g&i là nút (node) hay lá (leaf)). Chúng ta s, x dng nh
dng "phân tích phân cp"  gii thích XPath hot ng nh th nào.













Nhp môn H qun tr c s d liu DB2

182

Hình 16.8 - Mt tài liu XML


Hình 16.9 - Trình bày tài liu XML  hình 16.8 theo dng “phân tích phân cp”

Mt cách nhanh chóng  h&c XPath ó là so sánh nó vi câu lnh i th mc (CD)
trong MS-DOS hay trong Linux/UNIX. S dng câu lnh CD bn i qua mt cây th mc
nh sau:

cd /directory1/directory2/

Tng t, trong XPath bn s dng nhng du gch chéo (/)  chuyn t* mt thành
phn này n mt thành phn khác trong tài liu XML. Ví d, bng cách s dng tài liu
trong hình 16.9 vi XPath bn có th ly ra tên ca tt c các nhân viên thông qua câu
truy vn sau:

/dept/employee/name

Các biu thc XPath

Các biu thc XPath s dng ng d%n y   nh ra các thành phn và/hay các
thuc tính. Kí hiu "@" dùng  ch- thuc tính. / ch- ly giá tr (text node) ca mt
thành phn, ta s dng hàm "text()". Bng 16.1 minh h&a mt vài câu truy vn XPath và
kt qu tng ng khi áp dng trên tài liu XML ã cho  hình 16.9


Nhp môn H qun tr c s d liu DB2

183
XPath Kt 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
Bng 16.1 – Các ví d v biu thc XPath

Các kí t i din
Có 2 kí t i din chính trong XPath:
• "*" thay th cho bt kì tên th2 nào
• "//" là kí t i din cho "t* ây tr xung" (descendent-or-self)
Bng 16.2 cho ta thêm vài ví d da trên tài liu XML  hình 16.9

XPath Kt 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>
Bng 16.2 - Các ví d v kí t i din trong XPath

Các v$ t& ca XPath
Các v t* ca XPath c t trong cp du ngoc vuông []. Mt cách tng t, bn có
th ngh' chúng nh là mt thành phn tng ng vi mnh  WHERE trong SQL. Ví
d [@id="902"] có th c hiu là "vi iu kin thuc tính id có giá tr bng 902".
Trong mt biu thc XPath có th có nhiu v t*. / ch- ra mt v t* có v trí, ta s dng
[n] vi ý ngh'a là thành phn con th n s, c ch&n. Ví d employee[2] ngh'a là ngi
công nhân th 2 s, c ch&n. Bng 16.3 s, cho ta nhiu ví d hn:

XPath Kt 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
Bng 16.3 - Các ví d v v$ t& XPath


Nhp môn H qun tr c s d liu DB2

18
4
Trc cha XPath:
Tng t vi MS-DOS hay Linux/UNIX, bn có th dùng mt du chm (.)  nh ra
trong biu thc rng bn tham chiu n v trí hin ti, và hai du chm ( )  tham
chiu n ví trí trên nó mt cp (mc cha).

Bng 16.4 cho ta thêm vài ví d

XPath Kt 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
Bng 16.4 – Trc cha Xpath
16.3.3 *$nh ngh-a XQuery
XQuery là mt ngôn ng truy vn c to ra cho XML. XQuery h tr các biu thc
ng d%n  nh v trí trong cu trúc phân cp XML. Thc t XPath là mt t#p con ca
XQuery, do ó, tt c nhng gì chúng ta ã h&c trc ây v XPath c.ng c áp dng
vi XQuery. XQuery h tr c d liu có kiu và d liu không có kiu. XQuery không
cha giá tr null vì tài liu XML b" i nhng d liu thiu hay không xác nh. XQuery tr
v mt chui các d liu XML.

Mt chú ý quan tr&ng là các biu thc XQuery và XPath phân bit ký t vit hoa và vit
thng.

XQuery h tr biu thc FLWOR (&c nh flower). Trong SQL nó s, tng ng vi biu

thc SELECT-FROM-WHERE. Phn tip theo s, gii thích rõ hn v FLWOR

XQuery: Biu thc FLWOR
FLWOR vit tt cho:
• FOR: lp qua tt c các phn t ca mt dãy các thành phn và gán mt bin
cho các thành phn.
• LET: Gán mt bin vi mt dãy.
• WHERE: loi ra các thành phn trong quá trình lp
• ORDER: sp xp li các thành phn trong khi lp
• RETURN: to ra giá tr tr v cho câu truy vn.
/ây là mt biu thc cho phép ta thao tác vi các tài liu XML, cho phép bn tr v
nhng biu thc khác. Ví d, gi s bn ã có 1 bng vi nh ngh'a nh sau:

CREATE TABLE dept (deptID CHAR(8), deptdoc XML);

Và tài liu XML sau c thêm vào trong các ct ca deptdoc:

<dept bldg=”101”>
<employee id=”901”>
<name>John Doe</name>
Nhp môn H qun tr c s d liu 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 lnh XQuery sau s dng FLWOR có th c thc hin:

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 kt qu sau:

<EmpList bldg=”101”>
<name>
John Doe
</name>
<name>
Peter Pan
</name>
</EmpList>
16.3.4 Chèn các tài liu XML
Vic chèn các tài liu XML vào c s d liu DB2 có th thc hin bng câu lnh
INSERT SQL, hay công c IMPORT. Không th dùng XQuery  chèn tài liu XML khi
nó cha c nh ngh'a trong chu n.


Kim tra tp kch bn sau, nó có th chy trong DB2 Command Window hoc Linux shell
dùng lnh 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 (
Nhp môn H qun tr c s d liu 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)

Lu ý rng tp kch bn này và nhng tp liên quan c cung cp trong tp nén ex-
pressc_book_quicklabs.zip i kèm vi sách. Bên di chúng ta mô t t*ng dòng lnh
trong tp kch bn.

1. Xóa c s d liu “mydb”. Thao tác này thng c thc hin trong các tp
kch bn  làm nhim v d&n d7p. Nu nh trc ó cha có “mydb”, bn s,
nh#n c c mt thông báo li, nhng nó không gây nh hng n vic ta
ang làm.

2. To c s d liu “mydb” s dng b mã UTF-8. Mt c s d liu UNICODE
c òi h"i h tr pureXML, vì v#y bc này là cn thit  to mt c s d
liu thành mt c s d liu UNICODE.

3. Kt ni n c s d liu “mydb” v*a mi c to. Lnh này cn thit  to ra

các i tng trong c s d liu.

4. To bng “items”. / ý thy ct cui cùng trong bng (ct “comments”) c
nh ngh'a nh là mt ct XML s dng kiu d liu XML mi.

5. To bng “clients”. Ct cui trong bng (ct “contact”) c.ng c nh ngh'a vi
kiu d liu XML mi.

6. Dùng lnh SQL INSERT này,  chèn mt tài liu XML vào mt ct XML. Trong
câu lnh INSERT bn truyn tài liu XML vào nh là mt chui bao bi du nháy
n.

7. Dùng lnh IMPORT,  chèn hoc nh#p nhiu tài liu XML cùng vi d liu quan
h vào c s d liu. Lnh 7, bn nh#p d liu t* tp clients.del (mt tp ascii
Nhp môn H qun tr c s d liu DB2

187
c du phân cách), và bn c.ng có th ch- ra ni mà d liu XML c tham
chiu bi tp clients.del ó c nh v (trong ví d này là th mc D:\Raul).

Chúng ta s, tìm hiu k$ hn tp clients.del, nhng trc ht, hãy xem ni dung ca th
mc D:\Raul (Hình 16.10)

Hình 16.10 – Ni dung ca th mc D:\Raul vi các tài liu XML

/ây là ni dung ca tp 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 tp clients.del, “XDS FIL=” c dùng  tr" n mt tp tài liu XML c th. Hình
16.11 cho thy trung tâm iu khin sau khi chy tp kch bn  trên.

Nhp môn H qun tr c s d liu DB2

188

Hình 16.11 – Trung tâm iu khin sau khi thc hin table_creation.txt

Trong hình là ni dung ca bng CLIENTS. Ct cui cùng “Contact” là mt ct XML. Khi
bn nhp vào nút có ba du chm, mt ca s khác m ra cho bn thy ni dung tài liu
XML. Ca s này nm  góc di bên phi ca hình 16.11
16.3.5 Truy vn d liu XML
Trong DB2, có 2 cách  truy vn d liu XML:
• S dng SQL vi các lnh m rng cho XML (SQL/XML)
• S dng XQuery
Trong c 2 cách trên, DB2 u tuân theo chu n XML quc t.

Truy vn d liu XML vi SQL/XML
S dng nhng câu lnh SQL thun túy cho phép bn làm vic vi c dòng và ct. Mt
câu lnh SQL làm vic c vi nguyên c tài liu XML; tuy nhiên nó li không có kh
nng làm vic vi ch- mt phn ca tài liu XML. Trong trng hp này, bn cn s
dng SQL vi các lnh m rng cho XML (SQL/XML).

Bng 16.5 bên di mô t mt s hàm SQL/XML có s)n vi chu n SQL 2006


Tên hàm Mô t
XMLPARSE Tách (phân tích) thuc tính hoc d liu nh phân trong 1 i
tng ln, ly ra giá tr XML
XMLSERIALIZE Chuyn giá tr XML sang thuc tính hoc d liu nh phân
trong 1 i tng ln
XMLVALIDATE /ánh giá giá tr ca XML vi s + XML (XML Schema) và
ghi chú kiu các giá tr ca XML
XMLEXISTS Xác nh (kim tra) câu truy vn XQuery có giá tr tr v không
(ví d mt dãy giá tr hay nhiu hn)

×