☰
Oracle APEX低代码开发实战:从环境搭建到Tabular Form多行处理
2026/10/14 7:50:20 网站建设 项目流程

简介:面向希望快速上手 Oracle APEX 的开发者与项目团队,这份《Oracle APEX深入浅出》开发指南以单一 doc 文档打包(共 1 个文件,约 8.11MB),系统覆盖了从环境搭建、账户管理、页面设计、控件使用到 Report 增删改、图表报表、文件上传下载、CSS/JS 客户端交互等完整知识点,并延伸至 APEX 与 EBS 集成、部署及调试技巧等进阶主题。内容按 APEX 系统探究、APEX 开发、APEX 调试与常用技巧、EBS 集成等章节组织,目录层级清晰,便于逐个模块阅读或按需检索。目前已有 1592 人学习下载,既适合刚接触 APEX 的入门者建立知识框架,也适合在 Oracle 生态中构建 Web 应用的工程师作为日常参考。读者可从中获得清晰的开发路径、关键功能的实操说明、常见问题的解决思路,以及面向 Oracle EBS 集成与 APEX 部署的进阶指引,降低从安装配置到发布集成的学习门槛。

1. Oracle APEX 深入浅出:一套被低估的企业级快速开发框架

Oracle APEX 这套东西,我最早接触是在做 EBS 二开的时候。当时被 Form 开发折腾得够呛,直到有人甩给我一份 APEX 开发指南,我才意识到:原来基于 Web 的即时开发可以这么轻——所有页面对象全部存在数据库里,浏览器只是通道,不需要装任何客户端。这份指南覆盖了从环境搭建、账户体系、页面布局、控件、报表到 EBS 集成的完整路径,适合三类人:被 Oracle 生态绑定的 ERP 二开工程师、想用低代码方案快速交付内部系统的团队、以及刚接触 APEX 想知道它边界在哪里的新手。别把它当成普通 PPT 式教程,里面的安装踩坑和 Tabular Form 多行增删改思路,放到现在依然能打。

2. 环境搭建与账户体系:从 3.0 升级到 4.2.5 的完整路径与账户三层结构

2.1 嵌入式 PL/SQL 网关:为什么 11g 上首选它

文档里明确区分了两类安装方式:10g 必须配 mod_plsql 或 APEX Listener,而 11g Release 1/2 自带嵌入式 PL/SQL 网关,配置最简单。我实际跑下来也是这个结论——嵌入式网关不需要额外起一个 Java 进程,直接走数据库内置的 HTTP 服务,对资源紧张的内网服务器特别友好。

安装文件用当时的 Apex_4.2.5.zip,下载后解压到$ORACLE_HOME下。需要注意 11g 自带 APEX 3.0,必须先卸载再装 4.2.5。卸载脚本在解压目录的apex子目录里执行,跑完后老版本的对象会被清掉。常见做法是:

cd $ORACLE_HOME/apex sqlplus / as sysdba SQL> @apxremov.sql

这个脚本会删除 3.0 版本的所有 APEX 对象。跑完不要急着装新版,先确认无残留后再继续。我一般会顺手查一下DBA_OBJECTS里还有没有APEX_030200相关的对象,有就手动清理,否则后面授权登录会出玄学问题。

2.2 表空间与安装参数:照着做就不会返工

安装前需要准备独立表空间。文档给的路径是/d01/oracle/[SID]/db/apps_st/data/apex01.dbf,这个路径要按你实际的 Oracle 数据文件目录改。表空间大小建议直接给到 1G 以上,因为后续会装中文语言包,而且 APEX 的元数据表会持续膨胀。

CREATE TABLESPACE apex01 DATAFILE '/u01/app/oracle/oradata/ORCL/apex01.dbf' SIZE 200M AUTOEXTEND ON NEXT 100M MAXSIZE 2000M;

注意MAXSIZE别设太小。我第一次装的时候设了 1000M,后来跑了半年多报表应用,表空间涨到 95% 才意识到不够。APEX 的表不算大,但审计日志、会话状态、上传的文件都会往里面塞。

安装主脚本是apexins.sql,参数格式为tablespace_apex tablespace_files tablespace_temp images_url。文档里用的是嵌入式网关,所以 images 走的是/i/虚拟目录:

cd $ORACLE_HOME/apex sqlplus / as sysdba SQL> @apexins.sql SYSAUX SYSAUX TEMP /i/

这里三个表空间参数,第一个是 APEX 主要对象存放表空间,第二个是 Oracle 相关文件表空间,第三个是临时表空间。生产环境别把 APEX 对象放在 SYSAUX 以外的业务表空间里,避免跟业务数据抢 IO。

安装完成后要设置 ADMIN 用户密码,文档特别强调:必须包含大写 + 小写 + 特殊符号 + 数字,长度不要太短。这是 APEX 4.2 的强密码策略,设置太简单会直接拒绝。同时要解锁APEX_PUBLIC_USER和ANONYMOUS账户:

ALTER USER APEX_PUBLIC_USER ACCOUNT UNLOCK; ALTER USER ANONYMOUS ACCOUNT UNLOCK;

APEX_PUBLIC_USER是 APEX 引擎访问数据库的桥梁账户,锁住会导致页面 500。ANONYMOUS负责公开页面和静态资源访问,也是必须解锁的。

2.3 嵌入式网关配置与中文语言包

安装完接着配置嵌入式 PL/SQL 网关的 HTTP 端口和虚拟目录映射。文档里用的端口是 8888,映射路径为/apex。配置入口在apex_epg_config.sql,需要指定一个虚拟目录的物理路径:

cd $ORACLE_HOME/apex sqlplus / as sysdba SQL> @apex_epg_config.sql /tmp/

这里传入的目录是 XDB 存放静态文件的虚拟路径,随便指定一个存在的目录即可,APEX 会把/i/开头的请求映射过去。如果配置后访问返回 404,常见原因是 XDB 的 HTTP 服务没启动:

-- 启动 HTTP 服务 EXEC DBMS_XDB.SETHTTPPORT(8888);

完成后通过http://server:8888/apex/apex_admin访问管理员界面,普通开发入口是http://server:8888/apex。

中文语言包是可选安装项。如果团队里开发人员英语水平参差不齐,建议装。解压语言包后执行:

cd /tmp/apex_zh_cn sqlplus / as sysdba SQL> @apex_zh_install.sql

装完后管理员界面和开发界面的语言选项里会出现中文。注意语言包版本必须和 APEX 主版本完全一致,跨小版本装会报对象无效。

2.4 账户三层结构:ADMIN、Workspace 与开发者的关系

APEX 的账户体系很容易跟数据库账户搞混。文档里画了一张关系图,核心逻辑是:ADMIN 是超级管理员,负责创建 Workspace;Workspace 对应数据库里的一个 Schema,可以理解为「一个工程项目」;Workspace 内部再创建 Developer 和 End User 账户。

用 ADMIN 登录后创建 Workspace 时,关键参数是 Schema 名。比如要和 EBS 集成,Schema 就填APPS——这个 Schema 必须是数据库中真实存在的用户,APEX 会通过它访问对应的表、视图和存储过程。

登录时用哪个账户,决定看到的是「开发界面」还是「运行界面」:Developer 登录后能看到页面设计器、属性面板、调试工具;End User 登录后只能看到运行中的应用,无法进入编辑模式。这个权限隔离在项目上非常实用,交付给业务部门后,只给 End User 账户,改不了页面结构。

3. 页面布局与 Grid Layout:把 TABLE 网格讲透再动手配 Region

3.1 从 HTML 的 TABLE 到 APEX 的三层配置

APEX 页面布局的底层逻辑是 HTML 的<TABLE>结构。每个 Region 最终渲染成<TD>,一组 Region 共用一张<TABLE>。文档把它抽象成了三个配置项:Start New Grid、Start New Row、Column。

用表格说明这三个参数的关系:

配置项对应 HTML 元素含义举例
Start New Grid<TABLE>是否开启一张新表格布局三个 Region 想左右排,第一个值为 Yes,后面的为 No
Start New Row<TR>是否在新的一行开始第一行放一个宽的,第二行放两个窄的
Column<TD>当前 Region 位于该行的第几列一行三列,列号分别是 1、2、3

这个设计在 4.2.5 版本里比 4.1.1 灵活得多。文档里也吐槽了 4.1.1 的 Column 属性是全局的,没法对子区域单独控制,升级到 4.2.5 后终于可以对「子子区域」重新布局了。

3.2 实战:六个 Region 组成两行两列的业务查询区

文档里给了一个很典型的布局案例:第一行放 Search1、Search2、Search3 三个区域,第二行放 New Search1、New Search2、New Search3 三个区域。配置只需要六个 Region 的网格属性:

Search1: Start New Grid = Yes, Start New Row = Yes, Column = 1 Search2: Start New Grid = No, Start New Row = No, Column = 2 Search3: Start New Grid = No, Start New Row = Yes, Column = 2 New Search1: Start New Grid = Yes, Start New Row = Yes, Column = 1 New Search2: Start New Grid = No, Start New Row = No, Column = 2 New Search3: Start New Grid = No, Start New Row = No, Column = 3

关键逻辑在第一行:三个 Region 属于同一张 TABLE,所以只有 Search1 开新网格;Search2 跟在 Search1 右边,所以不开新行;Search3 因为要换到下一行,所以Start New Row = Yes但不开新网格。第二行同理,New Search1 开新网格,其余两个顺延排列。

这一块建议动手配的时候,先在草稿纸上画出目标布局,标出每个 Region 的网格归属,再对应填属性。别直接在页面上凭感觉试——翻车率极高,尤其是复杂布局。

3.3 嵌套 Region:子区域也参与网格布局

嵌套 Region 的布局是 4.2.5 的亮点。在 New Search2 里再建子区域,子区域同样有独立的 Grid Layout 配置。文档里的例子是三个子区域:newsearch_subpage1、new_search3_subpage2、new_search3_subpage3,列号配置为 1、2、1,通过Start New Row来控制换行。

这里容易踩的坑是:如果没有先创建父 Region 再创建子 Region,子 Region 的「Parent Region」属性不会自动指向父级,就会飘到页面底部去。正确做法是先建父 Region 并选中它,再在页面上右键子区域添加。

4. 控件、校验与 Dynamic Action:Page 2 实例从创建到跑通

4.1 控件属性里的高频项:从宽度到只读条件

APEX 控件的属性面板很厚,但实际开发中高频使用的就是文档里列的这些:Form Element Width控制控件宽度,Value Required控制是否必填,Default Value设置默认值,Format Mask做格式格式化,Read Only Condition Type控制只读条件,Condition Type控制控件是否显示。这些都属于「声明式配置」,不需要写代码就能完成大部分表单逻辑。

真正有分量的两个功能是校验(Validation)和动态动作(Dynamic Action)。

校验解决的是「什么时候校验、校验什么、错了在哪显示」。文档里的实例是点击 Search2 Btn 时校验 P1_X_TEXT 是否为空,但校验的前提条件是jjl_test表里存在user_id='123'的记录——也就是说,只有满足这个前置条件,校验才会触发。这在业务场景里很常见:某些字段只在特定状态下才要求必填。

4.2 手写 PL/SQL 校验表达式

文档里的校验配置为:

  • Condition Type:Exists (SQL query returns at least one row)
  • Condition Expression:select 1 from jjl_test jt where jt.user_id='123'
  • Validation Type:Function Returning Boolean
  • Validation Expression:
begin if :P1_X_TEXT is not null then return true; end if; return false; end;

注意这个校验表达式的执行逻辑:先跑前面的 Condition 判断是否满足前置条件,满足后才会执行 Validation Expression。P1_X_TEXT是页面项,在 PL/SQL 表达式里用冒号前缀引用,这是 APEX 的绑定变量机制。Function Returning Boolean类型要求返回值必须是 TRUE 或 FALSE,return true表示校验通过,不满足条件直接return false就会报错并显示Error message里的内容。

4.3 Dynamic Action:无刷新操作的灵魂

Dynamic Action 是 APEX 里最像「前端交互」的能力,本质是在浏览器端捕获事件,然后触发服务端或客户端的动作,整个过程不刷新页面。文档中的例子是实现「当 P2_X_TEXT 不为空时,隐藏 New Search2 区域,否则显示」。具体配置如下:

  • 事件:Change,选择类型Item(s),指定P2_X_TEXT
  • 条件:is not null
  • True Actions:Hide Region(目标选 New Search2)
  • False Actions:Show Region(目标选 New Search2)

这个操作不用写一行 JavaScript,全部通过界面配置完成。它的底层是 APEX 生成的 AJAX 请求,所以页面不会闪。类似的页面加载时给日期控件赋当前值的场景,也是在 Dynamic Action 里选Page Load事件,True Action 选Set Value,SQL Statement 填select sysdate from dual。

4.4 跑通整个实例的完整步骤

我按照文档里的操作序列完整走了一遍,实际步骤是八步:

  1. 创建一个新页面,命名为 Page2,模板选默认的Optional Sidebar或Blank均可。
  2. 以APPS账户登录数据库,创建测试表和测试数据:
CREATE TABLE jjl_test ( user_id VARCHAR2(50), resp_id VARCHAR2(50), resp_appl_id VARCHAR2(50), login_name VARCHAR2(50), login_count NUMBER, login_date DATE ); INSERT INTO jjl_test VALUES ('123', '', '', '', 1, SYSDATE); COMMIT;
  1. 在 Page2 里创建六个 HTML Region,父区域全部选择Page Template Body(1),确保它们在主内容区而不是侧边栏。
  2. 配置第一层的三个区域网格属性,按 3.2 节的表格设置。
  3. 配置第二层的三个区域网格属性,同样按 3.2 节的表格设置。
  4. 在 Search1 区域创建两个 Text Field:P1_X_TEXT 和 P2_X_TEXT;在 Search2 区域创建 Button SEARCH2_BTN;在 Search3 区域创建 Date Picker DATA。
  5. 右键 P1_X_TEXT 创建 Validation,配置 4.2 节所示的属性,错误消息填X_TEXT1 can't be null。
  6. 右键 P2_X_TEXT 创建 Dynamic Action,按 4.3 节配置 Hide/Show 动作。

跑通后你会看到:页面加载时 DATA 自动填充当天日期;P1_X_TEXT 为空时点 SEARCH2_BTN 直接报错不跳页;清空或填写 P2_X_TEXT 时下方区域实时隐藏和显示。这套组合拳就是 APEX「声明式开发」的核心体验。

5. APEX 安装与开发避坑:五条值得写进团队 Wiki 的踩坑记录

5.1 旧版本残留账户导致 ADMIN 登录授权失败

现象:装完 4.2.5,访问apex_admin输入 ADMIN 密码后,提示无法通过登录授权认证。反复改密码、重启数据库都没有改善。

原因:此前通过apxremov.sql卸载了 3.0 版本,但APEX_030200的遗留用户没有被彻底清理。APEX 引擎在验证 ADMIN 登录时,授权连接串走了旧的版本校验逻辑,导致新版本元数据对不上。

解决:执行以下查询确认残留用户:

SELECT username FROM dba_users WHERE username LIKE 'APEX_%';

把 3.0 版本的遗留用户全部 drop 掉:

DROP USER APEX_030200 CASCADE;

注意别手误把APEX_040200也 drop 了——文档里作者就翻过这个车,后面只能重装。

5.2 误删 APEX_040200 只能重装

现象:清理旧版本账户时,一条DROP USER APEX_040200 CASCADE把新版本的引擎账户也删了。之后 APEX 管理界面全部 500,重启数据库无效。

原因:APEX 引擎本身由APEX_040200用户承载,删除它等于把整个引擎删了,任何页面请求都无法路由到 PL/SQL 处理逻辑。

解决:没有后悔药,只能从头跑一遍apexins.sql重新安装。这也是为什么文档里作者建议执行任何DROP USER之前,先核对用户名前缀。从那以后,我每次清理 APEX 相关用户都会先把dba_users的结果截图存档再动手。

5.3 中文语言包版本不一致导致界面英文混杂

现象:安装完中文语言包后,部分页面显示中文,部分页面仍然显示英文,控制台报ORA-20001错误。

原因:语言包版本和 APEX 主版本不匹配。APEX 4.2.5 必须用 4.2.5 对应的apex_zh_cn_install.sql,跨版本的语言包会导致翻译表无法正确挂载。

解决:在安装语言包之前先确认apex_version视图里的版本号,下载严格匹配的语言包。卸载语言包重新装一遍也能修复。

5.4 Grid Layout 配置后 Region 乱飞

现象:按照文档配置了三个 Region 的网格属性,运行页面时 Region 全部堆在页面底部,或者错位重叠,完全不是预期的两行排列。

原因:三层属性相互约束,优先级是 Start New Grid 大于 Start New Row 大于 Column。如果有多个 Region 都设置了Start New Grid = Yes,它们会被分到不同的 TABLE 里,即使 Column 都配成 1,也不会在同一行显示。另外,Region 的「Parent Region」如果没设置到 Body,会被渲染到侧边栏区域。

解决:重新打开每个 Region 的 Grid Layout 属性,按 3.2 节的规则逐项核对。

5.5 Tabular Form 的 View 里改了字段但界面不生效

现象:在 APEX 的 Tabular Form 里,页面上显示的列还是旧的,无法刷新出新加的字段。

原因:Tabular Form 的数据源 SQL 是从底层视图读取的,APEX 会缓存列定义到元数据表中,视图结构调整后不会自动同步。

解决:在页面设计器里选中 Tabular Form 区域,右键选择「刷新区域定义」,APEX 会重新读取数据源中的列信息。如果是视图本身加了新列,还需要检查对应字段是否被勾选为「显示」状态。

6. Tabular Form 多行增删改:基于 View + Process 处理客户化校验

Tabular Form 是 APEX 里少数能做到「不跳页维护多行数据」的功能,特别适合批量修改后统一提交的场景。它强依赖底层 View 的可更新性,所以在业务中我一般会在视图层面做好多表关联和字段过滤,APEX 页面只负责展示和校验。文档里的完整业务场景是:在页面上同时修改class_name和login_name,提交时校验class_name是否存在于另一张表,存在才允许更新并把勾选的记录插入历史表。核心实现是页面上的Apply Change按钮绑定一个 PL/SQL Process,逻辑可以写成这样:

BEGIN FOR i IN 1..apex_application.g_f01.COUNT LOOP -- 勾选的记录会通过 f01 数组传递主键 IF apex_application.g_f01(i) IS NOT NULL THEN -- 校验 class_name 是否存在 SELECT COUNT(*) INTO v_cnt FROM jjl_class c WHERE c.class_name = :P2_CLASS_NAME; IF v_cnt = 0 THEN RAISE_APPLICATION_ERROR(-20001, 'Class name: ' || :P2_CLASS_NAME || ' not exist in jjl_class'); END IF; -- 更新 login_name UPDATE jjl_test2 SET login_name = :P2_LOGIN_NAME WHERE resp_id = apex_application.g_f01(i); -- 插入另一张表 INSERT INTO jjl_test3(user_id, login_name, class_name) VALUES (:P2_USER_ID, :P2_LOGIN_NAME, :P2_CLASS_NAME); END IF; END LOOP; COMMIT; END;

核心在于apex_application.g_f01数组:Tabular Form 的每一行在提交时都会把勾选状态和主键序列化到这个全局数组里,g_f01存的是第一列隐藏项的值,通常放主键。循环遍历它就能精确判断哪些行被用户勾选了。RAISE_APPLICATION_ERROR会终止整个 Process 并回滚事务,错误信息会直接显示在页面上,这个机制保证了「要么全成功,要么不动数据」。

这个设计在批量审核、批量分配场景下非常实用。比如我给某公司做一个费用报销审批页面,几十条明细一次勾选、一键校验、统一更新状态,整个过程零刷新。这比传统的一次打开一条记录去改,效率提升了不止一个量级。从那以后,我每次遇到「多行批量操作 + 业务校验」的需求,第一反应就是 Tabular Form + Process 这套组合,而不是去折腾自定义 AJAX。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询