Chuẩn bị cho kỳ thi 733 về Phát triển ứng dụng DB2 9, Phần 2: Thao tác dữ
liệu DB2
Tìm hiểu các khái niệm cơ bản
Sunil Sabat, Giám đốc liên minh kỹ thuật, IBM
Tóm tắt: Tìm hiểu về các khái niệm cơ bản của việc thao tác dữ liệu trong cơ sở
dữ liệu DB2®. Đây là Phần 2 trong một loạt bài gồm chín hướng dẫn mà bạn có
thể sử dụng để trợ giúp chuẩn bị cho kỳ thi lấy chứng chỉ Phát triển ứng dụng DB2
9 (kỳ thi 733).
Trước khi bạn bắt đầu
Hướng dẫn này gồm những gì?
Hướng dẫn này trình bày các khái niệm cơ bản về thao tác dữ liệu trong các cơ sở
dữ liệu DB2, bao gồm các chủ đề sau:
Thay đổi dữ liệu (chèn, cập nhật, xóa).
Truy vấn một cơ sở dữ liệu xuyên nhiều bảng hoặc nhiều khung nhìn.
Sử dụng các bảng truy vấn được vật chất hóa (các MQT - materialized
query tables).
Sử dụng các hàm SQL DB2 và các thủ tục được lưu sẵn.
Sử dụng các biểu thức bảng chung.
Xác định khi nào sử dụng các con trỏ (cursor) trong một chương trình SQL.
Nhận biết các kiểu con trỏ (chỉ đọc, có thể cập nhật được, có thể cuộn
được).
Nhận biết các phạm vi của các con trỏ.
Thao tác các con trỏ.
Khả năng thao tác các đối tượng lớn (LOBs) (như CLOB [Character Large
Objects - các đối tượng lớn ký tự] và BLOB [Binary Large Object - các đối tượng
lớn nhị phân]).
Quản lý một đơn vị công việc (ví dụ, một giao dịch)
Đây là hướng dẫn thứ hai trong một loạt bài viết gồm bảy hướng dẫn mà bạn có
thể sử dụng để trợ giúp chuẩn bị cho kỳ thi lấy chứng chỉ Phát triển ứng dụng của
họ DB2 9.1 của IBM (kỳ thi 733). Các tài liệu trong hướng dẫn này chủ yếu trình
bày các mục tiêu trong Phần 2 của bài thi, mang tên "Thao tác dữ liệu".
Các giao diện để truy cập dữ liệu (Bạn giao tiếp với dữ liệu thay đổi như
thế nào?).
Bạn nên sử dụng các khả năng DB2 nào trong việc thiết kế một ứng dụng? Người
sử dụng không thể sửa đổi dữ liệu danh mục hệ thống. Các bảng danh mục và các
khung nhìn lưu trữ siêu dữ liệu về định nghĩa vật lý và logic của dữ liệu. Lược đồ
SYSIBM sở hữu các bảng, trong khi các khung nhìn với các bảng này thuộc sở
hữu của lược đồ SYSCAT. Bạn có thể truy vấn danh mục để nhận được các thông
tin có ích. Để thực hiện các sự lựa chọn thích hợp, bạn cần phải xem xét cả hai,
thiết kế cơ sở dữ liệu và các môi trường đích cho các ứng dụng của bạn. Ví dụ, bạn
có thể chọn để áp đặt một số các quy tắc nghiệp vụ trong việc thiết kế cơ sở dữ
liệu của bạn thay cho việc đưa vào trong logic ứng dụng của bạn.
Các khả năng mà bạn sử dụng và phạm vi mà bạn sử dụng chúng có thể biến đổi
rất nhiều. Các khả năng mà bạn cần phải xem xét bao gồm:
Truy cập dữ liệu bằng cách sử dụng:
o SQL nhúng, bao gồm cả SQL nhúng cho Java (SQLJ).
o DB2 CLI (DB2 Call Level Interface - Giao diện mức lời gọi của
DB2), ODBC (Open Database Connectivity – Kết nối cơ sở dữ liệu mở) và JDBC.
o Các đặc tả kỹ thuật của Microsoft.
o DBI Perl.
o Các sản phẩm truy vấn.
Kiểm soát các giá trị dữ liệu bằng cách sử dụng:
o Các kiểu dữ liệu (làm sẵn hoặc do người dùng định nghĩa).
o Các ràng buộc kiểm tra bảng.
o Các ràng buộc toàn vẹn tham chiếu.
o Các khung nhìn có sử dụng CHECK OPTION (tùy chọn kiểm tra).
o Logic ứng dụng và các kiểu biến.
Kiểm soát mối quan hệ giữa các giá trị dữ liệu bằng cách sử dụng:
o Các ràng buộc toàn vẹn tham chiếu.
o Các bộ bẫy sự kiện (Trigger).
o Logic ứng dụng.
vào ứng dụng của bạn như thế nào. Bạn có thể chọn trong số các giao diện và các
ngôn ngữ được hỗ trợ sau đây:
SQL nhúng
C/C++
COBOL
FORTRAN
Ngôn ngữ Java® (thông qua SQLJ hoặc JDBC)
REXX
DB2 CLI và ODBC
Các đặc tả kỹ thuật của Microsoft, bao gồm cả ADO.NET và OLE DB
Các ngôn ngữ Visual Basic, Visual C++ và .NET
Perl DBI
Perl
PHP
Các sản phẩm truy vấn như Lotus Approach (Cách tiếp cận Lotus), IBM
Query Management Facility (Tiện ích quản lý truy vấn của IBM), Microsoft
Access hoặc Microsoft Excel
Chương trình của bạn phải thiết lập một kết nối tới máy chủ cơ sở dữ liệu đích
trước khi nó có thể chạy bất kỳ các câu lệnh SQL thực thi nào. Kết nối này nhận
biết cả mã nhận dạng (ID) quyền hạn của người sử dụng đang chạy chương trình
và cả tên của máy chủ cơ sở dữ liệu mà chương trình được chạy trên đó. Nói
chung, tiến trình của ứng dụng của bạn chỉ có thể kết nối với một máy chủ cơ sở
dữ liệu ở một thời điểm. Máy chủ này được gọi là máy chủ hiện tại. Tuy nhiên,
ứng dụng của bạn có thể kết nối đến nhiều máy chủ cơ sở dữ liệu trong một môi
trường cập nhật nhiều máy chủ. Trong trường hợp này, chỉ có một máy chủ có thể
là máy chủ hiện tại.
Chương trình của bạn có thể thiết lập một kết nối tới một máy chủ cơ sở dữ liệu
hoặc tường minh bằng cách sử dụng một câu lệnh kết nối, hoặc không tường minh,
bằng cách kết nối với máy chủ cơ sở dữ liệu mặc định. Các ứng dụng Java cũng có
thể thiết lập một kết nối thông qua một cá thể kết nối (Connection).
Làm việc với các bảng truy vấn được vật chất hóa (MQT)
Định nghĩa của một MQT là dựa trên kết quả của một truy vấn. Các MQT có thể
cải thiện đáng kể hiệu năng của các truy vấn. Hướng dẫn này giới thiệu cho bạn về
các MQT, các bảng tóm tắt và các bảng dựng tạm và chỉ ra cho bạn, qua các ví dụ
làm việc, làm thế nào để xây dựng và chạy với các bảng truy vấn được vật chất
hóa.
Một MQT là một bảng mà định nghĩa của nó dựa trên kết quả của một truy vấn.
Dữ liệu được chứa trong một MQT là bắt nguồn từ một hoặc nhiều bảng được nêu
trong định nghĩa MQT. Các bảng tóm tắt (hoặc các bảng tóm tắt tự động [ASTs]),
đã quen thuộc với những người sử dụng DB2 IBM cho Linux, UNIX và Windows,
được coi là một kiểu MQT chuyên biệt. Câu lệnh fullselect, một phần của định
nghĩa một bảng tóm tắt, chứa một mệnh đề GROUP BY tóm tắt dữ liệu từ các
bảng được tham chiếu trong fullselect.
Bạn có thể coi một MQT như là một loại khung nhìn được vật chất hóa. Cả các
khung nhìn lẫn các MQT được định nghĩa trên cơ sở một truy vấn. Truy vấn trên
đó một khung nhìn được định nghĩa sẽ chạy bất cứ khi nào khung nhìn được tham
chiếu. Tuy nhiên, một MQT thực tế lưu trữ các kết quả truy vấn như là dữ liệu và
bạn có thể làm việc với các dữ liệu có trong MQT thay cho dữ liệu có trong các
bảng bên dưới. Các MQT có thể cải thiện đáng kể hiệu năng của các truy vấn, đặc
biệt là các truy vấn phức tạp. Nếu trình tối ưu hóa xác định rằng một truy vấn hay
một phần của một truy vấn có thể được giải quyết bằng cách sử dụng một MQT,
truy vấn có thể được viết lại để tận dụng lợi ích của MQT. Vào lúc tạo bảng, một
MQT có thể được định nghĩa là được duy trì bởi hệ thống hay là được duy trì bởi
người sử dụng.
Dữ liệu trong kiểu bảng truy vấn được vật chất hóa này được duy trì bởi hệ thống.
Khi bạn tạo ra kiểu MQT này, bạn có thể xác định xem dữ liệu của bảng là
REFRESH IMMEDIATE hay REFRESH DEFERRED. Từ khóa REFRESH (làm
mới) cho phép bạn chỉ rõ dữ liệu sẽ được duy trì như thế nào. DEFERRED có
nghĩa là dữ liệu trong bảng có thể được làm mới vào bất kỳ lúc nào khi sử dụng
DATA INITIALLY DEFERRED REFRESH IMMEDIATE
SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL Các hàm và các biểu thức
Các hàm SQL DB2 là gì?
Một hàm cơ sở dữ liệu là một mối quan hệ giữa một tập hợp các giá trị dữ liệu đầu
vào và một tập hợp các giá trị kết quả. Có hai loại hàm: được cài đặt sẵn và do
người sử dụng định nghĩa.
Hàm SQL được cài đặt sẵn được cung cấp cùng với trình quản lý
(manager) cơ sở dữ liệu. Chúng cung cấp một giá trị kết quả đơn lẻ và được nhận
biết như là một phần của lược đồ SYSIBM. Ví dụ về hàm SQL được cài đặt sẵn
bao gồm các hàm cột như AVG, các hàm toán tử như +, các hàm tạo khuôn mẫu
như DECIMAL và các hàm khác, chẳng hạn như SUBSTR.
Các hàm do người sử dụng định nghĩa (UDFs) là các hàm được đăng ký
vào một cơ sở dữ liệu trong SYSCAT.FUNCTIONS (khi sử dụng câu lệnh
CREATE FUNCTION). Các UDF không bao giờ là một phần của lược đồ
SYSIBM. Một tập hợp các hàm như vậy được cung cấp cùng với trình quản lý cơ
sở dữ liệu trong một lược đồ có tên là SYSFUN.
DB2 cho phép những người dùng và các nhà phát triển ứng dụng mở rộng các
chức năng của hệ thống cơ sở dữ liệu bằng cách áp dụng các định nghĩa hàm riêng
của họ trong chính máy cơ sở dữ liệu. Các ứng dụng dựa trên các UDF thực hiện
tốt hơn các ứng dụng có lấy ra các hàng từ cơ sở dữ liệu và áp dụng các hàm đó
trên dữ liệu được lấy ra. Việc mở rộng các hàm cơ sở dữ liệu cũng cho phép cơ sở
dữ liệu lợi dụng cùng các hàm trong máy mà một ứng dụng sử dụng, cung cấp
thêm sự hiệp lực giữa ứng dụng và cơ sở dữ liệu. Việc sử dụng các hàm góp phần
vào nâng cao năng suất cho các nhà phát triển ứng dụng vì nó có tính hướng đối
tượng hơn. Ví dụ, bạn có thể lưu trữ giá cho một sản phẩm bằng đô la Mỹ, nhưng
bạn có thể muốn có một ứng dụng cụ thể trích dẫn giá cả theo Bảng Anh. Bạn có
Bây giờ hãy xem làm thế nào để bạn có thể trả về năm ký tự ở tận cùng bên phải
của tên của mỗi tác giả:
SELECT RIGHT(AU_FNAME, 5)
FROM AUTHORS
Ví dụ tiếp theo này, khi sử dụng bảng project, thiết lập biến chủ AVERAGE
(decimal(5,2)) là mức trung bình của số nhân viên (PRSTAFF) của các dự án
trong phòng ban (DEPTNO) tên là D11.
SELECT AVG(PRSTAFF)
INTO :AVERAGE
FROM PROJECT
WHERE DEPTNO = 'D11'
Có rất nhiều các hàm SQL khác được định nghĩa trong sổ tay tham khảo SQL
DB2. Bạn luôn có thể viết hàm SQL riêng của bạn nếu DB2 không cung cấp một
hàm như thế. Sử dụng các biểu thức bảng chung
Một biểu thức bảng chung là một bảng tạm thời tại chỗ có thể được tham chiếu
nhiều lần trong một câu lệnh SQL. Bảng tạm thời này chỉ tồn tại trong khoảng thời
gian của câu lệnh SQL định nghĩa nó. Mỗi lần bảng chung được tham chiếu, các
kết quả là như nhau. Một bảng tạm thời được định nghĩa trong một câu lệnh SQL
sử dụng mệnh đề WITH. Đây là cú pháp:
WITH <COMMON NAME1> AS ( <SELECT EXPRESSION>), <COMMON
NAME2>
AS (<SELECT EXPRESSION), & SELECT <COLUMN> FROM
<TABLE_NAME> <WHERE_CLAUSE>
<table_name> hoặc là một bảng trong cơ sở dữ liệu hoặc là một <Common name>
FROM PAYLEVEL
GROUP BY EDLEVEL, HIREYEAR)
SELECT EMPNO, EDLEVEL, YEAR_OF_HIRE, TOTAL_PAY,
DECIMAL(AVG_TOTAL_PAY,7,2)
FROM PAYLEVEL, PAYBYED
WHERE EDLEVEL = EDUC_LEVEL
AND HIREYEAR= YEAR_OF_HIRE
AND TOTAL_PAY < AVG_TOTAL_PAY
Biểu thức bảng chung này cũng bao gồm PAYLEVEL. Bảng kết quả này bao gồm
một số hiệu nhân viên, năm mà người đó đã được thuê, tổng số tiền lương phải trả
cho nhân viên đó và trình độ học vấn của anh ta hay chị ta. Chỉ có các hàng dành
cho các nhân viên có một trình độ học vấn cao hơn 16 được đưa vào kết quả.
Danh sách cũng bao gồm một biểu thức bảng chung có tên là PAYBYED (viết tắt
của "-tiền lương theo trình độ học vấn"). Nó sử dụng bảng PAYLEVEL để xác
định trình độ học vấn, năm thuê và tiền lương trung bình trung bình của nhân viên
được thuê trong cùng một năm và có trình độ học vấn như nhau. Các cột được
bảng này trả về đã được gán các tên khác (ví dụ EDUC_LEVEL) với các tên cột
được sử dụng trong danh sách chọn.
Cuối cùng, bạn đi tới truy vấn thật sự để tạo ra kết quả mong muốn. Hai bảng
(PAYLEVEL, PAYBYED) được nối để xác định những cá nhân có một mức
lương thấp hơn tiền lương trung bình phải trả cho những người được thuê trong
cùng một năm. Lưu ý rằng PAYBYED được dựa trên PAYLEVEL, do đó
PAYLEVEL được truy vấn hai lần một cách hiệu quả trong câu lệnh đầy đủ. Cả
hai lần cùng một tập hợp các hàng như nhau được sử dụng trong việc tính toán
truy vấn.
Sau khi bạn định nghĩa một biểu thức bảng chung, bạn có thể sử dụng nó trong
một câu lệnh SQL như bạn làm đối với bất kỳ bảng nào khác. Bạn có thể sử dụng
một biểu thức bảng chung nhiều lần như bạn muốn. Bạn thậm chí có thể tạo ra một
Sự hỗ trợ và thuật ngữ con trỏ thay đổi giữa các giao diện lập trình DB2 khác
nhau. Bây giờ hãy xem xét nhanh các sự khác biệt đó. Sau đó, trong phần thao tác
các con trỏ, bạn sẽ xem một số ví dụ cho SQL nhúng.
Chính ngôn ngữ SQL cung cấp sự hỗ trợ cơ bản cho các con trỏ, thông qua các câu
lệnh DECLARE CURSOR, OPEN, FETCH và CLOSE.
Bạn có thể thực hiện các cập nhật và xoá định vị con trỏ thông qua cú pháp sau
đây:
UPDATE [OR DELETE] WHERE CURRENT OF <CURSOR NAME>
Các giao diện khác nhau xây dựng hỗ trợ con trỏ của SQL bằng nhiều cách khác
nhau. Các ngôn ngữ lập trình truyền thống, ví dụ như: C, C++ và COBOL, cung
cấp sự hỗ trợ tường minh cho việc khai báo và sử dụng con trỏ trong SQL nhúng
tĩnh và nhúng động . Các hàng chỉ có thể được xử lý từng hàng một, theo hướng
thuận.
Ngôn ngữ thủ tục SQL hỗ trợ các con trỏ giống như ngôn ngữ C đã làm, nhưng
với mệnh đề WITH RETURN được bổ sung thêm để hỗ trợ trả về một tập kết quả
cho bên gọi thủ tục được lưu sẵn.
Trong CLI DB2, các con trỏ không được khai báo tường minh, nhưng CLI tự động
tạo ra chúng khi các hàm SQLExecute() hoặc SQLExecDirect() được gọi. CLI
cung cấp các khả năng bổ sung thêm, xây dựng dựa trên sự hỗ trợ của con trỏ, ví
dụ như khả năng phục hồi lại, để nhận được một mảng các hàng cùng một lúc và
để di chuyển theo hướng tiến nhiều hơn một hàng.
Trong JDBC, một con trỏ được tạo ra tự động khi một đối tượng ResultSet được
tạo ra. Khả năng bổ sung thêm có sẵn cũng giống như khả năng của CLI.
Sự hỗ trợ con trỏ của SQLJ về cơ bản là một sự pha trộn những gì có trong JDBC
và SQL, nhưng trong SQLJ cái tương đương với con trỏ được gọi là con lặp
(iterator).
Các công cụ tương tác, chẳng hạn như Trình xử lý dòng lệnh và Trung tâm điều
khiển DB2 (DB2 Command Line Processor (CLP) and Control Center), không cho
phép bạn sử dụng trực tiếp các con trỏ. Tuy nhiên, bản thân các công cụ ấy thì có
Nhận biết các kiểu con trỏ
Các đặc điểm của con trỏ
Có ba đặc điểm chính của các con trỏ:
Kiểu con trỏ: Chỉ đọc, cập nhật được, hoặc mơ hồ.
(Các) hướng con trỏ: Chỉ hướng thuận, hoặc cuộn được.
Phạm vi con trỏ.
Các đặc điểm này sẽ được thảo luận trong một số phần tiếp theo.
Kiểu con trỏ
DB2 xử lý mỗi kiểu trong ba kiểu con trỏ hơi khác nhau một chút, các sự khác biệt
chủ yếu trong lĩnh vực hiệu năng. Hãy xem xét từng kiểu.
Các con trỏ chỉ đọc
Khi DB2 biết rằng một con trỏ là chỉ đọc, một số lợi thế về hiệu năng nhất định có
thể được áp dụng:
DB2 thường thực hiện việc chặn (blocking) bản ghi để lấy ra nhiều hàng từ
máy chủ cùng một lúc và không cần phải lo lắng để lấy được các khóa cho phép
các hàng có thể được cập nhật.
DB2 đôi khi có thể chọn một kế hoạch truy cập tốt hơn cho truy vấn.
Nếu bạn biết rằng một con trỏ sẽ không được sử dụng để cập nhật hoặc xóa các
hàng, bạn nên chỉ rõ nó như là con trỏ chỉ đọc bằng cách thêm FOR READ ONLY
(hoặc FOR FETCH ONLY) vào câu lệnh SELECT dành cho con trỏ. Một con trỏ
cũng được (tự động) xếp vào loại chỉ đọc nếu câu lệnh SELECT của nó là một
phép nối (join) nhiều bảng hoặc có chứa các mệnh đề như ORDER BY hoặc
GROUP BY.
Các con trỏ cập nhật được
Một con trỏ là cập nhật được nếu mệnh đề FOR UPDATE được chỉ rõ trong câu
lệnh SELECT của nó, có nghĩa là các hàng được cập nhật thông qua một câu lệnh
Update Where Current Of. Chỉ có thể có một bảng (hoặc chỉ một khung nhìn)
được tham chiếu trong câu lệnh SELECT đó. Do nó phải duy trì tính toàn vẹn dữ
liệu, nên DB2 chỉ có thể thực hiện rất ít việc tối ưu hóa cho các con trỏ cập nhật
được.