APEX:在系统后台跑PL/SQL

Posted on September 20, 2009

在一个ERP环境中,经常遭遇到一些执行时间非常长的情况。对于EBS产品,可以考虑使用并发请求的方式来让表单将控制权快速返回给用户,有些人也喜欢利用Workflow来应对此类情况(使用Deferred特性)。在和Oracle的对话中,以及Oracle Database 11g产品组件透露的信息上可以看出,APEX(Application Express)越来越成为一个非常重要的角色。从以前独立版本的HTML DB,到现在直接内置到11g中,仿佛就是在向企业用户宣告了另一种企业信息化方案。开发的Web应用程序通常具备非常快速的响应,但是偶尔也会遭遇一些非常情形,比如某个财务报表的运算逻辑非常复杂,通常无法立即返回结果,这时该如何处理呢?

一种比较简单的方式就把这部分工作还给EBS,Web应用程序等处理完毕后再直接获取运算结果,这种方式不需要对原EBS应用做太大调整,而纯粹作为一个结果呈现的客户端。其实还有另外一种方式来处理该问题,即将PL/SQL代码放到后台去执行。APEX给出一个官方的解决方案,使用APEX_PLSQL_JOB。它的原理就是通过DBMS_JOB的功能来让代码延迟执行:

APEX_PLSQL_JOB.SUBMIT_PROCESS (
    p_sql IN VARCHAR2,
    p_when IN DATE DEFAULT SYSDATE,
    p_status IN VARCHAR2 DEFAULT 'PENDING')
RETURN NUMBER;

该过程提交后台执行的PL/SQL代码,它会返回新创建的job number,可以根据该标识来跟踪job执行状态。这个包里已封装的过程主要包含:

  • JOBS_ARE_ENABLED 判断是否支持使用APEX_PLSQL_JOB提交后台执行的PL/SQL代码。
  • PURGE_PROCESS 清理已提交的jobs。
  • SUBMIT_PROCESS 提交后台执行的PL/SQL
  • TIME_ELAPSED 统计job提交后过了多少时间
  • UPDATE_JOB_STATUS 更新当前执行中的job状态,通常在提交的PL/SQL代码中调用。

为什么是DBMS_JOB而不是DBMS_SCHEDULER呢?众所周知,APEX的前身是HTML DB,它在10g版本以前的数据库中也可以正常工作,而DBMS_SCHEDULER则是10g时代才被引入的。事实上,在很多内部程序或表结构上,如今的APEX还是遗留有许多HTML DB的影子。

只要明白了原理,我们也可以设计更适合自己工作环境的wrapper package,比如可以考虑充分利用DBMS_SCHEDULER的新特性。

Related Posts

  1. APEX 上传xls文件
  2. APEX 4 中的文件上传功能
  3. APEX Listener 增设管理界面
  4. APEX与EBS登录权限集成

» Filed Under APEX Print This Post Print This Post

Comments

2 Responses to “APEX:在系统后台跑PL/SQL”

  1. shawn zeng on January 18th, 2010 23:35

    个人感觉这个包太简陋,适合简单的后台pl/sql

  2. Zeeno on January 28th, 2010 10:48

    事实上,在用的时候我通常直接使用DBMS_JOB包。
    感觉APEX做这个简单的封装,可能有其他用途吧,比如将来支持的某event事件……

Leave a Reply