Trong Oracle APEX, phần lớn logic thường được kích hoạt khi người dùng thao tác trên giao diện:
bấm nút, submit form, thay đổi item hoặc mở một page. Tuy nhiên, không phải tác vụ nào cũng nên phụ thuộc
vào hành động trực tiếp của người dùng.
Có những việc cần chạy nền theo lịch, ví dụ gửi email nhắc việc mỗi sáng, kiểm tra đơn hàng quá hạn,
đồng bộ dữ liệu từ hệ thống ngoài, gọi REST API định kỳ hoặc xử lý các bản ghi đang chờ.
Đây là lúc APEX Automation trở nên rất hữu ích.
Bài viết này tập trung vào kiến trúc Oracle APEX Automation theo hướng dễ hiểu cho người mới:
automation chạy như thế nào, gồm những thành phần nào, khi nào nên dùng automation,
khi nào nên dùng giải pháp khác và những điểm cần lưu ý để automation chạy ổn định trong ứng dụng thực tế.
APEX Automation là gì?
APEX Automation là một shared component trong Oracle APEX cho phép bạn chạy logic nền theo lịch
hoặc dựa trên thay đổi dữ liệu. Bạn có thể tìm thấy phần này tại:
Shared Components → Automations
Một automation có thể dùng để:
- Gửi email hoặc notification định kỳ.
- Kiểm tra các bản ghi cần xử lý.
- Đồng bộ dữ liệu với hệ thống khác.
- Gọi REST API bên ngoài.
- Cập nhật trạng thái dữ liệu theo rule.
- Ghi log, cảnh báo hoặc tạo task tự động.
Hiểu đơn giản, automation là cách APEX cho phép bạn định nghĩa một “job nền” theo hướng low-code,
thay vì phải tự viết toàn bộ bằng database scheduler ngay từ đầu.
Lược đồ tổng quan kiến trúc APEX Automation
APEX Automation flow
Trigger
Chạy theo lịch hoặc dựa trên thay đổi dữ liệu như insert, update, delete.
→
Source
Table, view hoặc SQL query xác định các bản ghi cần xử lý.
→
Action
Gửi email, gọi PL/SQL, gọi REST API hoặc thực hiện logic xử lý nền.
Mỗi lần automation chạy, APEX sẽ ghi nhận execution details để bạn có thể kiểm tra trạng thái,
lỗi, thời gian chạy và số bản ghi được xử lý.
Flow cơ bản là: automation được kích hoạt, APEX lấy dữ liệu từ source, áp dụng điều kiện nếu có,
thực hiện action, sau đó ghi log kết quả. Đây là kiến trúc rất phù hợp cho các tác vụ lặp lại
hoặc các quy trình không cần người dùng bấm nút trực tiếp.
Các thành phần chính của một Automation
Một automation trong APEX thường có các thành phần sau:
- Name: tên automation, nên đặt rõ mục đích.
- Source: nguồn dữ liệu automation sẽ đọc.
- Trigger: điều kiện kích hoạt, ví dụ chạy theo lịch hoặc theo DML event.
- Condition: điều kiện bổ sung để quyết định bản ghi nào cần xử lý.
- Actions: việc cần thực hiện khi automation chạy.
- Execution logs: nơi kiểm tra lịch sử chạy, lỗi và kết quả.
Khi thiết kế automation, bạn nên nghĩ giống như thiết kế một quy trình nền: khi nào chạy,
chạy trên dữ liệu nào, làm gì với từng bản ghi, nếu lỗi thì xử lý ra sao và làm sao để audit lại.
Schedule-based Automation
Schedule-based automation là loại automation chạy theo lịch. Ví dụ:
- Mỗi ngày lúc 8 giờ sáng gửi email nhắc các task quá hạn.
- Mỗi giờ đồng bộ dữ liệu từ API bên ngoài.
- Mỗi đêm cập nhật trạng thái các bản ghi hết hạn.
- Mỗi tuần gửi báo cáo tổng hợp cho manager.
Đây là loại automation phổ biến nhất, vì nhiều hệ thống cần các tác vụ chạy định kỳ mà không phụ thuộc
vào việc có người đang mở app hay không.
Ví dụ source query cho task quá hạn:
select task_id,
task_name,
assigned_to,
due_date
from project_tasks
where status = 'OPEN'
and due_date < trunc(sysdate)
Automation có thể chạy mỗi sáng, lấy danh sách task quá hạn và gửi email cho người phụ trách.
DML-based Automation
DML-based automation chạy dựa trên thay đổi dữ liệu như insert, update hoặc delete.
Loại này phù hợp khi bạn muốn phản ứng với một thay đổi cụ thể trong bảng.
Ví dụ:
- Khi có đơn hàng mới, tạo notification cho bộ phận xử lý.
- Khi trạng thái expense chuyển sang Approved, gửi email cho finance.
- Khi bản ghi bị cập nhật sang Overdue, tạo audit entry.
- Khi ticket được assign cho user mới, gửi thông báo.
DML-based automation giúp bạn xử lý event theo hướng declarative trong APEX.
Tuy nhiên, với các logic cực kỳ quan trọng hoặc cần đảm bảo transaction chặt chẽ, bạn vẫn nên cân nhắc
đặt logic cốt lõi trong database trigger hoặc package PL/SQL phù hợp.
Source: Table, View hoặc SQL Query
Source là nơi automation lấy dữ liệu để xử lý. Tùy tình huống, bạn có thể dùng table, view hoặc SQL query.
Với automation đơn giản, table hoặc view có thể đủ. Với automation phức tạp hơn,
SQL query thường linh hoạt hơn vì bạn có thể join nhiều bảng, tính toán field phụ hoặc lọc đúng các bản ghi cần xử lý.
Ví dụ source query cho đơn hàng chờ thanh toán quá lâu:
select order_id,
customer_id,
created_at,
payment_status
from orders
where payment_status = 'PENDING'
and created_at < systimestamp - interval '30' minute
Query này giúp automation chỉ xử lý những đơn hàng pending quá 30 phút,
thay vì quét toàn bộ bảng orders.
Actions trong APEX Automation
Action là phần automation thực sự làm việc. Tùy phiên bản APEX và cấu hình,
automation có thể thực hiện các hành động như gửi email, execute PL/SQL code,
gọi REST API hoặc xử lý từng dòng dữ liệu.
Trong ứng dụng doanh nghiệp, action thường nên gọi package PL/SQL thay vì viết logic dài trực tiếp trong automation.
begin
notification_pkg.send_overdue_task_email(
p_task_id => :TASK_ID
);
end;
Cách này giúp business logic nằm trong package, dễ test, dễ tái sử dụng và dễ kiểm soát hơn.
Automation chỉ đóng vai trò kích hoạt đúng thời điểm.
Automation xử lý theo từng dòng hay xử lý theo batch?
Khi source query trả nhiều dòng, bạn cần quyết định action sẽ xử lý từng dòng hay xử lý theo batch.
Xử lý từng dòng phù hợp khi mỗi bản ghi cần email riêng, notification riêng hoặc logic riêng.
Nhưng nếu số lượng bản ghi lớn, cách này có thể chậm và tạo quá nhiều request/email.
Xử lý theo batch phù hợp khi bạn muốn gom dữ liệu lại rồi xử lý một lần, ví dụ:
- Gửi một email tổng hợp thay vì nhiều email lẻ.
- Đồng bộ một danh sách bản ghi sang API bên ngoài.
- Cập nhật trạng thái nhiều dòng trong một transaction.
Thiết kế automation tốt cần tính đến volume dữ liệu, tần suất chạy và giới hạn của hệ thống bên ngoài.
Logging và Monitoring
Một lợi ích lớn của APEX Automation là bạn có thể kiểm tra lịch sử chạy trong APEX.
Logs giúp bạn biết automation đã chạy lúc nào, kết quả ra sao, có lỗi không và action nào bị fail.
Khi thiết kế automation, bạn nên ghi thêm log nghiệp vụ nếu tác vụ quan trọng.
Ví dụ:
- Automation đã xử lý bao nhiêu bản ghi.
- Bản ghi nào bị lỗi.
- API bên ngoài trả status code gì.
- Email đã gửi cho ai.
- Thời gian xử lý mất bao lâu.
Logs là phần rất quan trọng khi automation chạy nền, vì người dùng không trực tiếp nhìn thấy quá trình xử lý.
Error Handling
Automation chạy nền nên cần xử lý lỗi cẩn thận. Nếu một bản ghi lỗi làm dừng toàn bộ job,
các bản ghi còn lại có thể không được xử lý. Ngược lại, nếu bạn nuốt lỗi mà không log,
hệ thống sẽ im lặng thất bại.
Một pattern tốt là:
- Validate dữ liệu trước khi xử lý.
- Ghi log lỗi theo từng bản ghi.
- Cho phép retry nếu lỗi tạm thời.
- Phân biệt lỗi nghiệp vụ và lỗi hệ thống.
- Gửi cảnh báo cho admin nếu automation fail nhiều lần.
Ví dụ PL/SQL action có thể gọi package xử lý lỗi:
begin
sync_pkg.process_pending_record(
p_record_id => :ID
);
exception
when others then
sync_log_pkg.log_error(
p_record_id => :ID,
p_error => sqlerrm
);
end;
Với automation quan trọng, đừng chỉ dựa vào “job chạy thành công” ở cấp tổng thể.
Hãy log cả kết quả xử lý từng bản ghi.
Idempotency: chạy lại không làm sai dữ liệu
Một nguyên tắc quan trọng khi thiết kế automation là idempotency.
Nghĩa là nếu automation chạy lại cùng một dữ liệu, kết quả không bị nhân đôi hoặc làm sai trạng thái.
Ví dụ, nếu automation gửi email nhắc task quá hạn, bạn cần tránh gửi cùng một email lặp lại quá nhiều lần.
Có thể thêm cột:
last_reminded_at
reminder_count
Sau khi gửi email, cập nhật last_reminded_at. Lần chạy sau chỉ gửi lại nếu đã qua một khoảng thời gian nhất định.
where status = 'OPEN'
and due_date < trunc(sysdate)
and (
last_reminded_at is null
or last_reminded_at < systimestamp - interval '1' day
)
Với các automation gọi API bên ngoài hoặc tạo dữ liệu, idempotency càng quan trọng hơn.
Khi nào nên dùng APEX Automation?
Bạn nên dùng APEX Automation khi tác vụ:
- Cần chạy theo lịch.
- Cần xử lý dữ liệu nền mà không cần user bấm nút.
- Cần gửi email, notification hoặc gọi API định kỳ.
- Cần xử lý danh sách bản ghi dựa trên source query.
- Cần cấu hình low-code, dễ quản lý trong APEX.
Ví dụ phù hợp: gửi email nhắc việc, đồng bộ dữ liệu, kiểm tra bản ghi quá hạn,
tạo notification nền, cleanup dữ liệu tạm hoặc cập nhật trạng thái định kỳ.
Khi nào không nên dùng APEX Automation?
Không phải mọi job nền đều nên đưa vào APEX Automation. Bạn nên cân nhắc giải pháp khác nếu:
- Job cần chạy với tần suất rất cao, gần realtime.
- Logic cần kiểm soát transaction cực kỳ chặt.
- Job xử lý khối lượng dữ liệu rất lớn.
- Job cần orchestration phức tạp nhiều bước.
- Hệ thống đã có enterprise scheduler riêng.
Trong các trường hợp đó, database scheduler, queue, background worker hoặc integration platform
có thể phù hợp hơn. APEX Automation rất tiện, nhưng không nên dùng để thay thế mọi loại job nền.
So sánh APEX Automation, Page Process và Database Scheduler
Ba công cụ này phục vụ các mục đích khác nhau:
- Page Process: chạy khi user submit page hoặc thao tác trên UI.
- APEX Automation: chạy nền theo lịch hoặc theo sự kiện dữ liệu trong phạm vi APEX.
- DBMS_SCHEDULER: chạy job ở cấp database, phù hợp cho tác vụ nền chuyên sâu hoặc độc lập với APEX.
Nếu logic phụ thuộc vào hành động user trên page, dùng Page Process.
Nếu logic là tác vụ nền của ứng dụng APEX, dùng APEX Automation.
Nếu logic là job database lớn, độc lập, cần kiểm soát sâu, dùng DBMS_SCHEDULER hoặc kiến trúc job chuyên dụng.
Best practice khi thiết kế APEX Automation
Một số nguyên tắc nên áp dụng:
- Đặt tên automation rõ ràng theo mục đích.
- Giữ source query càng chính xác càng tốt, tránh quét dữ liệu không cần thiết.
- Đưa business logic vào package PL/SQL.
- Log kết quả xử lý quan trọng.
- Thiết kế idempotency để chạy lại không gây lỗi dữ liệu.
- Giới hạn số lượng email hoặc API call nếu cần.
- Test automation trong môi trường dev trước khi bật production.
- Không hard-code secret hoặc endpoint quan trọng trong code.
- Theo dõi execution logs định kỳ.
Automation càng quan trọng thì càng cần logging, retry strategy và monitoring rõ ràng.
Ví dụ use case: gửi email nhắc task quá hạn
Giả sử bạn có bảng task và muốn gửi email nhắc người phụ trách mỗi ngày nếu task quá hạn.
Source query:
select task_id,
task_name,
assigned_to,
due_date
from project_tasks
where status = 'OPEN'
and due_date < trunc(sysdate)
and (
last_reminded_at is null
or last_reminded_at < systimestamp - interval '1' day
)
PL/SQL action:
begin
task_notification_pkg.send_overdue_email(
p_task_id => :TASK_ID
);
update project_tasks
set last_reminded_at = systimestamp,
reminder_count = nvl(reminder_count, 0) + 1
where task_id = :TASK_ID;
end;
Automation schedule: mỗi ngày lúc 8 giờ sáng.
Đây là một ví dụ đơn giản nhưng thể hiện đầy đủ các ý chính: source query rõ ràng,
action gọi package, có chống gửi lặp và có thể kiểm tra log khi cần.
Kết luận
APEX Automation là một công cụ rất hữu ích để chạy logic nền trong Oracle APEX.
Nó phù hợp cho các tác vụ theo lịch, xử lý dữ liệu nền, gửi email, gọi REST API,
đồng bộ dữ liệu và các workflow không cần user thao tác trực tiếp.
Để automation đáng tin cậy, bạn cần thiết kế nó như một phần của kiến trúc ứng dụng:
source query phải rõ, action nên gọi package, lỗi phải được log, xử lý nên có idempotency
và execution logs cần được theo dõi.
Khi dùng đúng chỗ, APEX Automation giúp ứng dụng Oracle APEX của bạn tự động hơn,
ít phụ thuộc thao tác thủ công hơn và phù hợp hơn với các quy trình doanh nghiệp hiện đại.