Anh em có cơ hội làm việc với hệ cơ sở dữ liệu Oracle sẽ không còn lạ lẫm gì với PL/SQL. Nhưng kiến trúc cụ thể của PLSQL là gì?. PLSQL có ưu nhược điểm gì không?
Bài viết dành cho anh em mới tập tành sử dụng PLSQL nhưng cũng vô cùng bổ ích cho anh em đã có thời gian dài sử dụng.

1. PL/SQL là gì?
Về SQL thì anh em không còn lạ lẫm gì. SQL là viết tắt của Structural Query Language (ngôn ngữ truy vấn có cấu trúc). Vậy PL trong PL/SQL là gì?.
PL ở đây là Procedural Language extensions (phần mở rộng ngôn ngữ thủ tục). Bản thân SQL là cách thức giao tiếp chuẩn để làm việc với các hệ cơ sở dữ liệu RDBMS.
PL/SQL là thành phần mở rộng thêm. Thành phần này giúp khắc phục một số hạn chế của SQL, bênh cạnh đó PL/SQL cũng cung cấp các giải pháp ngôn ngữ lập trình toàn diện hơn giúp xây dựng các ứng dụng dựa trên hệ cơ sở dữ liệu Oracle.

Chính bởi mục đích khắc phục một số hạn chế cố hữu của SQL nên PL/SQL là một ngôn ngữ bậc cao. Anh em có thể xem nó như là một ngôn ngữ lập trình.

2. Đôi điều lưu ý về PL/SQL
Sau khi đã nắm được PL/SQL là phần mở rộng hơn của SQL, sử dụng để giao tiếp với hệ cơ sở dữ liệu Oracle. Tiếp theo đây sẽ là một vài lưu ý nhỏ cho anh em khi sử dụng PL/SQL
2.1 Embedded language – Ngôn ngữ nhúng
PL/SQL là ngôn ngữ nhúng, bản thân nó chỉ có thể thực thi trong hệ cơ sở dữ liệu Oracle. Do không thể hoạt động độc lập, anh em đừng nhầm lẫn nó với các ngôn ngữ lập trình khác như Java, C++.
Cũng chính vì phụ thuộc vào hệ cơ sở dữ liệu Oracle nên anh em khi sử dụng RDBMS khác như Postgres hay Maria, PL SQL lúc đó không có ý nghĩa gì nữa đâu nha.

2.2 Hiệu suất cao
Bản thân PLSQL là ngôn ngữ sinh ra để giao tiếp với hệ cơ sở dữ liệu. Nên so về hiệu suất, ở đây chưa bàn tới hiệu suất thực thi vì nó phụ thuộc vào hệ cơ sở dữ liệu.
Nếu chỉ so sánh về hiệu suất cách viết, độ dễ để viết thì PL/SQL hơn hẳn các ngôn ngữ khác như Java, Python, C++. Mặc dù các ngôn ngữ này đều có thể thao tác với hệ cơ sở dữ liệu thông qua ODBC.
Ngoài ra, nếu nói về hiệu suất, PLSQL cung cấp FORALL, sử dụng FORALL sẽ mang lại hiệu suất tốt hơn so với việc thao tác bằng các ngôn ngữ khác.

The
Câu lệnh forall đưa ra một loạt câu lệnh INSERT, UPDATE hoặc DELETE, thường nhanh hơn nhiều so với vòng lặp for tương đươngFORALL
statement issues a series ofINSERT
,UPDATE
, orDELETE
statements, usually much faster than an equivalentFOR
loop.
3. Kiến trúc PL/SQL
Sơ bộ anh em có thể hình dung PL/SQL là ngôn ngữ hỗ trợ nằm ngoài Oracle, bằng cách nào đó ngôn ngữ viết bằng PLSQL có thể được dịch ra thành SQL để thực thi ở hệ cơ sở dữ liệu Oracle.
Vậy cụ thể kiến trúc PLSQL như thế nào?

Theo như hình kiến trúc phía trên, PLSQL sẽ chịu trách nhiệm biên dịch code anh em viết thành byte-code. Một đoạn code từ PLSQL block được gửi tới PLSQL Engine, đoạn code sẽ được biên dịch và thực thi ở Oracle Database Server.
4. Ưu nhược điểm của PL/SQL
4.1 Ưu điểm
- PLSQL cung cấp hiệu suất tốt hơn (cái này trong một vài trường hợp cụ thể thôi nha, không phải lúc nào cũng thế)
- PLSQL hỗ trợ Object-Oriented Programming concepts (nguyên lý lập trình hướng đối tượng), cho phép kế thừa, …) cái này tiện lợi cho anh em lập trình đã nắm vững nguyên lý OOP.
- PLSQL hỗ trợ nhiều công cụ phát triển Web (Web application)
4.2 Nhược điểm
- Cái này thì chắc là xưa cũ rồi vì giờ máy anh em nào cũng mạnh. PLSQL cần bộ nhớ nhiều (chạy tốn ram khá là khủng khiếp nha)
- Ở các procedures thì tính năng debug không có, viết ra anh em phải debug bằng mắt chứ PLSQL không hỗ trợ.
5. Ví dụ
Giải thích rồi, kiến trúc rồi. Giờ tới lúc cho anh em ví dụ về PLSQL nha. Vì PLSQL ở trên đã nói với anh em là giống như ngôn ngữ lập trình nên có một vài cú pháp anh em bắt buộc phải theo nha
Ví dụ như := là gán, 1..10 là từ 1 tới 10. Kết thúc vòng lặp thì phải là END LOOP.
-- available online in file 'sample1' // Khai báo biến x bằng 100 DECLARE x NUMBER := 100; BEGIN // Lặp i từ 1 tới 10 FOR i IN 1..10 LOOP // Nếu i chia hết cho 2, i là số chẵn IF MOD(i,2) = 0 THEN -- i is even // Thêm vào bảng tạm 1 dòng với cột thứ 3 kiểu chuỗi nói rằng i là số chẵn INSERT INTO temp VALUES (i, x, 'i is even'); ELSE // Ngược lại thì cũng insert một dòng như i là số lẻ INSERT INTO temp VALUES (i, x, 'i is odd'); END IF; // Tăng giá trị x thêm 100 x := x + 100; END LOOP; // Chạy hết tất cả trong vòng for rồi insert một lượt vào DB, kiểu thực hiện toàn bộ câu iinssert một lần COMMIT; END;
6. Tham khảo
Cảm ơn anh em đã dành thời gian – Thank you for your time – Happy coding!