Skip to Main Content
☕ Ủng hộ cafe

☕ Mời mình một ly cafe

Nếu tài liệu này hữu ích, bạn có thể ủng hộ mình một ly cafe để mình có thêm động lực viết tiếp ❤️

QR Support
Ngân hàng: VC Bank
Chủ tài khoản: DO KHAC LAM
Số tài khoản: 7906077097
Nội dung: Ung ho Dokhala
Cảm ơn bạn đã ủng hộ Dokhala 🙏
💬 Liên hệ

💬 Kết nối với mình

Bạn cần hỏi thêm về Oracle APEX, góp ý nội dung, hoặc muốn trao đổi dự án? Có thể nhắn mình qua các kênh dưới đây.

← Quay lại bài viết

Khi nào dùng PL/SQL Process và khi nào dùng Dynamic Action trong Oracle APEX?

Tìm hiểu sự khác nhau giữa PL/SQL Process và Dynamic Action trong Oracle APEX, khi nào nên dùng cho xử lý UI, khi nào nên dùng cho logic server-side, validation, transaction và thao tác dữ liệu.

Khi phát triển ứng dụng Oracle APEX, có hai nơi rất phổ biến để viết logic: Dynamic ActionPL/SQL Process. Cả hai đều có thể chạy logic, thậm chí Dynamic Action cũng có thể gọi PL/SQL phía server. Vì vậy, người mới học APEX rất dễ phân vân: nên xử lý ở đâu cho đúng?

Câu trả lời ngắn gọn là: Dynamic Action phù hợp cho hành vi giao diện và phản hồi tức thì, còn PL/SQL Process phù hợp cho xử lý nghiệp vụ, lưu dữ liệu, transaction và các logic cần chạy chắc chắn ở phía server.

Bài viết này tập trung vào cách phân biệt khi nào nên dùng Dynamic Action và khi nào nên dùng PL/SQL Process trong Oracle APEX. Nội dung được trình bày theo hướng thực tế, giúp bạn đặt logic đúng chỗ: phần nào thuộc giao diện, phần nào thuộc server-side, phần nào cần transaction, validation, bảo mật và xử lý dữ liệu chắc chắn.

Dynamic Action là gì?

Dynamic Action là cơ chế khai báo hành vi tương tác trong APEX. Thay vì phải tự viết nhiều JavaScript, bạn có thể cấu hình trong Page Designer để khi một sự kiện xảy ra thì APEX thực hiện một hoặc nhiều action.

Ví dụ:

  • Khi người dùng thay đổi giá trị item, tự động show/hide region.
  • Khi chọn checkbox, enable hoặc disable một field.
  • Khi chọn khách hàng, tự động set giá trị địa chỉ hoặc số điện thoại.
  • Khi click button, refresh report hoặc mở dialog.
  • Khi thay đổi LOV, gọi PL/SQL để tính toán và trả kết quả về page item.
Dynamic Action trong Oracle APEX Page Designer
Dynamic Action thường dùng cho các tương tác UI như show/hide, set value, refresh region hoặc gọi AJAX.

Dynamic Action rất mạnh vì nó giúp app phản hồi nhanh hơn. Người dùng không cần submit toàn bộ page chỉ để thay đổi một vài thành phần giao diện.

PL/SQL Process là gì?

PL/SQL Process là logic chạy phía server, thường được thực thi trong quá trình page submit, trước hoặc sau khi APEX xử lý dữ liệu. Đây là nơi phù hợp để xử lý các tác vụ quan trọng liên quan đến database.

Ví dụ:

  • Lưu dữ liệu vào bảng.
  • Gọi package nghiệp vụ.
  • Tạo đơn hàng, hóa đơn, phiếu nhập kho.
  • Cập nhật nhiều bảng trong cùng một transaction.
  • Gửi email sau khi lưu thành công.
  • Ghi audit log.
  • Gọi API tích hợp với hệ thống khác.
PL/SQL Process trong Oracle APEX Page Designer
PL/SQL Process phù hợp cho logic server-side, lưu dữ liệu, transaction và xử lý nghiệp vụ quan trọng.

Nếu logic ảnh hưởng đến dữ liệu thật, bảo mật, transaction hoặc trạng thái nghiệp vụ, bạn nên ưu tiên xử lý bằng PL/SQL Process hoặc package PL/SQL phía server.

Sự khác nhau cốt lõi

Sự khác nhau quan trọng nhất nằm ở vị trí thực thi và mục đích sử dụng.

  • Dynamic Action: tập trung vào hành vi phía browser và trải nghiệm người dùng.
  • PL/SQL Process: tập trung vào xử lý phía server, dữ liệu và nghiệp vụ.

Dynamic Action giúp màn hình linh hoạt hơn. PL/SQL Process giúp hệ thống an toàn, nhất quán và đáng tin cậy hơn.

Khi nào nên dùng Dynamic Action?

Bạn nên dùng Dynamic Action khi logic chủ yếu liên quan đến giao diện hoặc cần phản hồi ngay trên màn hình.

Các trường hợp phù hợp:

  • Show/hide item hoặc region theo lựa chọn của người dùng.
  • Enable/disable field.
  • Set value cho page item dựa trên item khác.
  • Refresh report, chart hoặc region.
  • Mở hoặc đóng dialog.
  • Hiển thị thông báo nhỏ trên giao diện.
  • Gọi PL/SQL ngắn để tính toán tức thì.

Ví dụ, nếu người dùng chọn loại khách hàng là “Công ty”, bạn muốn hiển thị thêm field mã số thuế. Đây là tình huống rất phù hợp với Dynamic Action.

Event: Change
Selection Type: Item
Item: P10_CUSTOMER_TYPE

True Action:
Show
Affected Element: P10_TAX_CODE

Logic này không cần submit page, không cần transaction và không ảnh hưởng trực tiếp đến database.

Khi nào nên dùng PL/SQL Process?

Bạn nên dùng PL/SQL Process khi logic cần chạy trên server và có liên quan đến dữ liệu, bảo mật hoặc transaction.

Các trường hợp phù hợp:

  • Lưu dữ liệu chính thức.
  • Insert, update, delete nhiều bảng.
  • Gọi package nghiệp vụ.
  • Kiểm tra quyền trước khi xử lý.
  • Thực hiện validation quan trọng.
  • Gửi email hoặc notification sau khi transaction thành công.
  • Gọi integration API.
  • Ghi audit log.

Ví dụ, khi người dùng bấm nút “Submit Order”, bạn không nên chỉ dùng Dynamic Action phía client để xử lý đơn hàng. Thay vào đó, button nên submit page và PL/SQL Process gọi package nghiệp vụ:

begin
  order_pkg.submit_order(
    p_order_id => :P20_ORDER_ID,
    p_user     => :APP_USER
  );
end;

Bên trong package, bạn có thể kiểm tra quyền, kiểm tra trạng thái đơn hàng, cập nhật nhiều bảng, ghi log và raise error nếu có vấn đề.

Có nên chạy PL/SQL trong Dynamic Action không?

Có, nhưng cần dùng đúng mục đích. Dynamic Action có action Execute Server-side Code, cho phép gọi PL/SQL qua AJAX mà không submit toàn bộ page.

Cách này rất hữu ích cho các tác vụ nhỏ:

  • Tính tổng tiền khi người dùng thay đổi số lượng hoặc đơn giá.
  • Lấy thông tin khách hàng sau khi chọn mã khách hàng.
  • Kiểm tra nhanh mã coupon.
  • Refresh dữ liệu phụ thuộc trên màn hình.

Nhưng không nên dùng Dynamic Action cho các xử lý dài, phức tạp hoặc có transaction quan trọng. Một lưu ý quan trọng khi gọi PL/SQL từ Dynamic Action là các page item dùng trong PL/SQL phải được submit vào session state, nếu không server có thể thấy giá trị cũ thay vì giá trị mới trên màn hình.

Dynamic Action → Execute Server-side Code

PL/SQL Code:
:P10_TOTAL := nvl(:P10_QUANTITY, 0) * nvl(:P10_UNIT_PRICE, 0);

Items to Submit:
P10_QUANTITY, P10_UNIT_PRICE

Items to Return:
P10_TOTAL

Nếu quên cấu hình Items to Submit, PL/SQL có thể tính sai vì chưa nhận giá trị mới từ browser.

Quy tắc chọn nhanh

Bạn có thể dùng bảng tư duy sau:

  • Nếu chỉ thay đổi giao diện: dùng Dynamic Action.
  • Nếu cần phản hồi tức thì mà không submit page: dùng Dynamic Action.
  • Nếu cần lưu dữ liệu chính thức: dùng PL/SQL Process.
  • Nếu cần transaction nhiều bảng: dùng PL/SQL Process.
  • Nếu logic liên quan đến bảo mật: xử lý ở server bằng PL/SQL.
  • Nếu action có thể gây mất dữ liệu hoặc thay đổi trạng thái nghiệp vụ: dùng PL/SQL Process.
  • Nếu chỉ là tính toán nhỏ để hiển thị: có thể dùng Dynamic Action gọi PL/SQL.

Ví dụ 1: Show/hide field theo lựa chọn

Tình huống: trên form khách hàng, nếu loại khách hàng là “Company” thì hiện field Tax Code.

Nên dùng: Dynamic Action.

Lý do: đây là hành vi UI, không cần submit page và không cần ghi database.

Ví dụ 2: Submit đơn hàng

Tình huống: người dùng bấm nút Submit Order, hệ thống cần kiểm tra tồn kho, tạo order, tạo order lines, cập nhật trạng thái và ghi audit log.

Nên dùng: PL/SQL Process.

Lý do: đây là logic nghiệp vụ quan trọng, cần transaction và kiểm soát server-side.

Ví dụ 3: Tính tổng tiền tức thì

Tình huống: người dùng nhập số lượng và đơn giá, form tự tính tổng tiền.

Nên dùng: Dynamic Action, có thể tính bằng JavaScript hoặc Execute Server-side Code nếu logic cần PL/SQL.

Nếu công thức đơn giản, JavaScript là đủ. Nếu công thức phụ thuộc dữ liệu database hoặc rule phức tạp, Dynamic Action có thể gọi PL/SQL ngắn qua AJAX.

Ví dụ 4: Kiểm tra quyền trước khi cập nhật

Tình huống: chỉ người quản lý mới được approve expense report.

Nên dùng: PL/SQL Process và Authorization Scheme.

Lý do: không được chỉ dựa vào việc ẩn nút trên giao diện. Người dùng có thể cố tình gọi request. Quyền thật phải được kiểm tra ở phía server.

Ví dụ 5: Refresh report sau khi chọn filter

Tình huống: người dùng chọn category, report bên dưới tự refresh.

Nên dùng: Dynamic Action.

Lý do: đây là trải nghiệm UI. Người dùng không cần submit toàn bộ page.

Những lỗi thường gặp

Một số lỗi phổ biến khi chọn sai nơi xử lý:

  • Dùng Dynamic Action cho logic lưu dữ liệu phức tạp, dẫn đến khó kiểm soát transaction.
  • Để validation quan trọng chỉ ở client-side, dễ bị bypass.
  • Gọi PL/SQL trong Dynamic Action nhưng quên Items to Submit.
  • Dùng Page Process cho mọi thứ, khiến app phải submit page quá nhiều và trải nghiệm kém mượt.
  • Viết quá nhiều JavaScript thay vì dùng Dynamic Action khai báo sẵn của APEX.
  • Đưa business rule quan trọng vào UI thay vì package PL/SQL.

Best practice cho ứng dụng doanh nghiệp

Với ứng dụng APEX nghiêm túc, bạn nên có nguyên tắc rõ:

  • Dynamic Action dùng cho UI behavior và interaction.
  • PL/SQL Process dùng để gọi package nghiệp vụ.
  • Business logic quan trọng nên nằm trong package, không nằm rải rác trong nhiều page.
  • Authorization phải kiểm tra ở server-side.
  • AJAX PL/SQL trong Dynamic Action chỉ nên ngắn, rõ mục đích và dễ debug.
  • Luôn cấu hình Items to Submit / Items to Return khi dùng Execute Server-side Code.
  • Dùng APEX_DEBUG để debug logic server-side khi cần.

Một pattern tốt là để page process chỉ gọi package:

begin
  expense_pkg.submit_expense(
    p_expense_id => :P30_EXPENSE_ID,
    p_user       => :APP_USER
  );
end;

Còn toàn bộ rule thật nằm trong expense_pkg. Cách này giúp code dễ test, dễ tái sử dụng và dễ kiểm soát hơn.

Kết luận

Dynamic Action và PL/SQL Process không phải hai lựa chọn đối lập, mà là hai công cụ phục vụ hai mục đích khác nhau. Dynamic Action giúp UI phản hồi nhanh và dễ tương tác. PL/SQL Process giúp xử lý dữ liệu, transaction, bảo mật và business logic ở phía server.

Quy tắc dễ nhớ là: nếu liên quan đến giao diện, hãy nghĩ đến Dynamic Action. Nếu liên quan đến dữ liệu thật, transaction, quyền truy cập hoặc nghiệp vụ quan trọng, hãy xử lý bằng PL/SQL Process hoặc package PL/SQL.

Chọn đúng nơi đặt logic sẽ giúp ứng dụng Oracle APEX dễ bảo trì hơn, an toàn hơn và có trải nghiệm người dùng tốt hơn.