Oracle APEX低代码开发实战:从环境搭建到Tabular Form多行处理

发布时间:2026/10/14 7:50:23
Oracle APEX低代码开发实战:从环境搭建到Tabular Form多行处理
简介面向希望快速上手 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 是超级管理员负责创建 WorkspaceWorkspace 对应数据库里的一个 Schema可以理解为「一个工程项目」Workspace 内部再创建 Developer 和 End User 账户。用 ADMIN 登录后创建 Workspace 时关键参数是 Schema 名。比如要和 EBS 集成Schema 就填APPS——这个 Schema 必须是数据库中真实存在的用户APEX 会通过它访问对应的表、视图和存储过程。登录时用哪个账户决定看到的是「开发界面」还是「运行界面」Developer 登录后能看到页面设计器、属性面板、调试工具End User 登录后只能看到运行中的应用无法进入编辑模式。这个权限隔离在项目上非常实用交付给业务部门后只给 End User 账户改不了页面结构。3. 页面布局与 Grid Layout把 TABLE 网格讲透再动手配 Region3.1 从 HTML 的 TABLE 到 APEX 的三层配置APEX 页面布局的底层逻辑是 HTML 的TABLE结构。每个 Region 最终渲染成TD一组 Region 共用一张TABLE。文档把它抽象成了三个配置项Start New Grid、Start New Row、Column。用表格说明这三个参数的关系配置项对应 HTML 元素含义举例Start New GridTABLE是否开启一张新表格布局三个 Region 想左右排第一个值为 Yes后面的为 NoStart New RowTR是否在新的一行开始第一行放一个宽的第二行放两个窄的ColumnTD当前 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 ActionPage 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_id123的记录——也就是说只有满足这个前置条件校验才会触发。这在业务场景里很常见某些字段只在特定状态下才要求必填。4.2 手写 PL/SQL 校验表达式文档里的校验配置为Condition TypeExists (SQL query returns at least one row)Condition Expressionselect 1 from jjl_test jt where jt.user_id123Validation TypeFunction Returning BooleanValidation Expressionbegin 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 或 FALSEreturn 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 nullTrue ActionsHide Region目标选 New Search2False ActionsShow Region目标选 New Search2这个操作不用写一行 JavaScript全部通过界面配置完成。它的底层是 APEX 生成的 AJAX 请求所以页面不会闪。类似的页面加载时给日期控件赋当前值的场景也是在 Dynamic Action 里选Page Load事件True Action 选Set ValueSQL Statement 填select sysdate from dual。4.4 跑通整个实例的完整步骤我按照文档里的操作序列完整走了一遍实际步骤是八步创建一个新页面命名为 Page2模板选默认的Optional Sidebar或Blank均可。以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;在 Page2 里创建六个 HTML Region父区域全部选择Page Template Body(1)确保它们在主内容区而不是侧边栏。配置第一层的三个区域网格属性按 3.2 节的表格设置。配置第二层的三个区域网格属性同样按 3.2 节的表格设置。在 Search1 区域创建两个 Text FieldP1_X_TEXT 和 P2_X_TEXT在 Search2 区域创建 Button SEARCH2_BTN在 Search3 区域创建 Date Picker DATA。右键 P1_X_TEXT 创建 Validation配置 4.2 节所示的属性错误消息填X_TEXT1 cant be null。右键 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。希望帮到你。本文还有配套的精品资源点击获取