When a Good Idea Goes Bad - APEX Custom Plug-ins
⚠️ When a Good Idea Goes Bad: The Hidden Danger in Custom Workflow Plug-ins in Oracle APEX
Oracle APEX workflows provide a rich and declarative way to build approvals, task automation, and business processes directly into your application. And recently, the official APEX blog showcased a clever technique: using a custom process plug-in to create multiple tasks in parallel within a workflow.
At first glance, it’s a smart solution to a common use case—allowing a single workflow step to spawn two independent tasks (e.g., provisioning a laptop and setting up badge access). But unfortunately, the implementation in that blog post contains a critical coding error that can silently corrupt page processing across your entire APEX instance.
This post unpacks what happened, why it matters, and how to safely achieve the original goal without breaking APEX.
✅ The Idea: Parallel Task Creation in Workflows
The original article rightly observed that some workflow steps need to trigger multiple independent tasks before continuing. Oracle’s approval engine supports waiting on multiple tasks, so the goal was to implement a plug-in that:
- Creates two approval tasks (Laptop + Badge)
- Signals the workflow to wait until both are completed
- Uses a custom APEX process plug-in to encapsulate this logic
❌ The Mistake: Using Invalid Callback Code
Here’s the part of the blog that introduces the problem:
function complete_tasks (
p_process in apex_plugin.t_process,
p_plugin in apex_plugin.t_plugin,
p_param in apex_plugin.t_process_complete_param )
return apex_plugin.t_process_complete_result
is
l_result apex_plugin.t_process_complete_result;
begin
l_result.status := apex_plugin.c_complete_status_success;
return l_result;
end;
At a glance, this appears to be a harmless no-op function to “complete” the step. But here’s the issue:
apex_plugin.t_process_complete_result
is not a real type- Neither is
apex_plugin.t_process_complete_param
- These are undocumented or invalid constructs that don’t exist in the APEX plug-in API
By declaring this function inside a Process-type plug-in, APEX assumes this function will be used at runtime. But when APEX tries to call this invalid callback, it silently fails—without logging an error or crashing the session. The result?
💥 The Impact: Silent Breakdown of Page Process Execution
After deploying this plug-in:
- APEX still allows you to edit and save pages—no errors, no warnings
- But any page-level processes (even unrelated ones) stop executing correctly
- You can add or remove processes, but they won’t run at runtime
- Even removing the plug-in doesn’t restore functionality
- The only resolution is to restart the APEX instance or ATP database
This is an incredibly subtle failure mode. Everything looks normal—until you realize your logic is no longer being executed.
🧠 Why It Happens
When you register a Process plug-in, APEX expects it to implement a very specific interface:
function your_process (
p_process in apex_plugin.t_process,
p_plugin in apex_plugin.t_plugin )
return apex_plugin.t_process_exec_result;
That’s it. There’s no supported concept of a complete_tasks
function with alternate signatures in Process plug-ins.
By defining a function with an unrecognized return type and parameters, the plug-in compiles but violates APEX’s internal metadata expectations. This seems to corrupt the processing logic that determines how and when plug-ins and standard processes run across your pages.
🛠️ How to Fix It
If you’ve followed the same steps from the blog post and are now seeing broken process behavior, here’s what to do:
- Remove the plug-in from Shared Components > Plug-ins
- Delete any instances of the plug-in from workflow steps
- Re-save all affected pages (especially those with standard processes)
- Restart your APEX instance or ATP database
A Safer Approach to Parallel Workflow Tasks
The core idea in the blog post is still sound—you can use a custom workflow activity to create multiple tasks. But the execution should follow the documented API for APEX process plug-ins or use a supported PL/SQL action within the workflow step.
Here’s what the function should look like in a Process plug-in:
function create_tasks (
p_process in apex_plugin.t_process,
p_plugin in apex_plugin.t_plugin )
return apex_plugin.t_process_exec_result
is
l_result apex_plugin.t_process_exec_result;
begin
-- your task creation logic
return l_result;
end;
There’s no need for a complete_tasks
callback in a Process plug-in. If you need asynchronous completion,
use the workflow APIs like apex_approval.complete_task
.
Final Takeaways
- The original idea was clever—but the implementation was technically incorrect
- APEX is powerful but expects strict adherence to the documented plug-in API
- Even one invalid callback function can silently cripple your application logic
- If page processes aren't executing properly, suspect plug-in interference
Comments
Post a Comment