Mã đối với các hàm trong được lưu trữ trong các bảng danh mục catalog cơ sở dữ liệu, trong khi các hàm ngoài chỉ là các tham chiếu đến nơi trong hệ thống tệp, mà các mã của ngôn ngữ lập
Trang 1Chuẩn bị cho kỳ thi 733 về Phát triển ứng dụng DB2 9, Phần 9: Các thường
trình do người dùng định nghĩa
Tích hợp logic nghiệp vụ phức tạp và có tùy biến vào các câu lệnh SQL của bạn
Ted J Wasserman, Tư vấn CSDL, IBM
Tóm tắt: Tìm hiểu cách tạo và sử dụng các thường trình do người dùng định
nghĩa trong DB2® 9 của IBM® Đây là hướng dẫn cuối cùng 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 cấp chứng chỉ Phát triển ứng dụng DB2 9 (kỳ thi 733)
Trước khi bạn bắt đầu
Về loạt bài này
Chứng chỉ Nhà phát triển ứng dụng được IBM công nhận xác nhận với những người khác rằng bạn là một nhà phát triển ứng dụng mức trung cấp hoặc cao cấp
về DB2 cho Linux™, UNIX® và Windows® Nó cũng chỉ ra rằng bạn có các kỹ năng giỏi trong tất cả các nhiệm vụ lập trình chung cũng như lập trình SQL nhúng, lập trình ODBC/CLI, lập trình.NET hoặc lập trình Java ™
Loạt bài gồm chín hướng dẫn miễn phí này được thiết kế để giúp bạn chuẩn bị cho
kỳ thi lấy chứng chỉ Phát triển ứng dụng DB2 9 cho Linux, UNIX và Windows (kỳ thi 733) Mỗi hướng dẫn bao gồm một liên kết đến một bản tải về dùng thử miễn phí DB2 9 cho Linux, UNIX và Windows Các hướng dẫn này cung cấp một cơ sở vững chắc cho mỗi phần của kỳ thi Tuy nhiên, bạn không nên dựa vào các hướng dẫn này như là sự chuẩn bị duy nhất của bạn cho kỳ thi này
Trang 2
Hướng dẫn này trình bày về cái gì?
Trong hướng dẫn này, bạn sẽ tìm hiểu về cách tạo và sử dụng các thường trình do người dùng định nghĩa trong DB2 9 Bạn sẽ thấy cách có thể sử dụng các đối tượng ứng dụng cơ sở dữ liệu phía máy chủ để đơn giản hóa và tăng tốc độ các ứng dụng của bạn Hướng dẫn này bao gồm các chủ đề sau:
Các hàm do người dùng định nghĩa
Các thủ tục lưu sẵn
DB2 Developer Workbench (Bàn làm việc của nhà phát triển DB2)
Đây là hướng dẫn cuối cùng trong một loạt gồm chín hướng dẫn mà bạn có thể sử dụng để trợ giúp chuẩn bị cho việc cấp chứng chỉ Phát triển ứng dụng DB2 9 (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 của Phần
9 của kỳ thi, mang tên "Các thường trình do người dùng định nghĩa"
Các yêu cầu hệ thống
Bạn không cần dùng một bản sao của DB2 9 để hoàn tất hướng dẫn này; tuy
nhiên, bạn có thể tải về một bản DB2 Express C miễn phí từ trang web DB2
Express-C để thực hành các kỹ năng của bạn DB2 Developer Workbench cũng có sẵn để tải về miễn phí từ trang Web Fix Pack DB2 9
Trang 3Xin lưu ý rằng một số tài liệu được thảo luận trong hướng dẫn này chỉ áp dụng với DB2 cho Linux, UNIX và Windows và không cho DB2 trên nền tảng khác, chẳng hạn như Hệ thống z hoặc Hệ thống i
Ai nên dùng hướng dẫn này?
Hướng dẫn này được thiết kế cho bất kỳ ai quan tâm đến việc học tập về các khái niệm lập trình DB2 cao cấp và chuẩn bị cho kỳ thi lấy chứng chỉ phát triển ứng dụng DB2 9 (kỳ thi 733)
Các điều kiện cần trước
Trước khi tham dự kỳ thi 733, bạn phải vượt qua được kỳ thi về các khái niệm cơ bản của Họ DB2 9 (kỳ thi 730) Bạn có thể sử dụng Loạt bài hướng dẫn các khái niệm cơ bản của họ DB2 để giúp chuẩn bị cho kỳ thi đó
Đối với hướng dẫn này để có ích, bạn cần phải có kiến thức nền tảng về hoạt động của cơ sở dữ liệu quan hệ cũng như các kiến thức cơ bản về các khái niệm sau đây:
Các cơ sở dữ liệu
Các cấu trúc lập trình cơ sở dữ liệu
Biên dịch ứng dụng
Trang 4
Xem xét lại thuật ngữ
Trước khi bắt đầu hướng dẫn này, bạn nên hiểu rõ khái niệm về một kế hoạch truy cập SQL Nói ngắn gọn, một kế hoạch truy cập là tập hợp các bước mà DB2 sử
dụng để thực hiện một câu lệnh SQL và truy cập dữ liệu Nó bao gồm các chỉ mục được sử dụng, các thời điểm trong đó các trường được lấy ra từ các bảng cơ sở dữ liệu và thứ tự các bước có thực hiện truy vấn Kế hoạch truy cập được nhân cơ sở
dữ liệu tạo ra dựa trên câu lệnh SQL được đệ trình Lý tưởng, cơ sở dữ liệu lựa chọn kế hoạch truy cập tối ưu - đó là, kế hoạch sẽ trả về dữ liệu hiệu quả và nhanh chóng nhất
Các hàm do người dùng định nghĩa
Các hàm do người dùng định nghĩa là gì?
Các hàm do người dùng định nghĩa (User-defined functions - UDFs) là các hàm
được người sử dụng định nghĩa chạy trong nhân cơ sở dữ liệu Các UDF gói gọn một bộ các câu lệnh SQL hay các câu lệnh theo thủ tục chạy thường xuyên trong một đơn vị Điều này được lợi về quản lý mã thay vì phải lặp lại liên tục logic phức tạp hay logic bình thường trong nhiều câu lệnh, bạn có thể cô lập logic đó trong một hàm đơn
Trong DB2, có một số kiểu hàm khác nhau cũng như các ngôn ngữ lập trình khác nhau mà bạn có thể viết chúng theo các ngôn ngữ đó Liệt kê sau đây tóm tắt các kiểu hàm khác nhau trong DB2:
Trang 5 Hàm vô hướng SQL : Trả về một giá trị kiểu dữ liệu nhờ SQL
Hàm hàng SQL : Trả về một hàng dữ liệu nhờ SQL
Hàm bảng SQL : Trả về một bảng SQL dựa trên SQL
Hàm vô hướng bên ngoài : Trả về một kiểu dữ liệu; được viết bằng một
ngôn ngữ lập trình bên ngoài
Hàm bảng bên ngoài : Trả về một bảng đầy đủ; được viết bằng một ngôn
ngữ lập trình bên ngoài
Hàm bảng bên ngoài OLE DB : Một hàm bảng bên ngoài OLE DB do
người dùng định nghĩa được đăng ký trong cơ sở dữ liệu để truy cập dữ liệu
từ một nhà cung cấp OLE DB
Hàm có nguồn gốc hoặc Khuôn mẫu : Dựa vào hàm hoặc khuôn mẫu
khác
Như bạn thấy trong danh sách trên, các kiểu hàm này chủ yếu chia thành hai kiểu
hàm khác biệt Kiểu chung nhất là một hàm trong hay SQL, đó là một hàm được
viết khi sử dụng một tập hợp con của ngôn ngữ thủ tục SQL của DB2 (DB2's SQL Procedural Language - SQL PL) Các hàm cũng có thể được viết bằng các ngôn ngữ lập trình bên ngoài như C/C++, VB.NET hoặc ngôn ngữ Java Các hàm này
được gọi là các hàm ngoài Mã đối với các hàm trong được lưu trữ trong các bảng
danh mục (catalog) cơ sở dữ liệu, trong khi các hàm ngoài chỉ là các tham chiếu đến nơi trong hệ thống tệp, mà các mã của ngôn ngữ lập trình ngoài đã biên dịch được lưu trữ ở đó
Một sự khác nhau quan trọng giữa các hàm SQL và các hàm ngoài là vị trí mà bạn dịch chúng Một hàm SQL có thể được dịch hoặc từ xa hoặc tại chỗ, do nó sẽ được lưu trữ trong các bảng danh mục của cơ sở dữ liệu Một hàm ngoài không linh
Trang 6hoạt Nó phải được biên dịch trên máy tính có một trình biên dịch thích hợp, với thư viện biên dịch sau đó chuyển sang máy chủ Đôi khi, tùy thuộc vào ngôn ngữ lập trình được sử dụng, hệ điều hành và phần cứng bên dưới cần phải có cùng trên
cả hai máy biên dịch và máy chủ cơ sở dữ liệu cho mã đã dịch hoạt động Đây là một lý do các hàm SQL thường được ưa thích hơn các hàm ngoài, đặc biệt là trong các ứng dụng cần nhiều hệ điều hành và nhiều cấu hình phần cứng
Liệt kê sau đây tóm tắt các ngôn ngữ lập trình mà bạn có thể dùng để viết các UDF:
SQL PL của DB2 (với các hàm được viết khi sử dụng một hoặc nhiều câu lệnh SQL)
C/C++
Ngôn ngữ Java
Ngôn ngữ.NET CLR như C#
OLE
Bạn sẽ tìm hiểu về các hàm SQL và các hàm ngoài trong hai phần tiếp theo Bạn
sẽ tìm hiểu sâu hơn các hàm SQL, bởi vì chúng là kiểu chung nhất
Các hàm SQL do người dùng định nghĩa
Tạo một hàm
Trang 7Các hàm SQL rất dễ tạo ra và sử dụng trong các ứng dụng Các câu lệnh CREATE FUNCTION định nghĩa các đặc tính và logic của hàm, được lưu trữ trong danh
mục hệ thống DB2 Hoạt động này được gọi là đăng ký một hàm Một phiên bản
đơn giản của sơ đồ cú pháp CREATE FUNCTION được hiển thị trong Liệt kê 1, với giải thích về các bộ phận chính của nó:
Liệt kê 1 Sơ đồ cú pháp CREATE FUNCTION
Trang 9Các mệnh đề phổ biến nhất của câu lệnh CREATE FUNCTION như sau:
function-name: Tên của hàm
Kiểu RETURNS: Kiểu của hàm đang được tạo Các kiểu có sẵn là hàm vô hướng, hàng và bảng Bạn sẽ tìm hiểu về từng kiểu hàm chi tiết hơn trong
các phần tương ứng có tên "Các hàm vô hướng," "Các hàm hàng" và "Các
Trang 10hàm bảng" dưới đây Để chỉ rõ một hàm vô hướng, bạn chỉ cần nhận biết kiểu dữ liệu đang được trả về (bạn không cần phải sử dụng từ khóa
EXTERNAL ACTION (Hoạt động bên ngoài): Xác định xem hàm có bất
kỳ tác động nào đến các chương trình bên ngoài không
[READS|CONTAINS|MODIFIES] SQL: Xác định hàm này tương tác với
cơ sở dữ liệu thông qua SQL như thế nào
SQL-function-body: (thân hàm SQL): Đây là cốt lõi của hàm, nơi mà câu lệnh CREATE FUNCTION có chứa logic
Câu lệnh CREATE FUNCTION
Phần này trình bày một số ví dụ mã cho biết ý nghĩa của các mệnh đề trong câu lệnh CREATE FUNCTION
Trang 11RETURNS
Mệnh đề RETURNS xác định kiểu của hàm được tạo Ba kiểu chính là scalar, row
và table Một hàm vô hướng, như ví dụ hiển thị trong Liệt kê 2, trả về một giá trị
Trang 12
CREATE FUNCTION fromperson (p person)
RETURNS ROW (name VARCHAR(10), firstname
RETURN VALUES (p name, p firstname)
Một hàm bảng, như ví dụ được hiển thị trong Liệt kê 4, trả về không hay nhiều hàng của một bảng Bảng này có thể được tạo ra từ một câu lệnh SQL hoặc từ logic lập trình
Liệt kê 4 Một hàm bảng đơn giản
CREATE FUNCTION deptemployees (deptno CHAR(3))
Trang 13SELECT empno, lastname, firstnme, deptname
FROM employee, department
WHERE employee.workdept = department.deptno
SPECIFIC
Mệnh đề SPECIFIC được sử dụng để cung cấp cho hàm một tên xác định
(identifier) Bạn có thể sử dụng tên này khi bạn đang tìm nguồn, loại bỏ hoặc thêm
Trang 14một lời ghi chú cho hàm đó Điều này đặc biệt có ích khi bạn sử dụng các hàm quá tải Hai hàm được chỉ ra trong Liệt kê 5 minh họa sự quá tải hàm Hàm đầu tiên thêm hai số nguyên với nhau Hàm thứ hai nối chuỗi new_ với một chuỗi đầu vào Chú ý rằng cả hai hàm có cùng tên, nhưng có một số các tham số đầu vào khác nhau
Liệt kê 5 Các hàm vô hướng quá tải
Trang 15CREATE FUNCTION joinData (x VARCHAR(10))
bỏ Tuy nhiên, nếu bạn đã cho hàm đó một tên SPECIFIC bạn chỉ có thể sử dụng tên đó để chỉ hàm ví dụ DROP SPECIFIC FUNCTION join_int2
DETERMINISTIC
Mệnh đề DETERMINISTIC được sử dụng để chỉ rõ một hàm có hay không
thường xuyên trả về cùng giá trị Thông tin này sau đó có thể được DB2 sử dụng
để tối ưu hoá cách thức gọi hàm, do DB2 sẽ nhớ nhanh (cache) giá trị của hàm nếu
nó đã được chạy một lần trước đó và tất định Nếu một hàm sử dụng bất kỳ các số
Trang 16đăng ký đặc biệt nào hoặc gọi bất kỳ các hàm không tất định nào, nó được coi là không tất định
Liệt kê 6 chỉ ra một ví dụ về một hàm vô hướng xác định, trong khi Liệt kê 7 chỉ
ra một ví dụ về một hàm vô hướng không tất định:
Liệt kê 6 Một hàm vô hướng tất định
Trang 17RETURN CURRENT DATE + x MONTHS
Kết quả của việc thực hiện hàm trong Liệt kê 6 luôn luôn là như nhau cho mỗi cặp đầu vào (x,y) Tuy nhiên, hàm trong Liệt kê 7 không phải lúc nào cũng tạo ra cùng một giá trị, vì nó yêu cầu tìm ngày tháng hiện tại
Hoạt động bên ngoài
Mệnh đề này chỉ rõ một hàm có hay không thay đổi bất kỳ các đối tượng nào bên ngoài cơ sở dữ liệu Tùy chọn này phải được đặt EXTERNAL ACTION nếu hàm này thực hiện bất kỳ hành động nào có tác động bên ngoài Một ví dụ sẽ là một hàm có sửa đổi một tệp trong hệ thống tệp hoặc thay đổi dữ liệu trong một nguồn bên ngoài
[CONTAINS|READS|MODIFIES] SQL
Trang 18Tùy chọn này cho DB2 biết cách một hàm sẽ tương tác với cơ sở dữ liệu Có ba sự lựa chọn:
CONTAINS SQL: Chỉ định các câu lệnh SQL không đọc lẫn không sửa đổi
dữ liệu SQL có thể được sử dụng trong hàm đó
READS SQL DATA: Chỉ định các câu lệnh không sửa đổi dữ liệu SQL có thể được sử dụng trong hàm đó
MODIFIES SQL DATA: Chỉ định tất cả các câu lệnh SQL ở dạng câu lệnh phức hợp động có thể được sử dụng trong hàm đó
Các quy tắc của hàm
Có một số các hạn chế về các hàm mà bạn cần phải biết được:
Nếu một hàm SQL chứa nhiều tham chiếu đến thanh ghi đặc biệt về ngày tháng hoặc thời gian, thì tất cả các tham chiếu trả về cùng một giá trị
Thân của một hàm SQL không thể gọi đệ quy đến chính nó hoặc một hàm hay phương thức khác gọi nó
Ngôn ngữ được các hàm SQL sử dụng thực sự là một tập hợp con của ngôn ngữ SQL PL được các thủ tục lưu sẵn Như vậy, một vài cấu trúc ngôn ngữ
có thể được sử dụng trong các thủ tục lưu sẵn là không sẵn sàng trong các hàm
Trang 19
Sử dụng các câu lệnh phức hợp trong các hàm
Một câu lệnh phức hợp SQL là một nhóm các câu lệnh chứa trong một khối BEGIN END Các câu lệnh SQL trong khối được xử lý như là một đơn vị đơn
Liệt kê 8 cho thấy sơ đồ cú pháp của một khối SQL phức hợp động:
Liệt kê 8 Sơ đồ cú pháp cho một câu lệnh SQL phức hợp động
Trang 21condition-declaration:
->
Trang 23ngoại trừ kiểu dữ liệu XML Nếu chưa cho giá trị mặc định đối với một kiểu dữ liệu, khi khai báo nó sẽ tự động được thiết lập là NULL Dưới đây là một số ví dụ:
DECLARE myInt INTEGER;
DECLARE myChar CHAR(6);
DECLARE myInt2 INTEGER DEFAULT 0;
DECLARE myChar2 VARCHAR(100) DEFAULT NULL;
XỬ LÝ ĐIỀU KIỆN
Tùy chọn xử lý điều kiện (CONDITION HANDLING) hiện không dùng cho các hàm
Các câu lệnh kiểm soát SQL
Lưu ý rằng không phải tất cả các câu lệnh được dùng trong các thủ tục lưu sẵn SQL là có trong các UDF Hơn nữa, một số các câu lệnh trong sơ đồ cú pháp nêu trên chỉ được hỗ trợ trong các hàm bảng Những câu lệnh khác, chẳng hạn như câu lệnh CALL cũng có những hạn chế nhất định về cách chúng có thể được sử dụng trong các hàm
Do có một số khác biệt giữa việc sử dụng các câu lệnh thủ tục trong các hàm và trong các thủ tục, phần dưới đây với tên "Các thủ tục lưu sẵn" trình bày cách sử dụng nâng cao hơn về các câu lệnh SQL phức hợp và cung cấp thêm các ví dụ
Trang 24
Các hàm vô hướng
Một hàm vô hướng SQL là kiểu hàm SQL phổ biến nhất Nó trả về một giá trị theo
một kiểu dữ liệu mà DB2 cho phép Ví dụ đơn giản trong Liệt kê 9 minh họa cách bạn có thể nhúng logic vào trong một hàm thay vì một ứng dụng khách Hàm CHANGESAL được tạo bởi dòng đơn trong mã thủ tục: RETURN sal * 2 Các phần khác tạo nên định nghĩa hàm Hàm nhận con số tiền lương của một nhân viên (một giá trị DOUBLE) làm đầu vào Nó cũng chấp nhận các giá trị số khác, chẳng hạn như một số nguyên INTEGER, do DB2 ngầm định tạo khuôn mẫu chúng cho bạn
Liệt kê 9 Một hàm vô hướng đơn giản do người dùng định nghĩa
Trang 25Liệt kê 10 chỉ ra một ví dụ về cách bạn có thể thực hiện hàm như một phần của một câu lệnh SQL:
Liệt kê 10 Thực hiện một hàm CHANGESAL do người dùng định nghĩa
Trang 26Các hàm vô hướng thường phức tạp hơn hàm này và thường liên quan đến logic và các lệnh SQL khác phức tạp hơn Liệt kê 11 chỉ ra một ví dụ về một hàm vô
hướng phức tạp hơn có trả về số nhân viên đã đạt được trình độ giáo dục bằng với cái được xác định như đầu vào của hàm đó:
Liệt kê 11 Một hàm phức tạp hơn do người dùng định nghĩa
WHERE edLevel = v_edLevel
Sau đó bạn có thể sử dụng hàm này trong một câu lệnh SQL, như trong Liệt kê 12, dưới đây:
Trang 27Liệt kê 12 Thực hiện hàm EDCOUNT do người dùng định nghĩa
Trang 2817 7
18 7
19 1
20 1
Ở mức thấp, khi gọi ra các hàm SQL, DB2 nhận logic hàm và nội tuyến nó vào
trong câu lệnh SQL Điều này có nghĩa là lời gọi hàm trong các câu lệnh SQL thực
sự được thay thế bằng logic hàm Kết quả là, trình tối ưu hóa (optimizer) của DB2 tạo ra một kế hoạch truy cập được tối ưu hóa cho toàn bộ câu lệnh chứ không chỉ cho một phần của nó Điều này dẫn tới kế hoạch truy cập tổng thể tốt hơn Ví dụ, Liệt kê 13 chỉ ra câu lệnh SQL được viết lại từ Liệt kê 10:
Liệt kê 13 Câu lệnh SQL được viết lại từ Liệt kê 10
Trang 29Sự nội tuyến hóa của câu lệnh SQL được hiển thị trong Liệt kê 12 là phức tạp hơn câu lệnh SQL đơn giản ban đầu Liệt kê 14 chỉ ra câu lệnh được viết lại:
Liệt kê 14 Câu lệnh SQL được viết lại từ Liệt kê 12
Trang 30AS Q6
Các hàm hàng
Một hàm hàng không trả về một hàng dữ liệu, như bạn có thể mong đợi từ tên của
nó Nó thực sự được sử dụng để biến đổi một kiểu dữ liệu có cấu trúc thành các thành phần riêng biệt của nó Các kiểu có cấu trúc do người dùng định nghĩa
(UDST) là các kiểu dữ liệu được người sử dụng định nghĩa với tham chiếu đến một hoặc nhiều kiểu dữ liệu DB2 Do đó, bạn sẽ chỉ sử dụng các hàm hàng khi bạn đang sử dụng các UDST trong cơ sở dữ liệu của bạn Các hàm hàng chỉ có thể được định nghĩa như là các hàm SQL
Đối tượng NGƯỜI (PERSON) trong Liệt kê 15 là một ví dụ về một UDST Nó chứa một trường lastName và firstName Hàm hàng có tên là FROMPERSON có thể được sử dụng để trích xuất các trường cụ thể từ một thể hiện của kiểu
Trang 31lastname VARCHAR(20),
firstname VARCHAR(20))
MODE DB2SQL
CREATE FUNCTION fromperson (p person_t)
RETURNS ROW (lname VARCHAR(20), fname
Một trong những khía cạnh mạnh hơn của các hàm DB2 là khả năng của chúng trả
về toàn bộ một bảng dữ liệu thay vì một giá trị Điều này mở nhiều nguồn thông
Trang 32tin mà bạn có thể sử dụng trong câu lệnh SQL của bạn Thay vì tham chiếu đến một bảng cơ sở dữ liệu, bạn có thể viết một hàm C để trả về một luồng dữ liệu sống động, chẳng hạn như dữ liệu của thị trường chứng khoán ở dạng bảng
Các hàm bảng thực sự khá dễ viết Thay vì trả lại một giá trị dữ liệu, như là hàm
vô hướng làm, hàm bảng trả về các hàng của một bảng bạn xác định, như là Liệt
kê 16 minh họa:
Liệt kê 16 Một hàm bảng đơn giản
Trang 33RETURN
SELECT ROW_NUMBER() OVER(), e.empno,
e.lastname, e.firstnme
FROM employee e
WHERE e.workdept = p_dept
Hàm này liệt kê danh sách một tập hợp các nhân viên của một bộ phận Nó chấp nhận một tham số đầu vào theo kiểu VARCHAR Bảng do hàm trả về được tạo từ bốn cột, cột đầu tiên là một số nguyên INTEGER, các cột còn lại là các
VARCHAR Hàm trả về một tập hợp các hàng do câu lệnh SELECT định nghĩa Cột đầu tiên của câu lệnh SELECT là một biểu thức đặc biệt để tạo ra việc sử dụng các hàm gộp của DB2 Biểu thức này trả về một giá trị số nguyên cho mỗi hàng, bắt đầu bằng số một và tăng dần lên một ở mỗi hàng kế tiếp Các giá trị cho các cột khác được lấy từ bảng NHÂN VIÊN (EMPLOYEE), nhưng chỉ với các hàng ở đó số bộ phận khớp với giá trị của tham số đầu vào Như bạn có thể thấy được, biểu thức ROW_NUMBER() OVER() là một cách rất thuận tiện để tự động tạo ra chuỗi các số đối với tập kết quả có tác dụng đánh số từng hàng trong tập kết quả
Để gọi ra một hàm bảng, bạn phải tham chiếu nó trong mệnh đề FROM của truy vấn và bọc nó trong hàm được gọi là TABLE Liệt kê 17 chỉ ra một ví dụ về cách bạn sẽ gọi hàm bảng được hiển thị trong Liệt kê 16:
Liệt kê 17 Gọi ra hàm bảng GETENUMEMPLOYEE
Trang 34
SELECT * FROM TABLE(getEnumEmployee('E11')) AS myNewTable
Result from the DB2 sample database:
ENUM EMPNO LASTNAME FIRSTNME
Trang 35Có một số hạn chế cần lưu ý khi làm việc với các hàm bảng Trước tiên, bạn phải biết số lượng các cột và các kiểu dữ liệu trong bảng là kết quả hàm sẽ trả về Nếu một hàm hướng đến tất cả các cột của bảng và sau này bạn thêm một cột vào bảng
đó, thì hàm có thể không hoạt động như mong đợi Ví dụ, giả sử bảng và hàm được hiển thị trong Liệt kê 18 được tạo ra, sau đó có một cột bổ sung sau này được thêm vào bảng sử dụng một câu lệnh ALTER:
Liệt kê 18 Hàm bảng và bảng đơn giản
CREATE FUNCTION returnAllTest (v_v1 int)
RETURNS TABLE (v_varOne INT,
v_varTwo INT)
LANGUAGE SQL
Trang 36ALTER TABLE testTab ADD varThree int
Trong trường hợp này, một cuộc gọi đến hàm không còn trả về bảng dự kiến với
ba cột, mà chỉ trả về hai cột ban đầu được xác định khi bảng đã được tạo ra Tình trạng này phát sinh vì dấu * được sử dụng trong định nghĩa hàm và được giải quyết trong thời gian tạo, chứ không phải trong thời gian thực hiện
Các hàm ngoài do người dùng định nghĩa
Sử dụng các hàm ngoài
Khả năng để tham khảo các chương trình ngoài như là các hàm giúp cho các câu lệnh SQL của bạn có các khả năng mạnh mẽ Bằng cách xây dựng các hàm bằng
Trang 37các ngôn ngữ lập trình như C và ngôn ngữ Java, bạn có thể thực hiện rất nhiều nhiệm vụ cao cấp như xử lí chuỗi, mà có thể yêu cầu nhiều (và làm đảo lộn) các câu lệnh SQL trong một UDF SQL để lặp Bạn cũng có thể xử lý các nguồn dữ liệu bên ngoài hoặc thực hiện các hành động bên ngoài các cơ sở dữ liệu trong các ngôn ngữ lập trình này
Các hàm ngoài có thể được định nghĩa hoặc để chạy ở chế độ NOT FENCED có nghĩa là, bên trong nhân cơ sở dữ liệu hay chế độ FENCED có nghĩa là, trong
bộ nhớ bên ngoài nhân cơ sở dữ liệu Ưu điểm của việc sử dụng một hàm NOT FENCED là chia sẻ vùng nhớ với nhân cơ sở dữ liệu và có thể truyền thông với nó nhanh hơn Tuy nhiên, nếu một hàm NOT FENCED chưa được viết đúng cách, lỗi
bộ nhớ có thể xảy ra Nếu điều này xảy ra, lỗi bộ nhớ có thể bắt đầu ghi đè bộ nhớ
có liên kết với nhân DB2, mà nhân này có thể có ảnh hưởng khủng khiếp, ví dụ như loại bỏ DB2 Nếu bạn đang viết các hàm C hoặc C++, bạn nên viết chúng như
là các hàm FENCED và thử kiểm tra chúng rộng rãi trước khi quyết định để tái tạo chúng như là hàm NOT FENCED
Tạo các hàm bên ngoài
Liệt kê 19 cho thấy một sơ đồ cú pháp đơn giản để đăng ký một hàm ngoài:
Liệt kê 19 Sơ đồ cú pháp để đăng ký một hàm vô hướng ngoài
>>-CREATE