DB29.7: Sử dụngcáckhốiẩndanh PL/SQL
trong DB29.7
Giới thiệu
Bài viết này đưa ra hướng dẫn để sửdụngkhốiẩndanhtrongDB29.7trong kịch bản sau:
Thử nghiệm, sửa lỗi và phát triển các thủ tục lưu sẵn PL/SQL mới.
Mô phỏng các hoạt động của ứng dụng với PL/SQL.
Xây dựngcác báo cáo và các truy vấn đặc biệt phức tạp đang hoạt động với PL/SQL.
Xem xét lại những điều kiện cần trước và các yêu cầu hệ thống
Bài này được viết cho các nhà phát triển ứng dụng và người quản trị cơ sở dữ liệu PL/SQL,
những người đã chuyển từ Oracle sang DB2. Bạn nên hiểu khái niệm về ngôn ngữ thủ tục
PL/SQL. Các nhà phát triển SQL PL nên sửdụng hàm tương ứng được các câu lệnh SQL phức
hợp riêng của DB2 cung cấp.
Để sửdụngcác ví dụ trong bài viết này, bạn phải cài đặt DB29.7 Workgroup hoặc Enterprise
Edition cho Linux, UNIX và Windows. Hãy tham khảo phần Tài nguyên để tải về một phiên bản
dùng thử miễn phí của DB29.7 cho Linux, UNIX và Windows.
Sử dụngcác ví dụ
Bạn có thể chạy các ví dụ bằng cách sử dụngcác công cụ khác nhau, bao gồm bộ xử lý dòng
lệnh DB2 (CLP) và các tiện ích lệnh (CLPPLUS) hoặc các công cụ trực quan như Optim
Development Studio. Nếu bạn định chạy các ví dụ từ CLP, bạn cần phải chạy lệnh SET
SQLCOMPAT PLSQL để cho phép nhận ra ký tự dấu gạch chéo thuận (/) trên một dòng mới
như là một ký tự kết thúc câu lệnh PL/SQL.
Để kích hoạt sự hỗ trợ trongDB2 cho các kiểu dữ liệu PL/SQL và Oracle, cơ sở dữ liệu của bạn
phải được tạo ra với biến đăng kí DB2_COMPATIBILITY_VECTOR được thiết lập giá trị
ORA, như hiển thị trong Liệt kê 1.
Liệt kê 1. Thiết lập biến đăng kí DB2_COMPATIBILITY_VECTOR
db2set DB2_COMPATIBILITY_VECTOR=ORA
db2stop
db2start
db2 create db test
Đối với bài này, Liệt kê 2 cung cấp mã để tạo một ứng dụngPL/SQL thương mại điện tử đơn
giản quản lý các đơn đặt hàng trực tuyến sau khi bạn tạo ra một cơ sở dữ liệu. Bạn cũng sẽ đặt
vào các bảng với một số dữ liệu mẫu.
Liệt kê 2. Mã ví dụ
Truy
cập vào mã ví dụ
Hiểu biết về các khốiẩndanh
Các khốiẩndanh là các cấu trúc PL/SQL cung cấp khả năng tạo ra và thực thi mã thủ tục đang
hoạt động mà không cần liên tục lưu trữ mã như là các đối tượng cơ sở dữ liệu trongcácdanh
mục hệ thống. Khái niệm về cáckhốiẩndanh tương tự như các kịch bản lệnh shell UNIX, nó
cho phép một số lệnh nhập vào thủ công được nhóm lại và thực hiện như là một bước. Như tên
của nó, cáckhốiẩndanh không có tên và vì lý do này mà chúng không thể được tham khảo từ
các đối tượng khác. Mặc dù được xây dựng động, cáckhốiẩndanh có thể dễ dàng được lưu trữ
như các kịch bản lệnh trongcác tệp hệ điều hành để thực hiện lặp lại nhiều lần.
Các khốiẩndanh là cáckhốiPL/SQL tiêu chuẩn. Chúng có kèm cú pháp và phải tuân theo quy
tắc áp dụng cho tất cả cáckhối PL/SQL, gồm cả khai báo và quy mô của các biến, việc thực
hiện, xử lý ngoại lệ và cách sửdụng SQL và PL/SQL.
Việc biên dịch và thực hiện cáckhốiẩndanh được kết hợp trong một bước, trong khi một thủ tục
lưu sẵn PL/SQL cần phải được định nghĩa lại trước mỗi lần sửdụngcác thay đổi định nghĩa của
nó. Đây là một trong những lợi thế đáng kể của cáckhốiẩndanh so với các đối tượng cơ sở dữ
liệu có tên liên tục, như các thủ tục lưu sẵn và các hàm do người dùng định nghĩa, vì nó làm
giảm thời gian giữa các thay đổi thực hiện trong mã và thực hiện thực tế. Điều đó làm cho các
khối ẩndanh rất có ích khi sửa lỗi, chạy thử và thử nghiệm mã thủ tục, vì đây là những nhiệm vụ
thường đòi hỏi nhiều hoạt động thay đổi và thực thi.
Một lợi ích khác của cáckhốiẩndanh là chúng không tạo ra bất kỳ các phụ thuộc nào và chúng
không yêu cầu bất kỳ các quyền ưu tiên đặc biệt nào để tạo đối tượng, mà việc này có thể tránh
những tình thế khó khăn trong một môi trường sản xuất. Cáckhốiẩndanh cho phép chạy linh
hoạt bất kỳ chuỗi hành động có tính thủ tục, dựa trên các đặc quyền select đơn giản; và chúng
cho phép bạn thử nghiệm mà không cần tạo hay ngầm định các đối tượng cơ sở dữ liệu hiện có.
Bạn có thể thực thi cáckhốiẩndanh từ:
SQL (ví dụ, bên trongcác câu lệnh EXECUTE IMMEDIATE).
CácDB2 API như JDBC và ODBC.
Các công cụ DB2 khác nhau, bao gồm CLP, CLPPlus, Optim Database Administrator
(Nhà quản trị cơ sở dữ liệu Optim) và Optim Development Studio.
Chạy thử mã PL/SQL với cáckhốiẩndanh
Trong Liệt kê 3, một nhà phát triển ứng dụng dự kiến yêu cầu nghiệp vụ cho một cơ chế để
truyền thông (bằng email) với các khách hàng được xác định trong bảng KHÁCH HÀNG
(CUSTOMER). Để chủ động đáp ứng yêu cầu này, anh ta quyết định viết một khốiẩndanh
PL/SQL thử nghiệm đơn giản để gửi email có chứa một số thông báo cho các khách hàng trong
bảng CUSTOMER. Sau đó, một khi yêu cầu nghiệp vụ này được hoàn thành, khốiẩndanh đã
chạy thử có thể dễ dàng được nâng cao và dễ dàng được biến đổi thành một thủ tục lưu sẵn
PL/SQL mới. Lưu ý rằng khốiẩndanh này sửdụngcác gói kèm theo mới, bao gồm UTL_SMTP
(gói để gửi các email) và DBMS_OUTPUT (gói để viết các thông báo tới đầu ra tiêu chuẩn), là
một phần của DB2 9.7.
Liệt kê 3. Một khốiẩndanhPL/SQL thử nghiệm đơn giản sẽ gửi email có chứa một số
thông báo cho khách hàng trong bảng CUSTOMER
SET SERVEROUTPUT ON
/
DECLARE
conn UTL_SMTP.connection;
reply UTL_SMTP.reply;
msg VARCHAR2(1024);
sender VARCHAR2(255) DEFAULT 'demo\@ca.ibm.com';
recipients VARCHAR2(255);
subject VARCHAR2(255) DEFAULT 'Quick notification';
crlf VARCHAR2(2);
BEGIN
crlf := UTL_TCP.CRLF;
FOR row IN (SELECT first_name, email FROM customer) LOOP
DBMS_OUTPUT.PUT_LINE('Sending test email to customer ' ||
row.first_name || ' ');
recipients := row.email;
msg := 'FROM: ' || sender || crlf ||
'TO: ' || recipients || crlf ||
'SUBJECT: ' || subject || crlf ||
crlf ||
'Hi ' || row.first_name || ', this is a test notification.';
UTL_SMTP.OPEN_CONNECTION('smtp_server.ibm.com', 25, conn, 10, reply );
UTL_SMTP.HELO(conn, 'localhost');
UTL_SMTP.MAIL(conn, sender);
UTL_SMTP.RCPT(conn, recipients);
UTL_SMTP.DATA(conn, msg);
UTL_SMTP.QUIT(conn);
END LOOP;
END;
/
Output:
Sending test email to customer Mike
Sending test email to customer Joan
Sending test email to customer Colin
Sending test email to customer Graham
Sending test email to customer Patsy
Về đầu trang
Mô phỏng các hoạt động của ứng dụng với cáckhốiẩndanh
Như đã đề cập, một trong những cách sử dụngcáckhốiẩndanh phổ biến nhất là để gọi các đối
tượng ngôn ngữ thủ tục, thường là cho mục đích thử nghiệm. Liệt kê 4 giải thích cách mô phỏng
một hoạt động của ứng dụng với sự giúp đỡ của một khốiẩndanh PL/SQL. Mã này mô phỏng
một hoạt động của ứng dụngtrong khi thu giữ các thước đo hiệu năng. Khốiẩndanh mô phỏng
việc tạo ra 10 đơn đặt hàng ngẫu nhiên cho các khách hàng ngẫu nhiên từ bảng CUSTOMER. Nó
cũng in thời gian bắt đầu và kết thúc thử nghiệm, cùng với các chi tiết đơn hàng cho mỗi lần
chạy. Dễ dàng thay đổi số lượng đơn đặt hàng từ 10 đến 20 và sau đó chạy lại khốiẩndanh này
mà không cần biên dịch lại. Bạn cũng có thể dùng thước đo hiệu năng khác để thử nghiệm thêm.
Liệt kê 4. Một ứng dụng đang chạy với sự giúp đỡ của một khốiẩndanhPL/SQL
SET SERVEROUTPUT ON
/
DECLARE
v_customer_id customer.customer_id%TYPE;
product_id product.product_id%TYPE:=1;
o_order_id orders.order_id%TYPE;
v_test_start TIMESTAMP;
BEGIN
SELECT CURRENT TIMESTAMP INTO v_test_start FROM dual;
FOR k IN 1 10 LOOP
SELECT customer_id INTO v_customer_id FROM customer ORDER BY RAND()
FETCH FIRST 1
ROW ONLY;
FOR i IN (
SELECT product_id, CAST(RAND()*50 as integer)+1 as quantity
FROM product
WHERE ROWNUM < CAST(RAND()*10 as integer))
LOOP
add_item_to_shopping_cart(i.product_id, i.quantity);
END LOOP;
create_order(v_customer_id, o_order_id);
DBMS_OUTPUT.PUT_LINE('
');
END LOOP;
DBMS_OUTPUT.PUT_LINE('Test start: ' || v_test_start);
DBMS_OUTPUT.PUT_LINE('Test end : ' || CURRENT TIMESTAMP);
END;
/
Output:
Customer : Mike, Smith
Order creation : 07-06-2009
Estimated Delivery : 07-09-2009
Status : Shipped
Total price : $ 150,615.44
Customer : Joan, Jett
Order creation : 07-06-2009
Estimated Delivery : 07-09-2009
Status : Shipped
Total price : $ 159,445.77
Customer : Colin, Taylor
Order creation : 07-06-2009
Estimated Delivery : 07-09-2009
Status : Shipped
Total price : $ 266,242.78
Test start: 2009-07-06-11.10.11.500000
Test end : 2009-07-06-11.10.11.546000
Về đầu trang
Tạo các báo cáo đặc biệt bằng cáckhốiẩndanh
Một yêu cầu lập báo cáo chung là liên kết dữ liệu từ nhiều hơn một cột thành một chuỗi đơn. Có
thể viết các câu lệnh thuần SQL với lệnh đệ qui phức tạp để làm điều này. Tuy nhiên, thay vào
đó bạn có thể sử dụngcáckhốiẩndanh để làm điều này nhanh chóng với các tùy chọn định dạng
động và luồng logic đơn giản.
Liệt kê 5 cho thấy cách tạo một báo cáo đặc biệt với sự giúp đỡ của cáckhốiẩn danh. Mã này lấy
ra danh sách của tất cả các khách hàng đã đặt hàng các sản phẩm từ các cửa hàng và tổng giá trị
của tất cả các đơn đặt hàng trong tháng trước. Các tên được hiển thị trong một hàng và được
phân cách bằng dấu phẩy.
Liệt kê 5. Tạo một báo cáo đặc biệt với sự giúp đỡ của cáckhốiẩndanh
SET SERVEROUTPUT ON
/
DECLARE
v_customer_names VARCHAR2(4000);
v_total_sales NUMBER(19,2);
BEGIN
DBMS_OUTPUT.PUT_LINE(' Last Month Sales Report ');
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT('Customer List: ');
FOR row IN
(SELECT distinct(a.customer_id),first_name, last_name FROM customer a,
orders b
WHERE a.customer_id=b.order_id AND b.creation_time>CURRENT
DATE -1 month)
LOOP
v_customer_names := v_customer_names || '"' || row.first_name || ' ' ||
row.last_name || '", ';
END LOOP;
IF(LENGTH(v_customer_names) > 0) THEN
v_customer_names := SUBSTR(v_customer_names,1,
LENGTH(v_customer_names)-2);
ELSE
v_customer_names := 'None';
END IF;
DBMS_OUTPUT.PUT_LINE(v_customer_names);
SELECT NVL(SUM(total_price),0) INTO v_total_sales FROM orders WHERE
creation_time>
CURRENT DATE - 1 month;
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT_LINE('Total Sales: ' || TO_CHAR(v_total_sales,
'$99,999,999.99'));
END;
/
Output:
Last Month Sales Report
Customer List: "Mike Smith", "Joan Jett", "Colin Taylor", "Graham Norton",
"Patsy Stone"
Total Sales: $ 49,772.56
Về đầu trang
Kết luận
Bài này được trình bày như sau
Tính năng của cáckhốiẩndanhPL/SQL được giới thiệu trongDB2 9.7.
Khái niệm về cáckhốiẩn danh.
Cách tạo thuận lợi cho quá trình thử nghiệm, tạo mã mẫu và sửa lỗi của mã thủ tục.
Cách khốiẩndanh mô phỏng hoạt động chạy của ứng dụng.
Cách dùngkhốiẩndanh để viết báo cáo.
Với sự hỗ trợ cho cáckhốiẩndanh PL/SQL, bạn có thể nhanh chóng kích hoạt các giải pháp
PL/SQL trong môi trường DB2 bằng cách sửdụngcác kịch bản lệnh PL/SQL hiện có hoặc sử
dụng các câu lệnh riêng PL/SQL và SQL để làm việc với các hệ quản trị cơ sở dữ liệu khác.
. DB2 9. 7: Sử dụng các khối ẩn danh PL/SQL
trong DB2 9. 7
Giới thiệu
Bài viết này đưa ra hướng dẫn để sử dụng khối ẩn danh trong DB2 9. 7 trong kịch.
Mô phỏng các hoạt động của ứng dụng với các khối ẩn danh
Như đã đề cập, một trong những cách sử dụng các khối ẩn danh phổ biến nhất là để gọi các đối
tượng