Feb 26 2010

关于Forms转换到APEX小记

Category: APEXZeeno @ 15:07

Oracle Forms是非常高效、健壮的开发工具,它的历史已经超过了20年,在今后几年里将会继续完善和支持下去。APEX已经具备了相当多的Web 2.0因素,它继承了Oracle Forms最大优势,那就是几乎可以用PL/SQL来完成所有的开发工作,对于企业内部应用,它无异成为了首选的平台。在这种趋势下,自APEX 3.2版本开始,就引入了Forms Converter,该工具用于将传统的Forms应用转换到APEX应用,对于一些Oracle Forms应用丰富、历史悠久的企业而言,它是相当吸引眼球的。

从FastForms到SQL*Forms,从CS架构到现在基于Web的WebForms,Oracle Forms的基础结构却变化不大,本质依旧是Java程序,程序逻辑的实现几乎完全基于SQL和PL/SQL。APEX则是非常纯粹的WEB应用开发平台,它需要的是PL/SQL、Java Script、CSS和最基础的HTML知识。对于开发人员而言,两者需要技术技能几乎相同。从Oracle Forms转移到APEX,对开发人员的技能培训几乎可以省略。Oracle Forms的几个核心组件:块(Block)、触发器(Trigger)、PL/SQL库、值列表(LOV)都可以交由Forms Converter完成转换。

转换器会生成XML格式的原数据文件,然后上传到APEX生成具体的Web应用。在这里,转换器的作用是“转换”,而不是“迁移”。两个平台在技术上是不同的,从而导致某些功能上的差异,比如Forms中的快捷键在目前的APEX中是不存在的,此外,Forms中某些java beans的应用也无法在APEX上实现。Oracle Forms和Oracle APEX各元素的差异主要如下表所示:

Oracle Forms Oracle APEX
Alerts 在应用层或页面上的验证逻辑中实现文本消息
Blocks 在APEX是区域(Region)
Canvases 在转换过程中被忽略
Editors HTML编辑器
Lists of Values 记录组在转换过程中将会被调整
Program Units 对应PL/SQL程序单元
Triggers APEX中没有触发器,不过页面查询过程有相应的机制实现逻辑,比如Processes

对于APEX 4.0版本,或许还有另外一些特殊的差异,比如Websheets,内置的图表引擎(这是非常酷的,可以做简单的BI),加强的Web Services功能等。在用户界面上,Oracle Forms响应迅速,而APEX则可以通过AJAX特效实现类似功能。

关于转换的具体操作,可以参考《Oracle® Application Express Application Migration Guide,这本书《Oracle Application Express Forms Converter》有更详细的介绍。


Oct 22 2009

Oracle Application Express Listener

Category: APEXZeeno @ 13:45

在今日之前,APEX应用可以通过两种方式访问(架构),即:

  1. Oracle HTTP Server/mod_plsql
  2. XDB HTTP protocol server/embedded PL/SQL gateway

今天,Oracle发布了Oracle Application Express Listener,这是很早以前就预告要在APEX下一版本(4.x)提供的主要新特性之一。通过APEX Listener,Web层增加了对以下平台的支持:

  1. Oracle WebLogic
  2. Tomcat
  3. OC4J

尽管11g内置了PL/SQL gateway可以当做一个逻辑上独立的Web Server来用,Oracle的技术顾问认为在应用规模不大的环境下,该方式比DB + Web Server的两层架构性能更佳,但是在我个人的测试下,发现并非如此。对于正式环境,我强烈建议使用独立的Web Server。

下面是一个Tomcat的配置指导:

  1. Download Tomcat
    Download
  2. Unpack Tomcat
  3. Edit the Tomcat configuration file to increase the maximum header size (the default is 4k). Edit ….\apache-tomcat-6.0.18\conf\server.xml
           <Connector port="8080" protocol="HTTP/1.1"
                      connectionTimeout="20000"
                      maxHttpHeaderSize="32676"
                      redirectPort="8443" />

    If you need to change the port from the default 8080, this would be done at the same time:

           <Connector port="8888" protocol="HTTP/1.1"
                      connectionTimeout="20000"
                      maxHttpHeaderSize="32676"
                      redirectPort="8443" />

    More information is available in the Apache Tomcat Configuration Reference.

  4. Extract the apex.war file from the apex_listener.zip (available for download on the APEX Listener Download Page) to …\apache-tomcat-6.0.18\webapps
  5. Start apache-tomcat-6.0.18\bin\startup.bat
  6. Visit http://localhost:8080/apex/Config
  7. Recursively copy the apex/images directory to ../apache-tomcat-6.0.18/webapps/ROOT/i

更多资料可访问网址:http://www.oracle.com/technology/products/database/application_express/index.html

P.S: 该产品目前还只是Early Adopter,非常非常前期的测试版,存在很多BUG。对于中文用户,如果页面中需要返回中文文字的消息,则可能会导致该消息乱码。在功能页面上,会返回类似
Error print success message checksum content error: ……
的错误。


Sep 28 2009

APEX与EBS登录权限集成

Category: APEX, E-Business SuiteZeeno @ 14:06

APEX的访问权限主要分为两种:Authentication和Authorization,简单来说,前者控制登录权限,一次登录各处可用;后者控制各页面或模块的权限。事实上,APEX应用中甚至无需管理用户数据,你所需要的是管理逻辑上的权限,而不需要存储权限数据本身,如此,登录权限的管理便可以非常灵活。

而EBS的权限控制稍微复杂一点,但是从登录权限来看却简单许多,主要是通过包FND_WEB_SEC来进行验证,如:

SQL> set serveroutput on
SQL> exec dbms_output.put_line(fnd_web_sec.validate_login('ZEENO', 'PW123'));

Y

PL/SQL procedure successfully completed

只需要调用该过程,即可直接使用EBS的用户登录了。如果APEX和EBS分处不同的数据库中,则可以使用远程过程调用方式:

fnd_web_sec.validate_login@DBLINK('ZEENO', 'PW123');

首先,APEX本地库中创建验证函数:

CREATE FUNCTION ebs_auth(p_username IN VARCHAR2,
                         p_password IN VARCHAR2) RETURN BOOLEAN AS
BEGIN
  -- 使用EBS远程验证
  IF fnd_web_sec.validate_login@dblink(p_username, p_password) = 'Y' THEN
    RETURN TRUE;
  ELSE
    RETURN FALSE;
  END IF;
END ebs_auth;

按照规范,需要添加p_username和p_password两个参数。

接下来,在APEX中创建新的Authentication Scheme,一切按正常方式进行,所需要改动的,是将上面的验证函数添加到Authentication Function:
2009-09-28_133836

如此,即可使用EBS用户、密码进行登录了。


Sep 23 2009

为什么要学APEX

Category: APEXZeeno @ 21:58

之前曾经写过一篇类似的文章:《为什么要学工作流》,这次说的,依旧是我们学习Oracle时应当顺带学会的技能。

APEX,Application Express,曾经叫做HTML DB。看名字就知道它是干什么的了。和Workflow的出身类似,你只要安装了Oracle数据库(当然是11g R1及以上版本)就同时安装好了。与其当做一个产品,不如当做一个功能或者平台。你能说Oracle PL/SQL是一个产品吗?它也类似,应当作为一个整体来对待。Workflow可以选择安装独立的standalone版本,但是它的工作引擎事实上早已存在于数据库中了。APEX也可以单独安装到OHS(Oracle HTTP Server with mod_plsql)中,但是到了11g版本,已经不需要OHS了,可以直接使用XML DB HTTP Server。也就是说,你可以通过简单的SQL语句就可以控制该平台,比如修改端口、启动或停止、修改配置等,这大大降低了管理门槛。

APEX的具体介绍可以参考官方文档《What is Oracle Application Express》,从技术架构到功能都介绍的非常详细,此处不再赘述。这里谈一点经验和体会,我想告诉你的是,它不需要花费你太多的精力,但是绝对值得投入。

  1. 充分利用和发挥已有的知识和技能。如果熟悉HTML、Javascript和PL/SQL,那么这个平台简直就是为你而生,完全不需要学J2EE之类复杂的技术,也不需要像J2EE、PHP之类还需要配置专用的服务器,直接拿来可用。最为关键的是,不必为了做个Web应用就从头学一门新的技术,减少心理负担:)
  2. 数据库单层架构。如果使用embedded PL/SQL gateway,则在架构上得以极端简化,所有的运算都在数据库中完成。单一层次的架构,在设计上就完全取决于DBA和数据库开发人员的功力了。作为专业人士,你具备了比普通程序员更大的优势,甚至可以说拥有了绝对的优势,只要你够专业。
  3. 高效的Web Application开发平台。作为一个Web应用开发平台,它自成一体,相对于Form、OAF、ADF之类而言更加便捷,只要有浏览器,随时可以工作,不必担心本地程序文件丢失。最关键的是,基于APEX的Web应用发布非常容易,系统移植也非常方便。
  4. 便于分布式系统的管理。统一采用Oracle数据库,只需要非常简单的DBLINK即可完成链接,比使用透明网关更加简单、有效、可靠。
  5. 有学习价值。作为11g的默认组件,它的生命周期完全和数据库等同,因而可以保证时间上的投入不会很快过时。此外,对于很多非IT企业而言,几乎可以完全摆脱对第三方Web应用开发商的依赖。默认的Theme已经可以满足绝大部分需求,只需要少量的修改,即可媲美专业网站。不论从员工价值提升,还是企业管理成本上说,都非常有益。

APEX的入门不难,当然,对于复杂的应用还是需要一些高级技巧的,任何平台都是如此。这不是说它在面对复杂应用时有所不足,而是它也具备开发复杂应用的能力。PHP简单吗?Grails简单吗?ruby on rails简单吗?答案不言而喻。所以关键看应用,可以非常简单,也可以非常复杂。Asktom和Metalink都是利用该平台建立,这已经证明了它的可靠性。

P.S: 网络公司的同志飘过,该平台主要还是针对一些实业企业的。


Sep 22 2009

XDB取消浏览器认证

Category: APEXZeeno @ 10:45

APEX安装后,默认访问路径为http://host:port/apex/,如果直接访问根目录,会弹出浏览器认证窗口要求登录。对于多数浏览器,比如IE或者Firefox都没有问题,但是少数浏览器,会自动访问网站根目录,比如查找默认favicon,此时会时常弹出浏览器登录认证窗口,虽然可以直接取消,但是非常烦人。原因便是XDB对用户ANONYMOUS账号权限的设定,访问apex之外的目录需要登录。这个认证窗口,是可以取消的。

在安装APEX时,最后步骤要求UNLOCK ANONYMOUS账号:

ALTER USER ANONYMOUS ACCOUNT UNLOCK;

该操作启用了ANONYMOUS账号,但是并没有赋予匿名访问XDB Repository的权限。

进入$ORACLE_HOME/RDBMS/Admin,用sysdba权限登录执行:

SQL>@epgstat

检查Allow repository anonymouse access值,默认为false,即默认禁止匿名访问根目录。我们需要将该值修改为true。

所有XDB的配置都存放在xdbconfig.xml中,但是该文件需要编程修改。查看路径为:
1. EM用sysdba登录。
2. Database Instance > XML Database Resources > View XML Database Resource: xdbconfig.xml

默认httpconfig节点中并没有allow-repository-anonymous-access的配置,EM中无法修改该文件,我们需要用以下代码添加节点:

DECLARE
  l_configxml xmltype;
  l_value     VARCHAR2(5) := 'true'; -- (true/false)
BEGIN
  l_configxml := dbms_xdb.cfg_get();

  IF l_configxml.existsnode('/xdbconfig/sysconfig/protocolconfig/httpconfig/allow-repository-anonymous-access') = 0 THEN
    -- Add missing element.
    SELECT insertchildxml(l_configxml,
                          '/xdbconfig/sysconfig/protocolconfig/httpconfig',
                          'allow-repository-anonymous-access',
                          xmltype('' ||
                                  l_value || ''),
                          'xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd"')
      INTO l_configxml
      FROM dual;
  ELSE
    -- Update existing element.
    SELECT updatexml(dbms_xdb.cfg_get(),
                     '/xdbconfig/sysconfig/protocolconfig/httpconfig/allow-repository-anonymous-access/text()',
                     l_value,
                     'xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd"')
      INTO l_configxml
      FROM dual;
  END IF;

  dbms_xdb.cfg_update(l_configxml);
  dbms_xdb.cfg_refresh;
END;

重启数据库后检查epgstat:
epgstat

打开匿名访问权限是存在安全风险的,最好是设置一下各目录的访问权限。如果设置匿名访问仅仅是为了避免弹出认证窗口,则不妨直接修改根路径的映射。如:

alter session set current_schema = XDB;

begin
    dbms_epg.create_dad('APEX','/*');
    dbms_epg.set_dad_attribute('APEX','database-username','ANONYMOUS');
    dbms_epg.set_dad_attribute('APEX','default-page','apex');
    dbms_epg.set_dad_attribute('APEX','document-table-name','wwv_flow_file_objects$');
    dbms_epg.set_dad_attribute('APEX','document-path','docs');
    dbms_epg.set_dad_attribute('APEX','nls-language','american_america.al32utf8');
    dbms_epg.set_dad_attribute('APEX','document-procedure','wwv_flow_file_mgr.process_download');
    dbms_epg.set_dad_attribute('APEX','request-validation-function','wwv_flow_epg_include_modules.authorize');
end;
/

这样配置,就可以直接从根路径访问APEX应用了。

参考:
1. 官方文档《Oracle® XML DB Developer’s Guide》中“Anonymous Access to Oracle XML DB Repository using HTTP”章节。
2. OTN Forum: http://forums.oracle.com/forums/thread.jspa?threadID=641846&start=0&tstart=0


Sep 20 2009

APEX:在系统后台跑PL/SQL

Category: APEXZeeno @ 08:13

在一个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的新特性。