PDF:

DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho
Linux, UNIX và Windows
DB2 9.7 cung cấp cho các ứng dụng đã phát triển trên Oracle một sự
gắn kết chặt chẽ với sự hỗ trợ PL/SQL và nhiều hơn nữa
Serge Rielau
Kiến trúc sư SQL, STSM
IBM Toronto Lab
06 11 2009
IBM® DB2® 9.7 cho Linux®, UNIX® và Windows® có sự hỗ trợ sẵn sàng cho các phương ngữ
SQL của Oracle và PL/SQL. Điều này cho phép nhiều ứng dụng đã viết theo Oracle được thực
hiện theo DB2. Trong bài viết này, hãy đón nhận một tổng quan mức cao về khả năng tương
thích Oracle có nghĩa là gì trong DB2. Cho dù bạn muốn chuyển ứng dụng tùy chỉnh của bạn
sang DB2 hoặc mở rộng sự hỗ trợ của nhà cung cấp DBMS của bạn sang DB2, thì bây giờ là lúc
của bạn.
Xem thêm bài trong loạt bài này
Động lực
Tháng 3 vừa rồi, tại một cuộc thuyết trình CeBIT mà tôi đã tổ chức về DB2 9.7, tôi đã đốt cháy
một bộ loa máy tính 110V do tôi đã không thận trọng cắm nó vào lưới điện 230V của nước Đức mà
không cho qua một biến áp. Trong cùng chuyến đi đó, tôi cũng đã phá hỏng bộ sạc điện cho bàn
chải đánh răng chạy điện của tôi và máy cạo râu của tôi với các sự cố tương tự. Bỏ qua sự bất lực
của tôi như là bài học từ các sai lầm sang một bên, việc này xảy ra như không có gì bất ngờ đúng
như một trong các câu châm ngôn yêu thích của tôi (không rõ nguồn gốc) là "Vấn đề với các tiêu
chuẩn là có bao nhiêu tiêu chuẩn".
Trong thế giới của các hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS), chúng tôi may mắn có ít
nhất ba tiêu chuẩn chính và vô số các sự thay đổi theo các tiêu chuẩn đó:
• ANSI SQL và ANSI SQL/PSM
• Oracle SQL và PL/SQL
• Sybase và Microsoft TSQL
Hình 1 mô tả bằng một sơ đồ Venn cách các phương ngữ SQL chồng lên nhau:
© Copyright IBM Corporation 2009
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Nhẫn hiệu đăng ký
Trang 1 của 17
developerWorks®
ibm.com/developerWorks/vn/
Hình 1. Sự hỗ loạn Babylon của SQL
Bất cứ khi nào bạn viết một ứng dụng, bạn phải tiến hành lựa chọn sử dụng nhà cung cấp RDBMS
nào. Một khi bạn đã thực hiện sự lựa chọn đó, về cơ bản bạn được cam kết. Bất kỳ cố gắng nào để
chuyển đổi các nhà cung cấp để tận dụng giá thấp hơn, công nghệ tốt hơn hoặc quan hệ đối tác tốt
hơn bị cản trở do mã thừa kế cần được viết lại nhiều hơn, trước khi nó có thể được dùng với một
RDBMS khác. Ngoài ra, bộ kỹ năng của bạn không thể chuyển từ một sản phẩm này sang một sản
phẩm khác dễ dàng như bạn mong đợi.
IBM DB2 9.7 cho Linux, UNIX và Windows (DB2) nhằm hạ thấp đáng kể những rào cản này cho
các ứng dụng được viết cho Oracle khi cho phép các ứng dụng đó chuyển sang DB2. Điều này
cung cấp cho các khách hàng và các nhà cung cấp khả năng lựa chọn một DBMS đựa theo sự xuất
sắc của nó, chứ không theo lịch sử ứng dụng.
DB2 9.7 bổ sung thêm các tính năng tương thích của Oracle
Để cho phép một ứng dụng được viết cho một RDBMS chạy trên nền khác gần như không cần thay
đổi, nhiều đoạn mã phải nằm đúng vị trí. Các cơ chế khóa, các kiểu dữ liệu, SQL, ngôn ngữ theo
thủ tục khác nhau nằm trên máy chủ và thậm chí cả các giao diện khách hàng được chính ứng
dụng sử dụng cần phải được liên kết không chỉ theo cú pháp, mà còn theo ngữ nghĩa.
Tất cả các bước này đã được thực hiện trong DB2. Các thay đổi là ngoại lệ, không phải là quy luật
(IBM có thể nhanh chóng đánh giá các thay đổi của ứng dụng cần thiết). Bảng 1 cung cấp một tổng
quan ngắn gọn về các tính năng thường được sử dụng:
Bảng 1. Các tính năng thường được sử dụng
Oracle
-->
DB2
Điều khiển tương tranh
-->
Hỗ trợ có sẵn
Phương ngữ SQL
-->
Hỗ trợ có sẵn
PL/SQL
-->
Hỗ trợ có sẵn
Các gói PL/SQL
-->
Hỗ trợ có sẵn
Các gói kèm theo
-->
Hỗ trợ có sẵn
Khách hàng JDBC với các phần mở rộng
-->
Hỗ trợ có sẵn
Kịch bản lệnh SQL*Plus
-->
Hỗ trợ có sẵn
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 2 của 17
ibm.com/developerWorks/vn/
developerWorks®
Với DB2 9.7, bạn không cần chuyển một ứng dụng nữa. Bạn chỉ kích hoạt ứng dụng. Trong trường
hợp của một ứng dụng đóng gói, nó có thể chia sẻ một nguồn cho cả hai DB2 và Oracle.
Nói cách khác, việc cho phép một ứng dụng Oracle chuyển sang DB2 không trở nên phức tạp hơn
việc kích hoạt một Chương trình-C được viết cho HP-UX để chạy trên AIX.
Điều khiển tương tranh
Trong quá khứ, một trong những sự khác biệt nổi bật nhất giữa Oracle và DB2 là cách tiếp cận để
kiểm soát điều khiển tương tranh. Các cụm từ dễ nhớ là: "Những người đọc không cản trở những
người viết và những người viết không cản trở những người đọc".
Bảng 2. Hành vi tương tranh của Oracle
Giao dịch đang chờ xử lý
Giao dịch mới
Hành vi
Người đọc
không ngăn chặn
Người đọc
Người đọc
không ngăn chặn
Người viết
Người viết
không ngăn chặn
Người đọc
Người viết
ngăn chặn
Người viết
Không đi vào chi tiết về các mức cô lập, chỉ cần nói rằng đa số các ứng dụng có sử dụng Sự cô lập
mức câu lệnh (Statement Level Isolation) mặc định của Oracle sẽ chỉ làm việc tốt khi sử dụng mặc
định của DB2 về Sự ổn định của con trỏ (Cursor Stability-CS).
Tuy nhiên, theo truyền thống, CS đã được triển khai sao cho những người viết ngăn chặn những
người đọc và trong một số trường hợp, những người đọc có thể ngăn chặn những người viết. Lý do
là ở chỗ, theo truyền thống, một giao dịch dưới sự cô lập CS sẽ "chờ kết quả" của các thay đổi của
một giao dịch tương tranh đang chờ xử lý.
Bảng 3. Hành vi tương tranh của DB2 truyền thống với CS
Giao dịch đang chờ xử lý
Giao dịch mới
Hành vi
Người đọc
không ngăn chặn
Người đọc
Người đọc
hiếm khi ngăn chặn
Người viết
Người viết
ngăn chặn
Người đọc
Người viết
ngăn chặn
Người viết
Hóa ra là không có lý do ngữ nghĩa nào là tại sao một giao dịch đang chạy dưới sự cách ly CS lại
chờ kết quả khi gặp phải một hàng đã thay đổi. Một hành vi thỏa đáng tương tự là đọc các phiên
bản đã cam kết hiện tại của dòng đã thay đổi.
Hành vi này đã được thực hiện trong DB2 9.7. Điều đã xảy ra là DB2 đơn giản lấy ra phiên bản hiện
đã cam kết hiện tại của một hàng bị khóa từ nhật ký (log). Trong hầu hết các trường hợp chung,
hàng đó vẫn còn nằm trong bộ đệm log do sự thay đổi này vẫn chưa được cam kết. Nhưng ngay cả
khi hàng đã được viết ra và cũng đã bị ghi đè trong bộ đệm log DB2 sẽ biết chính xác tìm nó ở đâu,
để cho một IO sẽ đưa phiên bản mong muốn vào nhóm bộ đệm (bufferpool).
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 3 của 17
developerWorks®
ibm.com/developerWorks/vn/
Hãy tưởng tượng (xem Hình 2) một người dùng đang cập nhật một tên trong một bảng nhân
viên. Trước khi người dùng đó đã cam kết thay đổi, một người dùng khác quét bảng này. Theo
truyền thống, người sử dụng thứ hai sẽ phải đợi cho người sử dụng đầu tiên cam kết hoặc khôi phục
(rollback). Nhờ đọc dữ liệu đã cam kết hiện tại, hoạt động quét của người dùng thứ hai sẽ đơn giản
lấy ra phiên bản của hàng từ bộ đệm log mà nó không chứa các thay đổi của người sử dụng đầu
tiên.
Hình 2. Những người viết không ngăn chặn những người đọc
Điều quan trọng cần lưu ý rằng hành vi này:
• Không đưa vào đối tượng mới nào như là một đoạn khôi phục.
• Không có chi phí hiệu năng nào cho người viết do log cần phải được viết không theo hệ thống.
• Không thể gây ra bất cứ tình hình nào như một "bản chụp quá cũ" vì trong trường hợp không
chắc có xảy ra tệp log cần thiết đã được lưu trữ (trong khi một giao dịch vẫn còn mở!), DB2 chỉ
đơn giản sẽ khôi phục lại và đợi khóa để đi tiếp.
Ngoài những thay đổi này, các kỹ thuật tránh phải thêm khóa đã được đưa vào DB2 để loại bỏ một
người đọc đang nắm giữ một khóa theo chế độ cô lập CS.
Bảng 3. Hành vi tương tranh của DB2 mới với CS
Giao dịch đang chờ xử lý
Giao dịch mới
Hành vi
Người đọc
không ngăn chặn
Người đọc
Người đọc
không ngăn chặn
Người viết
Người viết
không ngăn chặn
Người đọc
Người viết
ngăn chặn
Người viết
Như bạn thấy, các hành vi tương tranh bây giờ giống hệt với các hành vi của Oracle. Thực tế, cơ sở
dữ liệu DB2 vừa mới được tạo ra thể hiện hành vi này theo mặc định.
Các kiểu dữ liệu mới
Tâm điểm của mỗi cơ sở dữ liệu là dữ liệu của nó. Các kiểu không khớp hoặc các ngữ nghĩa của
các kiểu này không khớp có thể tác động đến khả năng cho phép một ứng dụng chuyển sang ứng
dụng RDBMS khác. Do đó để cho phép các ứng dụng Oracle chạy trên DB2, điều quan trọng là
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 4 của 17
ibm.com/developerWorks/vn/
developerWorks®
phải hỗ trợ các kiểu cơ sở không tiêu chuẩn, như là chuỗi, các ngày tháng và các số. Ngoài việc
điều chỉnh các kiểu cơ sở này, có các kiểu khác, phức tạp hơn được sử dụng phổ biến trong PL/SQL
của Oracle, nó đã được thêm vào trong DB2 9.7..
Bảng 5. Các kiểu dữ liệu DB2 mới
Kiểu dữ liệu
Mô tả
NUMBER
Sự hỗ trợ NUMBER và NUMBER (p [, s]) đã được thêm vào dựa trên
DECFLOAT (với bản tăng tốc phần cứng Power6) và số thập phân
(DECIMAL).
VARCHAR2
Hoạt động của kiểu VARCHAR2 bao gồm các chuỗi rỗng đang được
hiểu như là NULL và kéo theo sự đối chiếu phân biệt khoảng trống.
Oracle DATE
Một cơ sở dữ liệu trong chế độ DATE bao gồm thành phần TIME ngoài
ngày tháng của lịch.
TIMESTAMP(n)
Thang đo phân số của giây có thể được chọn bất kỳ giữa 0 (ngày + thời
gian) lên đến 12 (pico giây).
BOOLEAN
Kiểu này có thể được sử dụng trong logic thủ tục, các biến và các tham
số cho các thường trình.
VARRAY
Sự hỗ trợ mảng (ARRAY) trong các thủ tục đã được mở rộng để hỗ trợ
các phương thức kiểu dáng VARRAY và cú pháp.
INDEX BY
Ngoài các mảng thông thường, DB2 cũng hỗ trợ các mảng kết hợp.
ROW TYPE
Kiểu hỗn hợp này có thể được sử dụng trong các biến và các tham số và
như là một phần tử cho các mảng và các mảng kết hợp.
Ref Cursor type
Các con trỏ có thể được gán cho các biến hoặc chuyển qua xung quanh
khi sử dụng các tham số.
Tạo khuôn mẫu ẩn và độ phân giải kiểu
"Nếu nó đi như một con vịt và nó nói như vịt, thì sau đó nó phải là một con vịt".
"Nếu nó đi như một con vịt và nó nói như vịt, thì sau đó nó phải là một con vịt". Đây là câu thần
chú của nhiều ngôn ngữ mới như PHP và Ruby. Mỗi chữ là một chuỗi và sau đó sử dụng như một
kiểu khác dựa vào ngữ cảnh. Trung thành với tiêu chuẩn SQL và đi theo triết lý là sự không khớp
về kiểu có thể là lỗi mã hóa, Theo truyền thống DB2 đã đi theo các quy tắc định kiểu mạnh, mà
các chuỗi và các số không thể được so sánh ở đó, trừ khi các chuỗi và các số này là khuôn mẫu rõ
ràng đối với các chuỗi và các số khác.
Thật không may, khi một ứng dụng Oracle sử dụng cách định kiểu yếu trong SQL của nó, ứng dụng
đó đã quên biên dịch theo DB2 từ trước. Trong DB2 9.7, việc tạo khuôn mẫu ẩn (hay định kiểu yếu)
đã được thêm vào. Đó là, các chuỗi và các con số có thể được so sánh, gán và hoạt động theo một
cách rất linh hoạt.
Ngoài ra, các NULL không định kiểu có thể được sử dụng ở nhiều vị trí, trong khi các dấu tham số
không định kiểu có thể được sử dụng hầu như ở bất kỳ đâu, nhờ việc sẵn sàng làm theo. Đó là, DB2
sẽ không giải quyết kiểu của một dấu tham số cho đến khi nó đã thấy giá trị thực tế đầu tiên.
Để bổ sung thêm việc tạo khuôn mẫu ẩn, DB2 cũng hỗ trợ việc tạo mặc định các tham số thủ tục
cũng như kết hợp các đối số cho các tham số theo tên.
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 5 của 17
developerWorks®
ibm.com/developerWorks/vn/
Thư viện hàm lập sẵn mở rộng trong DB2
Tất cả các RDBMS cung cấp các thư viện của các hàm để hoạt động trên dữ liệu. Vấn đề là không
có hai hàm sử dụng cùng tên, ngay cả khi cuối cùng chức năng là rất giống nhau.
Ngoài việc tập các hàm truyền thống của riêng mình, DB2 bây giờ hỗ trợ một thư viện tương thích
với Oracle. Danh sách sau cung cấp một tổng quan ngắn gọn, chưa phải đầy đủ:
• Hàm biến đổi và hàm khuôn mẫu
• TO_DATE
• TO_CHAR
• TO_CLOB
• TO_NUMBER
• TO_TIMESTAMP
Mỗi một trong các hàm này hỗ trợ một tập phong phú của các chuỗi định dạng tương thích.
• Phép tính số học ngày tháng
• EXTRACT
• ADD_MONTHS
• MONTHS_BETWEEN
• NEXT_DAY
• Cộng (+) thêm phân số của các ngày.
• Thao tác chuỗi
• LPAD
• RPAD
• INSTR
• INITCAP
• Các phần mở rộng cho SUBSTR
• Các đặc tính khác nhau
• NVL
• DECODE
• LEAST
• GREATEST
• BITAND
Sự chồng lấn đã tăng đáng kể trong các hàm được hỗ trợ giữa hai sản phẩm hàm ý một sự thành
công của hộp bên ngoài được cải thiện rất nhiều cho phép một ứng dụng Oracle chuyển sang DB2.
Hỗ trợ phương ngữ Oracle SQL
Bài viết này, cho đến nay, đã trình bày sự tương tranh, các kiểu dữ liệu, định kiểu và các hàm. Tuy
nhiên, các khác biệt giữa Oracle và DB2 vẫn còn tiếp. Các kết cấu thực sự của các phương ngữ
SQL, các từ khóa và các ngữ nghĩa của chúng khác nhau trong một số lĩnh vực. Mỗi sản phẩm
cũng hỗ trợ một số tính năng mà các sản phẩm đơn giản khác không có. Khi các tính năng này là
phổ biến, chúng hạn chế khả năng gửi đi SQL chung đối với cả hai sản phẩm. Trong số nhiều cải
tiến ngôn ngữ nhỏ và lớn, Bảng 6 liệt kê một số điểm nổi bật:
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 6 của 17
ibm.com/developerWorks/vn/
developerWorks®
Bảng 6. Hỗ trợ SQL mới
Tính năng
Mô tả
Đệ qui CONNECT BY
DB2, cho đến nay, đã hỗ trợ một lệnh đệ qui ANSI SQL. Bây
giờ CONNECT BY theo định dạng Oracle đã được thêm, gồm các
hàm khác nhau và các cột giả (pseudocolumns) như LEVEL và
CONNECT_BY_PATH.
Cú pháp (+) join
Cú pháp này thực sự bị Oracle ngăn cản, nhưng có nhiều ứng dụng và
các nhà phát triển những người vẫn còn sử dụng dạng này của cú pháp
OUTER JOIN.
Bảng DUAL
Một bảng một hàng, một cột đã sử dụng khắp nơi trong các ứng dụng
Oracle như là một bù nhìn (dummy).
Các cột giả ROWNUM
Cột giả này thường được sử dụng để hạn chế số lượng các hàng trả về và
để đếm các hàng trong một tập kết quả.
Các cột giả ROWID
Các Rowid được sử dụng để nhanh chóng lấy ra một hàng mà trước đây
đã tìm thấy dựa theo địa chỉ vật lý của nó.
Phép toán SQL MINUS
Trong Oracle, MINUS (Trừ) được sử dụng thay cho EXCEPT (Loại ra) để
một tập kết quả trừ đi tập khác.
SELECT INTO FOR UPDATE
Cấu trúc FOR UPDATE trên SELECT INTO cho phép trích ra một hàng
khỏi DB2 với mục đích để sửa đổi nó sau này mà không cần sử dụng
một con trỏ.
PUBLIC SYNONYM
Một từ đồng nghĩa chung là một bí danh mà không có một tên lược đồ.
DB2 hỗ trợ các từ đồng nghĩa chung cho các đối tượng bảng, các trình
tự và các gói PL/SQL.
CREATE TEMPORARY TABLE
DB2 hỗ trợ các bảng tạm thời toàn cầu được tạo ra ngoài các bảng toàn
cầu tạm thời được khai báo.
Câu lệnh bảng TRUNCATE
Câu lệnh này nhanh chóng xóa các nội dung của một bảng toàn bộ mà
không thực hiện các bộ kích hoạt.
Độ phân giải tên tự nhiên
DB2 9.7 không yêu cầu các khung nhìn nội tuyến. Ngoài ra, các tên cột
có thể dễ dàng thừa kế từ các toán tử set (tập hợp) như UNION.
Điều này hoàn thành tổng quan về các thay đổi được thực hiện với DB2 để cho các ứng dụng
Oracle gửi đi SQL dựa vào cơ sở dữ liệu có thể chạy hầu như không thay đổi. Tuy nhiên, có các
phần chính của nhiều ứng dụng đang thực hiện tại chính máy chủ. Ngôn ngữ lựa chọn phía máy chủ
cho các ứng dụng Oracle là PL/SQL. Không có sự khẳng định nào về tính tương thích có thể được
thực hiện nghiêm túc mà không có sự hỗ trợ cho PL/SQL.
DB2 hỗ trợ cho PL/SQL
Thông thường, khi một ứng dụng đang được chuyển từ một sản phẩm này sang một sản phẩm
khác, ngôn ngữ SQL và ngôn ngữ thủ tục được dịch từ một phương ngữ SQL sang phương ngữ
khác. Điều này đặt ra một số vấn đề:
• Mã dịch kết quả có xu hướng rắc rối do tự động hóa và sự không phối hợp đồng bộ giữa
phương ngữ nguồn và phương ngữ đích.
• Các nhà phát triển ứng dụng không quen thuộc với phương ngữ SQL đích. Điều đó làm cho nó
khó gỡ rối mã đã gửi đi. Theo thời gian, việc bảo trì tiếp theo trở thành một sự thách thức do
sự thiếu các kỹ năng.
• Trong trường hợp của các ứng dụng đóng gói, việc dịch cần phải được lặp lại cho mỗi bản phát
hành mới của ứng dụng.
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 7 của 17
developerWorks®
ibm.com/developerWorks/vn/
• Cuối cùng, kết quả là một bản mô phỏng, theo định nghĩa thì nó chạy chậm hơn so với bản ban
đầu.
Để tránh những vấn đề này, DB2 9.7 có hỗ trợ PL/SQL riêng. Điều này có nghĩa là gì?
Như bạn thấy trong Hình 3, máy DB2 bây giờ gồm một trình dịch PL/SQL bên cạnh trình biên
dịch SQL PL. Cả hai trình biên dịch tạo mã máy ảo cho Máy chạy thực thống nhất SQL (Unified
Runtime Engine) của DB2. Điều quan trọng cần lưu ý là các công cụ theo dõi và phát triển như
Optim Development Studio được gắn vào trong DB2 ở mức máy chạy thời gian thực.
Hình 3. Hỗ trợ trình biên dịch PL/SQL
Sự tích hợp của PL/SQL vào trong DB2 như là một ngôn ngữ thủ tục lớp đầu tiên có nhiều hàm ý:
• Không phải dịch. Mã nguồn vẫn giữ nguyên như nó đang có trong danh mục lược đồ.
• Các nhà phát triển có thể tiếp tục làm việc theo ngôn ngữ mà họ đã quen thuộc. Không có
nhu cầu nào để di chuyển logic sang phương ngữ của DB2 thậm chí nếu logic mới được viết
bằng SQL PL. Các thường trình sử dụng các phương ngữ khác nhau có thể gọi cho nhau.
• Các nhà cung cấp ứng dụng đóng gói có thể sử dụng một mã nguồn dựa vào cả Oracle lẫn
DB2.
• Cả PL/SQL và SQL PL đều đưa ra mã máy ảo như nhau cho SQL Unified Runtime Engine của
DB2. Do đó, theo thiết kế, cả PL/SQL lẫn SQL PL thực hiện ở cùng một tốc độ.
• Do hạ tầng của trình gỡ rối gắn trực tiếp vào SQL Unified Runtime Engine, nên PL/SQL được
hỗ trợ tự nhiên bởi Optim Development Studio.
Hình 4 minh hoạ một phiên gỡ rối PL/SQL. Trình gỡ rối này hỗ trợ các tính năng tiêu chuẩn như
bước vào, bước ra và các điểm ngắt (breakpoint). Ngoài ra, nó cho phép người dùng thay đổi các
biến PL/SQL tại chỗ trong khi chương trình đang chạy.
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 8 của 17
ibm.com/developerWorks/vn/
developerWorks®
Hình 4. Hỗ trợ trình gỡ rối PL/SQL trong DB2
Các chi tiết cú pháp PL/SQL
Vì vậy, sự hỗ trợ PL/SQL muốn nói chính xác điều gì? Trước tiên, có sự hỗ trợ cú pháp cốt lõi. DB2
hỗ trợ tất cả các cấu trúc chung của PL/SQL, chẳng hạn như:
•
•
•
•
•
•
•
•
nếu thì, ngược lại (if then else).
các vòng lặp while.
:= phép gán.
các biến và hằng cục bộ.
#PRAGMA EXCEPTION và xử lý các trường hợp ngoại lệ.
Các dạng khác nhau cho các vòng lặp (phạm vi, con trỏ và truy vấn).
%TYPE and %ROWTYPE giữ chặt các biến và các tham số cho các đối tượng khác.
Các giao dịch #PRAGMA AUTONOMOUS, cho phép các thủ tục nào thực thi trong một giao
dịch riêng.
Hỗ trợ đối tượng PL/SQL
Có thể sử dụng PL/SQL trong các đối tượng khác nhau cho phép logic thủ tục:
• Các hàm vô hướng.
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 9 của 17
developerWorks®
•
•
•
•
•
ibm.com/developerWorks/vn/
Trước các bộ kích hoạt của mỗi hàng.
Sau các bộ kích hoạt của mỗi hàng.
Các thủ tục.
Các khối ẩn danh.
Các gói PL/SQL.
Hỗ trợ các gói PL/SQL
Hầu hết PL/SQL trong các ứng dụng Oracle được chứa trong cái gọi là Các gói (PACKAGE). Một
gói PL/SQL —không lẫn với một gói DB2— là một bộ sưu tập của các đối tượng riêng với khả năng
phân biệt giữa các đối tượng có thể truy cập bên ngoài và những đối tượng chỉ là các trình trợ giúp
để sử dụng bên trong gói. ANSI SQL tương đương với một gói được gọi là MODULE. Bây giờ DB2
cung cấp hỗ trợ cho các mô đun SQL ANSI cũng như các gói PL/SQL. Đặc biệt, cung cấp các khả
năng sau đây:
• GÓI TẠO [HOẶC THAY THẾ] (CREATE [OR REPLACE] PACKAGE), xác định các mẫu ban
đầu cho các thường trình nhìn thấy bên ngoài. Nó cũng xác định tất cả các đối tượng không
theo thủ tục, nhìn thấy bên ngoài, như các biến và các kiểu.
• THÂN GÓI TẠO [HOẶC THAY THẾ] (CREATE [OR REPLACE] PACKAGE BODY), triển khai
thực hiện tất cả các thường trình riêng và chung cũng như tất cả các đối tượng riêng khác.
• Trong một gói hoặc thân gói, các đối tượng sau đây có thể được định nghĩa:
• Các biến và các hằng số.
• Các kiểu dữ liệu.
• Các ngoại lệ.
• Các hàm vô hướng.
• Các thủ tục.
• Các con trỏ.
• Khởi tạo gói.
• Các từ đồng nghĩa chung trên các gói.
DB2 cung cấp các gói lập sẵn phổ biến
Một số các ứng dụng Oracle sử dụng các gói do RDBMS cung cấp. Đặc biệt, các thư viện cung cấp
việc tạo báo cáo, e-mail hoặc truyền thông chéo có thể rất phổ biến. Để tạo điều kiện hỗ trợ các
ứng dụng này cho DB2, DB2 cung cấp các gói được liệt kê trong Bảng 7:
Bảng 7. DB2 cung cấp các gói kèm theo
Gói
Mô tả
DBMS_OUTPUT
Cung cấp các khả năng lập báo cáo cơ bản có thể bật hoặc tắt từ dòng
lệnh.
UTL_FILE
Một mô-đun cho phép làm việc với các tệp trên máy chủ DB2.
DBMS_SQL
Một gói cung cấp một SQL API để thực hiện SQL động ngoài các câu
lệnh hiện có EXECUTE và EXECUTE IMMEDIATE.
UTL_MAIL
Một mô-đun cho phép gửi các thông báo e-mail từ SQL.
UTL_SMTP
Một mức API thấp hơn tương tự như UTL_MAIL tạo ra sự tích hợp
SMTP.
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 10 của 17
ibm.com/developerWorks/vn/
developerWorks®
DBMS_ALERT
Một gói, khi được sử dụng, cho phép các phiên làm việc khác nhau
truyền tin bằng cờ hiệu với nhau.
DBMS_PIPE
Một mô-đun cho phép các phiên làm việc gửi từng dữ liệu khác nhau.
DBMS_JOB
Cung cấp một API tương thích tích hợp với bộ xếp lịch các nhiệm vụ của
DB2.
DBMS_LOB
Một API của Oracle để xử lý LOB báo hiệu các hàm LOB lập sẵn của
DB2.
DBMS_UTILITY
Một bộ sưu tập các thủ tục khác nhau được sử dụng trong các ứng
dụng.
Các phần mở rộng JDBC cho riêng Oracle
JDBC là một giao diện khách hàng Java chuẩn. Tuy nhiên, có các phần mở rộng đã được thêm vào
trình điều khiển JDBC của Oracle để hỗ trợ các kiểu dữ liệu không theo tiêu chuẩn riêng.
Để tối đa hóa mức độ tương thích với các ứng dụng dựa trên công nghệ Java, trình điều khiển DB2
9.7 JDBC cung cấp cùng với vài thứ khác, sự hỗ trợ cho các thủ tục gọi với con trỏ tham chiếu và
các tham số VARRAY.
Sự hỗ trợ của kịch bản lệnh SQL*Plus khi sử dụng CLPPlus
Đôi khi các kịch bản lệnh DDL và ngay cả các báo cáo được viết bằng cách sử dụng bộ xử lý dòng
lệnh SQL*Plus. Để thuận tiện cho việc chuyển các kịch bản lệnh này cũng như các kỹ năng của
người phát triển đang viết chúng, DB2 cung cấp một bộ xử lý dòng lệnh tương thích-SQL*Plus,
được gọi là CLPPlus. Công cụ này có các chức năng sau:
•
•
•
•
•
Các tuỳ chọn lệnh tương thích-SQL*Plus.
Thay thế biến.
Tạo định dạng cột.
Các hàm lập báo cáo.
Các biến điều khiển.
Hình 5. Công cụ CLPLus tương thích-SQL*Plus
Cho phép DB2 kéo và thả càng dễ dàng càng tốt
Do sự liên kết chặt chẽ của DB2 với PL/SQL và Oracle SQL, bây giờ không cần thiết có một bộ
công cụ chuyển dịch phức tạp. Thay vào đó, bạn có thể sử dụng Công cụ dịch chuyển dữ liệu của
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 11 của 17
developerWorks®
ibm.com/developerWorks/vn/
IBM (IBM Data Movement Tool) để đơn giản kéo và thả các bảng, các gói hoặc toàn bộ các lược
đồ từ Oracle sang DB2. Chỉ cần các điều chỉnh tối thiểu trên cơ sở ngoại lệ hoặc di chuyển một ứng
dụng sang DB2, hoặc sửa đổi một ứng dụng sao cho cùng một nguồn có thể hoạt động dựa vào cả
DB2 và cả Oracle.
Các bước có thể đơn giản như:
1. Thiết lập các biến đăng ký cần thiết:
• db2set DB2_COMPATIBILITY_VECTOR=ORA
• db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
2. Khởi động lại trình quản lý cơ sở dữ liệu:
• db2stop
• db2start
3. Tạo ra một cơ sở dữ liệu tương thích-Oracle:
• db2 create database mydb pagesize 32 K
• db2 update db cfg for mydb using auto_reval deferred_force
4. Khởi động IBM Data Movement Tool và kết nối vào cơ sở dữ liệu Oracle và DB2 (xem Hình 6).
Một khi kết nối được thiết lập, bạn có thể chọn lấy ra chỉ DDL hoặc cả hai DDL và dữ liệu. Cuối
cùng, bạn có hai lựa chọn: hoặc bạn triển khai trực tiếp bằng cách thực hiện các kịch bản lệnh
đã tạo ra hoặc bạn tiếp tục với ô triển khai tương tác. (Cái sau được khuyến cáo cho hầu hết
các ứng dụng không quan trọng).
Hình 6. Kéo và thả các lược đồ Oracle vào DB2 khi sử dụng IBM Data
Movement Tool
5. Di chuyển các lược đồ dự kiến từ Oracle sang DB2 khi sử dụng triển khai tương tác (xem Hình
7). Trong chế độ triển khai tương tác, bạn thấy một cây-dẫn hướng (nav-tree) hiển thị tất cả
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 12 của 17
ibm.com/developerWorks/vn/
developerWorks®
các đối tượng được trích ra từ cơ sở dữ liệu Oracle. Chọn tất cả các đối tượng và thực hiện
tùy chọn trình đơn triển khai. Kết quả là, công cụ sẽ sao chép các đối tượng qua DB2 và ghi
lại sự phát triển của nó. Một số đối tượng có thể không triển khai thành công và công cụ này
cho phép bạn tùy chọn để làm việc với những đối tượng đó. Khi lựa chọn một đối tượng, bạn sẽ
thấy DDL cùng với lỗi DB2 gặp phải. Lúc này bạn có thể sửa định nghĩa khi cần và triển khai lại
bằng cách sử dụng trình soạn thảo lập sẵn. Mục đích là để chuyển dịch tương tác tất cả các đối
tượng sang DB2 trên một cơ sở ngoại lệ.
Hình 7. Kéo và thả các lược đồ Oracle vào DB2 khi sử dụng IBM Data
Movement Tool
Đánh giá sự hỗ trợ cho DB2
Để cho phép ứng dụng của bạn chuyển sang DB2 9.7 dễ dàng vậy sao? Câu trả lời đương nhiên là,
còn tùy. IBM có một công cụ bên trong có tên là MEET DB2, có thể phân tích tất cả các đối tượng
trong cơ sở dữ liệu Oracle của bạn và cho điểm nó. Nó tạo một báo cáo về cái sẽ thực hiện và nơi
cần điều chỉnh. Đại diện tài khoản IBM của bạn hoặc đầu mối bán hàng có thể chạy tiện ích này để
giúp cung cấp nhanh chóng một đánh giá về khả năng tương thích của cơ sở dữ liệu Oracle hiện tại
của bạn với DB2.
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 13 của 17
developerWorks®
ibm.com/developerWorks/vn/
Hình 8. Công cụ báo cáo MEET DB2 cho việc đánh giá
Trong giai đoạn thử nghiệm beta một năm của bản DB2 9.7, nhiều ứng dụng với hơn 750.000 dòng
mã PL/SQL đã được phân tích chi tiết với tỷ lệ chuyển đổi sử dụng được ngay trung bình là 90 đến
99%.
Hình 9. Tỷ lệ trung bình 98% cho các câu lệnh được hỗ trợ
Các hạn chế
PL/SQL, thư viện gói kèm theo và CLPPlus hiện nay không có sẵn cho DB2Express, DB2 ExpressC và DB2 Personal Editions (các ấn bản dành cho DB2 cá nhân).
Tóm tắt
Nhờ trợ giúp của SQL nhiều phương ngữ vốn có, DB2 9.7 cho phép hỗ trợ dễ dàng các ứng dụng
Oracle chuyển sang DB2. Các nhà cung cấp các ứng dụng đóng gói có thể đưa ra các ứng dụng
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 14 của 17
ibm.com/developerWorks/vn/
developerWorks®
của họ trên cả Oracle lẫn DB2 với chi phí phát sinh tối thiểu. Các khách hàng có thể tự do lựa chọn
nhà cung cấp công nghệ họ cần, mà không bị hạn chế bởi các sự lựa chọn trong quá khứ.
Để thử nghiệm các tính năng này, bạn có thể tải về một phiên bản dùng thử của DB2 9.7 (xem Tài
nguyên).
Câu hỏi thường gặp
Phiên bản nào của Oracle có hỗ trợ DB2 9.7?
Mức độ bao phủ được tạo ra cho các phương ngữ SQL và PL/SQL hoàn toàn dựa vào những gì
đang được các ứng dụng sử dụng. Có những tính năng đã được giới thiệu trong các bản phát hành
gần đây như là Oracle 11g được hỗ trợ, trong khi một số cấu trúc có sẵn trong Oracle 8i không được
hỗ trợ. Trong một nghiên cứu về 18 ứng dụng tổng cộng có trên 750,000 dòng, 90 đến 99% mã
được chuyển sang DB2 mà không thay đổi. Nhiều việc điều chỉnh còn lại có thể được thực hiện tự
động hoặc nếu không thì bằng tay.
Ứng dụng Oracle của tôi sẽ chạy trên DB2 nhanh như thế nào?
Đó là câu hỏi đáng giá triệu đô la! Thật không may, các điều khoản cấp phép của Oracle cấm bất
cứ ai công bố kết quả thử nghiệm khi chưa được sự đồng ý trước bằng văn bản. Khỏi cần phải nói,
chúng tôi đã không bận tâm phải hỏi. Tuy nhiên, bằng cách thiết kế riêng của mình và được xác
nhận bằng việc kiểm tra so sánh bảo đảm chất lượng , một ứng dụng được viết dựa vào PL/SQL
trên DB2 cũng nhanh như một ứng dụng được viết dựa vào SQL PL trên DB2. Các nhà cung cấp,
những người đã qua qui trình hỗ trợ này đã ngạc nhiên vui vẻ.
Nó đã cung cấp các tính năng này cho bao nhiêu công việc?
Không giống nhiều như người ta có thể nghĩ. Một số công việc khởi đầu, như CONNECT BY và NUMBER,
đã làm việc với DB2 9.5 theo kiểu chiến thuật. Một cách nghiêm túc, nỗ lực này đã được hoàn
thành trong vòng ít hơn 18 tháng.
Những khó khăn chung trong việc cho phép chuyển từ Oracle sang DB2 là gì?
Tính tương thích của DB2 không rõ ràng 100%. Như vậy có khả năng sẽ có một số trục trặc khi lần
đầu tiên bạn chuyển sang DB2. Tất nhiên, nhiều khó khăn không quan trọng và dễ dàng sửa chữa.
Ví dụ, DB2 hỗ trợ các bộ kích hoạt PL/SQL, nhưng không cho phép kết hợp các hành động của bộ
kích hoạt. Đó là, một bộ kích hoạt được chia sẻ cho các hoạt động UPDATE, DELETE và INSERT. Bây
giờ, hãy đưa ra một bộ kích hoạt nhiều hoạt động PL/SQL, thật khá dễ dàng để sao chép nó thành
ba bộ kích hoạt DB2 PL/SQL khi sử dụng một biến boolean để INSERTED, UPDATED và DELETED.
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 15 của 17
developerWorks®
ibm.com/developerWorks/vn/
Tài nguyên
Học tập
• Khởi chạy DB2 9.7: Nhận một tổng quan về các giá trị của DB2.
• Trò chuyện với phòng thí nghiệm: Hãy nghe và xem các video về các chủ đề như là việc đi sâu
vào kỹ thuật DB2 9.7 và một phiên bản webcast của bài viết này.
• "Chuyển sang DB2 dễ dàng" (youTube): Thực hiện theo một trình diễn video về tổng quan của
hỗ trợ ứng dụng DB2.
• "DB2 9.7 CLPPlus" (youTube): Một video nào trình diễn cách sử dụng của trình tiện ích shell
CLPPlus tương thích-SQL *Plus.
• "DB2 9.7: Hỗ trợ PL/SQL riêng" (youTube): Xem một đoạn video ngắn giới thiệu nhiều tính
năng PL/SQL được DB2 9.7 hỗ trợ.
• "Break Free with IBM DB2 9.7" (youTube): Xem một video về nhiều khách hàng và các giấy
chứng nhận của đối tác.
• Vùng Quản lý thông tin của developerWorks: Tìm hiểu thêm về Quản lý thông tin. Tìm tài liệu
hướng dẫn kỹ thuật, các bài báo hướng dẫn, giáo dục, tải, thông tin sản phẩm và nhiều hơn
nữa.
• Theo sát các sự kiện kỹ thuật và webcast của developerWorks.
Lấy sản phẩm và công nghệ
• DB2 9.7 for Linux, Unix, and Windows: Tải về một phiên bản dùng thử miễn phí của DB2 9.7
cho Linux, Unix và Windows.
• DB2 Express-C 9.7: Tải bản DB2 Express-C 9.7, một phiên bản miễn phí của máy chủ cơ sở
dữ liệu Express DB2 cho cộng đồng.
• Xây dựng các dự án phát triển tiếp theo của bạn với phần mềm dùng thử IBM, có sẵn để tải về
trực tiếp từ developerWorks.
Thảo luận
• Tham gia vào developerWorks blogs và dành tâm trí cho cộng đồng developerWorks của tôi;
với hồ sơ cá nhân của bạn và trang chủ tuỳ chỉnh, bạn có thể tùy chỉnh developerWorks theo ý
thích và tương tác với những người dùng developerWorks khác.
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 16 của 17
ibm.com/developerWorks/vn/
developerWorks®
Đôi nét về tác giả
Serge Rielau
Serge Rielau đã làm việc với DB2 về trình biên dịch SQL Linux, Unix và Window trong
12 năm. Hiện nay, ông là kiến trúc sư cho DB2 về SQL trên Linux, UNIX và Windows.
Ông là kiến trúc sư chịu trách nhiệm về tính tương thích của SQL với DB2 9.7. Có thể
liên lạc với Serge tại comp.databases.ibm-DB2.
© Copyright IBM Corporation 2009
(www.ibm.com/legal/copytrade.shtml)
Nhẫn hiệu đăng ký
(www.ibm.com/developerworks/vn/ibm/trademarks/)
DB2 9.7: Chạy các ứng dụng Oracle trên DB2 9.7 cho Linux, UNIX
và Windows
Trang 17 của 17