Chuẩn bị cho Kỳ thi về Phát triển ứng dụng DB2 9, Phần 1: Các đối tượng cơ
sở dữ liệu và các phương pháp lập trình
Xây dựng nền tảng với những kiến thức cơ sở
Clara Liu, Lập kế hoạch sản phẩm DB2, IBM Toronto Laboratory
Tóm tắt: Bạn sẽ được giới thiệu về các kiểu đối tượng cơ sở dữ liệu và các
phương pháp lập trình khác nhau. Đây là hướng dẫn đầu tiên trong một loạt bài
gồm chín hướng dẫn, sử dụng loạt bài này để 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 của IBM® (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 giới thiệu về các kiểu đối tượng cơ sở dữ liệu và các phương pháp
lập trình khác nhau. Trong hướng dẫn này, bạn tìm hiểu về:
Các kiểu đối tượng cơ sở dữ liệu khác nhau.
Mối quan hệ giữa các lược đồ (schema) và các đối tượng cơ sở dữ liệu.
Các khái niệm cơ bản về các thường trình (routine) SQL.
Cơ sở về giao diện lập trình: SQL nhúng động và tĩnh, CLI và ODBC,
.NET, JDBC và SQLJ, PHP, Perl, Python và XML.
Các lý do bảo đảm an ninh kết hợp với truy cập dữ liệu từ một ứng dụng.
Đây là hướng dẫn đầu tiên trong một loạt bài viết 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 của
Họ DB2 9 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 1 của kỳ thi, mang tên "Các đối tượng cơ sở dữ liệu
và các phương pháp lập trình" (Database objects and programming methods).
Bạn không cần một bản sao của DB2 9 để hoàn thành hướng dẫn này. Tuy nhiên,
nếu bạn muốn, bạn có thể tải về miễn phí bản sao của DB2 Express-C 9 từ trang
tải về DB2 Express-C. Ai nên tìm hiểu hướng dẫn này?
Để tham dự kỳ thi “Phát triển ứng dụng họ DB2 9”, bạn đã phải vượt qua được kỳ
thi “Căn bản về họ DB2 9” (kỳ thi 730). Bạn có thể sử dụng "Loạt bài hướng dẫn
(Working with DB2 objects) (developerWorks, 07.2006) về các thông tin nền.
Ngoài các các đối tượng cơ sở dữ liệu được giới thiệu trong các hướng dẫn căn
bản về họ DB2, có nhiều đối tượng khác mà nhiều nhà phát triển thấy là có ích khi
phát triển các ứng dụng DB2. Hướng dẫn này giới thiệu các đối tượng ấy trong
phần này.
Một lưu ý trước khi bạn tiến hành: Trong các ví dụ mà bạn sẽ thấy ở đây, các tên
đối tượng được chỉ rõ bằng chữ thường. Bất kể nền tảng DB2 đang chạy là gì, nó
sẽ luôn luôn lưu giữ các tên bằng chữ hoa, trừ khi tên của một mã nhận dạng
(identifier) được bao quanh bởi cặp dấu nháy kép ("").
Ví dụ, câu lệnh sau tạo ra một bảng gọi là employee (nhân viên - chữ thường) với
các định nghĩa của cột giống như bảng EMPLOYEE (chữ hoa).
CREATE TABLE "employee" LIKE employee
Các biệt danh
Một biệt danh (alias) là một tên thay thế cho một bảng, một khung nhìn hoặc biệt
hiệu hiện có. Một biệt danh cũng có thể dùng như là một tên thay thế cho một biệt
danh khác. Giống như các đối tượng, một biệt danh có thể được tạo ra hoặc bị hủy
bỏ và nó có thể có các lời chú thích có liên quan với nó. Dưới đây là một vài ví dụ
về các câu lệnh CREATE ALIAS:
CREATE ALIAS aliastab1 FOR tab1;
CREATE ALIAS bob.aliastab1 FOR tom.tab1;
CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1; Như bạn có thể thấy, câu lệnh CREATE ALIAS khá đơn giản. Bạn có thể tạo một
biệt danh trong cùng một lược đồ như là đối tượng nguồn (giống như trong dòng
đầu tiên) hoặc tạo tên biệt danh phân biệt đầy đủ (giống như trong dòng thứ hai).
Việc sử dụng từ khóa SYNONYM thay cho ALIAS (giống như trong dòng thứ ba)
CREATE SEQUENCE myseq AS INTEGER
START WITH 360
INCREMENT BY 10
NO MAXVALUE
CYCLE
CACHE 20
Bất kỳ một kiểu dữ liệu số chính xác nào không có phần lẻ (scale of zero) đều có
thể được sử dụng cho giá trị chuỗi. Chúng gồm có SMALLINT, INTEGER,
BIGINT hoặc DECIMAL. Bất kỳ một kiểu khác biệt nào do người sử dụng định
nghĩa dựa trên các kiểu dữ liệu này cũng có thể được sử dụng cho các giá trị chuỗi.
Điều này mở rộng thêm nữa việc sử dụng các kiểu khác biệt do người dùng định
nghĩa trong một ứng dụng.
Như được hiển thị trong Liệt kê 1 ở trên, bạn có thể tùy chỉnh một đối tượng chuỗi
bằng cách chỉ rõ giá trị bắt đầu của nó. Trong ví dụ này, giá trị đầu tiên cho chuỗi
này là 360. Việc tạo ra các giá trị trong chuỗi được kiểm soát bởi mệnh đề
INCREMENT BY. Các hằng số dương và âm được hỗ trợ để tạo ra các giá trị
chuỗi tăng lên và giảm xuống.
Theo mặc định, các giá trị nhỏ nhất và lớn nhất do một chuỗi tạo ra bị ràng buộc
bởi sự giới hạn của kiểu dữ liệu chuỗi. Ví dụ, một giá trị chuỗi INTEGER (số
nguyên) phải nằm trong khoảng từ -2.147.483.647 đến 2.147.483.647. Bạn có thể
tìm thấy các giới hạn của tất cả các kiểu dữ liệu số trong Hướng dẫn tham khảo
SQL DB2 (xem Tài nguyên). Để thay đổi hành vi này, hãy sử dụng các tùy chọn
MINVALUE (giá trị nhỏ nhất) và MAXVALUE (giá trị lớn nhất) để thiết lập một
ranh giới cho các giá trị được tạo ra. Nếu các giá trị nhỏ nhất hoặc lớn nhất đã đạt
tới, một tùy chọn khác, được gọi là CYCLE hay NO CYCLE, (theo chu kỳ hay
không theo chu kỳ), có thể được sử dụng để chỉ rõ xem liệu các giá trị chuỗi có
nên được tái sử dụng lại hay không. Lưu ý rằng khi CYCLE có hiệu lực, các giá trị
sao đúp có thể được tạo ra cho chuỗi.
Tùy chọn bộ nhớ đệm (CACHE) cho phép DB2 duy trì một số các giá trị đã được
Nếu bạn muốn thay đổi các thuộc tính của một đối tượng chuỗi, thì bạn cần có đặc
quyền ALTER trên đối tượng đó:
GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name
Hãy xem hướng dẫn thi chứng chỉ DBA DB2 có tên là "Quản lý máy chủ" để tìm
hiểu thêm về an ninh DB2.
Hai biểu thức được cung cấp để tạo ra và lấy ra các giá trị chuỗi. Biểu thức NEXT
VALUE FOR seq-name được sử dụng để nhận được giá trị chuỗi tiếp theo, trong
khi biểu thức PREVIOUS VALUE FOR seq-name được sử dụng để lấy ra giá trị
chuỗi cuối cùng đã được tạo ra. Các ví dụ trong Liệt kê 2 dưới đây minh họa việc
sử dụng các biểu thức này.
Liệt kê 2. Các biểu thức NEXT VALUE FOR và PREVIOUS VALUE FOR
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar
Giả sử rằng bạn bắt đầu với một bảng t1 trống rỗng và giá trị chuỗi tiếp theo của
myseq là 1. Sau khi các câu lệnh ở trên được thi hành, với tùy chọn autocommit
(tự động cam kết) bị tắt, t1 chứa các hàng sau đây:
1 NAME
1 BOB
2 PAT
4 PAUL
tồn tại để lưu trữ định nghĩa và nội dung của bảng tạm thời. (Một vùng bảng tạm
thời USER là khác với một vùng bảng tạm thời SYSTEM, cái sau chỉ được DB2
sử dụng một cách nội bộ để thực hiện các hoạt động, ví dụ như sắp xếp thứ tự).
Câu lệnh đơn giản dưới đây tạo ra một vùng bảng tạm thời USER:
CREATE USER TEMPORARY TABLESPACE usertempspace
MANAGED BY SYSTEM USING ('usertempspace')
Một số các mệnh đề tùy chọn được hỗ trợ khi khai báo một bảng tạm thời toàn
cầu. Các ví dụ trong Liệt kê 3 minh họa hoạt động của chúng:
Liệt kê 3. Các mệnh đề tùy chọn được hỗ trợ với bảng tạm thời toàn cầu
DECLARE GLOBAL TEMPORARY TABLE t_dept
( deptid CHAR(6), deptname CHAR(20) )
ON COMMIT PRESERVE ROWS
NOT LOGGED ON ROLLBACK DELETE ROWS
IN usertempspace
Trong ví dụ trong Liệt kê 3, bảng tạm thời t_dept được khai báo có hai cột. Mệnh
đề ON COMMIT PRESERVE ROWS cho biết khi một hoạt động COMMIT được
thực hiện, các hàng trong bảng tạm thời sẽ được duy trì.
Ví dụ trên chỉ rõ rằng những thay đổi với bảng không được ghi nhật ký lại (NOT
LOGGED). Điều này có nghĩa là bất cứ các hoạt động chèn, cập nhật hoặc xóa đối
với bảng không được ghi lại. Tuy nhiên, việc tạo ra và loại bỏ bảng được ghi lại.
Nếu bảng được tạo ra trong một đơn vị làm việc và sau đó cuộn ngược lại, thì
bảng tạm thời sẽ bị loại bỏ. Mặt khác, nếu bảng bị loại bỏ trong một đơn vị làm
việc, thì bảng đó sẽ được phục hồi lại mà không có bất kỳ hàng nào.
Bạn không cần phải sử dụng mệnh đề IN để chỉ rõ vùng bảng tạm thời của người
sử dụng mà bảng tạm thời này sẽ sử dụng vùng bảng đó. Nếu bạn không định rõ
thông tin này, DB2 sẽ tìm kiếm một vùng bảng phù hợp nhất. Nếu không tìm thấy
một vùng bảng tạm thời của người sử dụng, DB2 sẽ đưa ra một lỗi.
Các lược đồ và các đối tượng cơ sở dữ liệu
Hầu hết các các đối tượng cơ sở dữ liệu được xác định bởi một lược đồ và một tên
đối tượng. Một lược đồ cơ sở dữ liệu cung cấp một phân loại logic các đối tượng
cơ sở dữ liệu. Dưới đây là một số ví dụ về các tên đối tượng có hai phần:
DB2ADMIN.EMPLOYEE
HRPROD.AUDIT_VIEW
HRPROD.AUDIT_TRIG
Nếu một lược đồ không được chỉ rõ khi truy cập vào một đối tượng cơ sở dữ liệu,
mã nhận dạng người dùng được sử dụng để thiết lập kết nối cơ sở dữ liệu sẽ được
thiết lập như là lược đồ mặc định. Ví dụ, nếu người sử dụng db2admin kết nối vào
một cơ sở dữ liệu và tạo ra một bảng T1, DB2 sẽ tạo ra một bảng gọi là
db2admin.T1. Tất cả các câu lệnh SQL tiếp sau có tham khảo một bảng T1 có tên
không phân biệt đủ, được phân giải đến db2admin.T1. Sổ đăng ký đặc biệt của DB2: CURRENT SCHEMA
Như bạn có thể đã phát hiện ra trong hoạt động cơ sở dữ liệu của bạn, không phải
lúc nào cũng khả thi để kết nối đến một cơ sở dữ liệu với mã nhận dạng (ID) của
người sử dụng mà tên người dùng (username) của nó cũng là lược đồ của các đối
tượng mà bạn muốn thao tác. Việc mã hóa cứng (hard-coding) một ứng dụng dùng
các tên phân biệt đầy đủ của các đối tượng cũng không phải là giải pháp tốt nhất.
May mắn thay, DB2 cho phép bạn thay đổi lược đồ hiện tại bằng cách sử dụng
lệnh SET CURRENT SCHEMA. Theo mặc định, sổ đăng ký đặc biệt CURRENT
SCHEMA DB2 được thiết lập theo USER được kết nối vào cơ sở dữ liệu. Khi bạn
thay đổi CURRENT SCHEMA, bất kỳ các đối tượng cơ sở dữ liệu có tên không
phân biệt đầy đủ nào được gắn tiếp đầu ngữ với giá trị mới.
Lược đồ hiện tại có thể nhận được bằng lệnh này:
Các triển khai thực hiện thường trình khác nhau
Một số cách triển khai thực hiện các thường trình có khả năng là:
Các thường trình gắn kèm (built-in) đi cùng với hệ thống DB2. Chúng
được định nghĩa trong các lược đồ hệ thống như SYSIBM, SYSPROC, SYSFUN
và SYSTOOLS.
Các thường trình có nguồn gốc (sourced) chỉ áp dụng cho các hàm. Một
hàm có nguồn gốc sao chép chính xác các ngữ nghĩa của hàm khác.
Các thường trình bên ngoài (external) được triển khai thực hiện trong một
ngôn ngữ lập trình bên ngoài. Bạn có thể phát triển các thường trình trong các
ngôn ngữ được hỗ trợ sau:
o Ngôn ngữ Java™.
o C/C++.
o .NET.
o OLE (chỉ với các thủ tục được lưu sẵn).
o OLE DB (chỉ với các hàm bảng).
Các thường trình SQL Các thường trình SQL được triển khai thực hiện
trong SQL Procedural Language (SQL PL - Ngôn ngữ thủ tục SQL). SQL PL DB2
là một tập con của chuẩn ngôn ngữ SQL Persistent Stored Modules (SQL/PSM -
Các mô đun SQL được lưu trữ lâu dài). Tiêu chuẩn này là cơ sở cho các ngôn ngữ
lập trình có cấu trúc được sử dụng với SQL để viết các thủ tục được lưu sẵn, các
hàm và các phương thức. Nó kết hợp việc dễ dàng truy cập dữ liệu của SQL với
cấu trúc kiểm soát luồng của một ngôn ngữ lập trình đơn giản. Đây là lý do chính
tại sao SQL PL lại phổ biến đến vậy. Các thủ tục được lưu sẵn, các hàm và các phương thức
Các thủ tục được lưu sẵn (Stored procedures) là các đối tượng cơ sở dữ liệu có
chứa các chương trình chuyên dụng để truy cập và sửa đổi dữ liệu trong một hoặc
nhiều bảng. Trong một thủ tục được lưu sẵn, bạn có thể bao bọc nhiều câu lệnh
VALUES CURRENT PATH
Đường dẫn mặc định chứa ba lược đồ hệ thống, tiếp theo sau là người sử dụng
hiện tại được kết nối vào cơ sở dữ liệu. Ví dụ:
"SYSIBM","SYSFUN","SYSPROC","DB2ADMIN"
Dưới đây là một vài ví dụ về các thủ thuật mà bạn có thể sử dụng để cập nhật
PATH:
Liệt kê 5. Cập nhật PATH: Ví dụ 1
SET PATH=CURRENT PATH,"USER2"
VALUES CURRENT PATH
"SYSIBM","SYSFUN","SYSPROC","DB2ADMIN","USER2"
1 record(s) selected. Liệt kê 6. Cập nhật PATH: Ví dụ 2
SET PATH=SYSTEM PATH,"USER2"
VALUES CURRENT PATH
"SYSIBM","SYSFUN","SYSPROC","USER2"
1 record(s) selected. Liệt kê 7. Cập nhật PATH: Ví dụ 3
SET PATH="USER1","USER2","USER3"
VALUES CURRENT PATH
"USER1","USER2","USER3"
#sql [myConnCtx] {SELECT lastname, empid INTO :hostvar1, :hostvar2
FROM employee WHERE deptno="OPERATIONS"};
Để đem lại cho bạn một ý tưởng tốt hơn về một chương trình SQL nhúng trông
như thế nào, Liệt kê 8 chứa một đoạn mã chương trình như vậy được viết bằng
ngôn ngữ C. Trong hướng dẫn thứ tư trong loạt này (xem Tài nguyên), bạn sẽ tìm
hiểu thêm về việc biên dịch trước chương trình và phát triển mã thực tế.
Liệt kê 8. Đoạn mã của chương trình SQL nhúng được viết bằng ngôn ngữ C
int TbBasic(void)
{
int rc = 0;
struct sqlca sqlca;
EXEC SQL BEGIN DECLARE SECTION;
char hostVarStmt[50];
EXEC SQL END DECLARE SECTION;
/* declare cursor */
EXEC SQL DECLARE c1 CURSOR FOR
SELECT deptnumb, deptname FROM org WHERE deptnumb = 40;
/* open cursor */
EXEC SQL OPEN c1;
/* fetch cursor */
EXEC SQL FETCH c1 INTO :deptnumb, :deptname;
while (sqlca.sqlcode != 100)
{