Khi phát triển ứng dụng Oracle APEX, có hai nơi rất phổ biến để viết logic:
Dynamic Action và PL/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 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 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.