简介:《Oracle APEX深入浅出》是一份面向企业级Web应用开发者与Oracle技术学习者的中文开发指南,围绕APEX快速构建业务系统这一目标,系统梳理从环境搭建到部署集成的完整知识链路。压缩包内为1个doc文档,约8.11MB,以图文编排的开发手册形式呈现,便于检索与对照实践。内容覆盖APEX系统探究、账户与权限管理、页面布局美化、常用控件、Report增删改、文件上传下载、CSS与JS应用、图表报表、插件使用及APEX部署等主题,并延伸到调试技巧、常用API与EBS集成场景,配有目录结构和章节编号,适合按模块循序渐进学习或作为项目开发时的查阅手册。已有1593人学习,对需要理解APEX开发流程、控件与报表实现、权限配置及系统集成的读者具有较高参考价值。
1. Oracle APEX 深入浅出这件事,多数人卡在第 0 步——环境装不起来
把 Oracle APEX 深入浅出地走一遍,是很多做 Oracle ERP 二开的人绕不开的一课,但真正让人卡住的从来不是页面怎么排、控件怎么配,而是第一关:环境装不起来。APEX 不是独立中间件,它整个住在数据库里,靠一堆 PL/SQL 对象和几张表撑着,装的时候还要处理 11g 自带的老版本、解锁灰掉的账户、把 HTTP 网关挂到 8888 端口上。任何一步顺序错了,你打开http://server:8888/apex/apex_admin看到的就是一个能显示、却怎么也登不进去的登录框。
我见过太多人在这里反复改 ADMIN 密码、重启数据库、重装实例,最后把 APEX_040200 一起 drop 掉,血泪经验。这篇记录针对的是 Oracle Database 11g + APEX 4.2.5 这套组合,适合正在做 Oracle ERP/EBS 二开、想用 APEX 快速搭企业级页面的开发者,也适合接手别人装了一半的环境、需要把它救活的人。
2. 装前环境清点:表空间、网关路线和那个必须卸掉的 3.0
装 APEX 之前,真正决定后面顺不顺的其实只有三件事:HTTP 请求从哪条路进数据库、表空间建在哪个目录、以及 11g 自带的 APEX 3.0 卸没卸干净。这三件事的取舍在前面想清楚,后面就是照着脚本敲;想不清楚,后面每一步都会返工。
2.1 先定 HTTP 链路:嵌入式 PL/SQL 网关还是独立监听器
APEX 的请求路径很简单:浏览器发 URL,HTTP 监听程序把请求交给数据库里的 APEX 引擎,引擎跑 PL/SQL,结果通过SYS.HTP.P以 HTML 吐回浏览器。所以架构上你只需要回答一个问题——谁来当这个 HTTP 监听程序。
正文里给出的两条路线是这样的:
| 场景 | 走法 | 代价 |
|---|---|---|
| Oracle Database 11g R1/R2 | 嵌入式 PL/SQL 网关(XDB 自带 HTTP 服务) | 配置最少,直接提供 HTTP 能力,端口可自定义 |
| Oracle Database 10g | mod_plsql 插件,或独立 APEX Listener 挂专业 HTTP 服务器 | 需要额外装 Apache/Listener,配置链路长 |
| 开发机、单机验证 | 嵌入式网关 | 与数据库同生共死,库停了页面就 404 |
我们这次是 11g,选嵌入式网关,理由是它不需要额外进程,不用装 Apache,不用维护 DAD 之外的任何配置文件——对一台装完就挂起、下次接着用的开发虚拟机来说,这是成本最低的方案。代价也要认清楚:它跟数据库实例绑死,DBMS_XDB的 HTTP 服务一旦没起来,整个 APEX 就是 404,而后面的排查章节会反复回到这一点。
我一般会在动手前先确认 XDB 组件是装好的,因为DBMS_EPG、DBMS_XDB这些包如果缺,后面apxconf.sql会直接报编译错误:
-- 确认 XDB 组件已安装,返回 VALID 才能走嵌入式网关这条路 SELECT comp_name, status, version FROM dba_registry WHERE comp_id = 'XDB';这条查询返回VALID说明 HTTP 服务的基础设施齐了。如果返回空或者INVALID,别急着往下走,先把 XDB 组件补装,否则后面配 DAD 那一步必然失败。
2.2 表空间和文件目录:CREATE TABLESPACE 里的三个参数
APEX 需要两个表空间:一个放 APEX 自己的元数据表,一个放应用里上传的静态文件(图片、导出文件、附件)。演示环境下把这两个合成一个也行,但生产上我建议分开——文件表空间长得快,混在一起以后不好做限额和迁移。
-- 创建 APEX 元数据表空间,路径按实际数据文件目录替换 CREATE TABLESPACE apex01 DATAFILE '/d01/oracle/ORCL/db/apps_st/data/apex01.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE 1000M;三个参数值得说清楚:
DATAFILE的路径必须落在数据库实例自己的数据文件目录下,别随手写到/tmp或者$ORACLE_HOME里,否则后面做 RMAN 备份、做表空间迁移时会被漏掉。SIZE 100M是初始大小,APEX 4.2 的元数据装完大约几十兆,100M 起步够了。AUTOEXTEND ON NEXT 100M MAXSIZE 1000M是关键。不写MAXSIZE,自动扩展会一直吃盘,直到把挂载点写满、数据库直接挂掉;写了 1000M,空间告警会提前出现在dba_data_files里,你还有时间处理。
提示:MAXSIZE 别设得跟磁盘剩余空间一样大。留出 20% 余量给 UNDO 和 REDO,比事后清盘容易得多。
建完顺手查一下确认:
-- 确认表空间已 ONLINE 且自动扩展配置生效 SELECT tablespace_name, status, autoextensible, maxbytes/1024/1024 AS max_mb FROM dba_data_files WHERE tablespace_name = 'APEX01';2.3 卸掉 11g 自带的 APEX 3.0,顺序不能反
这一步是整套安装里最容易搞反顺序的地方。Oracle Database 11g 自带 APEX 3.0(对应数据库用户APEX_030200),你要装 4.2.5,就必须先把旧的清掉,否则新装的对象和旧对象在同一套 schema 命名空间里打架,表现出来就是登录认证走的是旧版本的校验逻辑——这个问题在第 5 章会单独讲。
正确的顺序是:先跑卸载脚本,再清目录,再建新表空间,最后装新版。
# 进入 11g 自带的 apex 目录,跑官方卸载脚本 cd $ORACLE_HOME/apex sqlplus / as sysdba @apxremov.sql # 卸载完成后确认旧用户已经不在了,再清空目录内容 sqlplus -S / as sysdba <<'EOF' SELECT username FROM dba_users WHERE username LIKE 'APEX%'; EOF # 确认 3.0 的 schema 已消失后,清空原 apex 目录 rm -rf $ORACLE_HOME/apex/*apxremov.sql会 drop 掉 APEX 相关的数据库用户和同义词,跑完之后必须再用那条查询确认一遍。我踩过一次坑:脚本中途报了一个 PL/SQL 错误但继续执行完了,看起来"跑完 OK",实际上APEX_030200还留在dba_users里。所以这条确认查询不是可选项,是必做项。
清空目录这一步也有讲究。rm -rf $ORACLE_HOME/apex/*要在卸载完成之后执行,因为卸载脚本本身就在这个目录里;顺序颠倒直接把自己要执行的脚本删了。清完再解压 4.2.5 的安装包进去,目录结构才干净。
3. 安装 APEX 4.2.5:从解压到 8888 端口能开页
这一章是整套环境的落地主体。装 APEX 的动作本身不多,四五个脚本,但每个脚本的参数含义、执行用户、执行顺序都得对上,中间任何一个环节用了错误的 schema 执行,后面就得从头再来一遍,包括重新建表空间。
3.1 传包解压与 apexins.sql 的四个入参
把apex_4.2.5.zip上传到$ORACLE_HOME下,解压后得到apex目录。安装脚本是apexins.sql,它接受四个位置参数:
cd $ORACLE_HOME/apex sqlplus / as sysdba -- 四个参数:APEX 表空间、文件表空间、临时表空间、静态文件 URL 前缀 @apexins.sql APEX01 APEX01 TEMP /i/四个参数逐个说:
- 第一个
APEX01:APEX 元数据表放哪。就是我们前面建的那个表空间。 - 第二个
APEX01:上传文件(附件、导出、静态资源)放哪。演示环境合并成一个,生产上建议单独建APEX_FILES。 - 第三个
TEMP:安装过程会用到的临时表空间。别写成TEMP1或者自定义名字之前先确认它确实存在且 ONLINE。 - 第四个
/i/:静态图片资源的 URL 前缀。这个值一旦写错,装完页面能出来,但所有图标全是红叉。装完之后它可以改(在实例设置里),但重装一次的成本远高于一开始写对。
这个脚本跑的时间不算短,中间会持续输出建表、编译包的日志。判断成功与否不看最后一行,看有没有ERROR关键字:
# 安装过程重定向到日志,事后按 ERROR 过滤,比翻屏靠谱 sqlplus / as sysdba @apexins.sql APEX01 APEX01 TEMP /i/ > /tmp/apexins.log 2>&1 grep -i "error\|ORA-" /tmp/apexins.log | head -20grep出来如果只有零星几行ORA-00942: table or view does not exist,通常是脚本在 drop 不存在的对象,属正常;如果出现大量ORA-04021(等待对象锁超时)或者PLS-编译错误,那就是真有东西没装对,得看日志上下文。
3.2 ADMIN 改密与两个账户的解锁
安装脚本跑完,APEX 的管理员账户ADMIN就存在了,但密码是过期的、匿名账户和公共账户是锁着的。这三件事必须在能登录之前一次性处理完。
-- ADMIN 账户改密,密码必须足够复杂:大小写+数字+特殊符号 ALTER USER ADMIN IDENTIFIED BY "Apex#2024_Adm"; -- 解锁匿名账户,APEX 的公开页面靠它渲染 ALTER USER ANONYMOUS ACCOUNT UNLOCK; -- 解锁公共账户,网关以它的身份连接数据库执行请求 ALTER USER APEX_PUBLIC_USER ACCOUNT UNLOCK;三行各有各的作用,缺一个都会在后面出问题:
ADMIN的密码复杂度不是建议,是硬要求。APEX 4.2 的登录策略会校验密码强度,设成纯小写或者纯数字,改密语句能成功,但登录时会被判为弱密码拒绝。常见做法就是大写、小写、数字、特殊符号各来一点,长度拉到 12 位以上。ANONYMOUS锁着的时候,登录页本身能打开(因为它走的是APEX_PUBLIC_USER),但任何不需要认证的公开页会报错。这个账户平时不起眼,出事的时候表现得很玄学——页面时好时坏。APEX_PUBLIC_USER是网关连接数据库用的账户,锁着的话表现就是 HTTP 404 或者 503,看日志才知道是登录被拒。安装脚本有时不会自动解锁,手动执行一遍最稳。
3.3 中文语言包:装完再装,别和主安装混在一起
主安装成功后,中文界面是可选的第二步,位置在apex/builder/zh-cn/目录下:
cd $ORACLE_HOME/apex/builder/zh-cn sqlplus / as sysdba @load_zh-cn.sql这一步必须在apexins.sql完全成功之后执行,因为它依赖主安装建好的那些表和包。执行完之后,语言不是立刻生效的——还要以ADMIN登录管理界面,在实例级别把默认语言改成简体中文,或者给每个 Workspace 单独设语言偏好。
注意:语言包可以重复执行,不会破坏已有数据,但如果你的主安装中途失败过,先解决主安装,别指望靠重跑语言包把问题盖住。
3.4 嵌入式 PL/SQL 网关:DAD 与 8888 端口
这是整套安装里"最容易漏配、也最容易误判"的一段。要让浏览器访问到 APEX,需要三样东西同时就位:一个 DAD(Database Access Descriptor)把 URL 路径映射到数据库账户、一个 HTTP 端口在监听、以及允许远程主机连进来。
DAD 的配置,APEX 4.2 提供了脚本apxconf.sql,跑起来是交互式的:
cd $ORACLE_HOME/apex sqlplus / as sysdba @apxconf.sql # 交互过程中会提示输入 APEX_PUBLIC_USER 的密码 # 遇到 "Enter values below for the XDB HTTP listener port" 时填 8888如果不想走交互,或者想重复执行、脚本化,直接用DBMS_EPG手工建也可以,我一般倾向后者,因为参数都在明面上:
BEGIN -- 建立 DAD,把 /apex/* 这个路径前缀映射到数据库 DBMS_EPG.CREATE_DAD('APEX', '/apex/*'); -- 指定网关连库用的账户 DBMS_EPG.SET_DAD_ATTRIBUTE('APEX', 'database-username', 'APEX_PUBLIC_USER'); -- 文档根目录设为 /i/,对应安装时的第四个参数 DBMS_EPG.SET_DAD_ATTRIBUTE('APEX', 'document-root', '/i/'); -- 连接池下限,开发机上 1 够用,并发高时调到 5~10 DBMS_EPG.SET_DAD_ATTRIBUTE('APEX', 'max-conn', '10'); COMMIT; END; /四个属性里,database-username写错是最常见的——写成APEX_040200也能建成功,但请求进来会以 APEX 自己的 schema 身份跑,权限模型完全不同,页面表现是各种莫名其妙的"表或视图不存在"。document-root对应apexins.sql的/i/,两处必须一致。
端口和远程访问:
-- 把 XDB 的 HTTP 服务端口改成 8888,避开可能的 8080 冲突 EXEC DBMS_XDB.SETHTTPPORT(8888); -- 允许非本机访问,虚拟机上装的话这一句必须执行 EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE); -- 注册服务到监听器 ALTER SYSTEM REGISTER;SETLISTENERLOCALACCESS(TRUE)是默认值,意味着只有数据库服务器本机能访问。你在宿主机浏览器里打不开页面、但在虚拟机内部curl却正常,八成就是这个开关没关掉。这是一个非常典型的"看起来装好了其实没装好"的状态。
最后确认端口在听:
# 8888 端口应该有监听,且进程是数据库实例 netstat -tlnp | grep 8888 # 本机自测,返回 302 或 200 都算通 curl -I http://127.0.0.1:8888/apex/apex_admin3.5 ACL 授权与三个初始化参数
11g 开始有网络访问控制(ACL),APEX 有些功能(比如调用外部 Web 服务、发邮件)需要以APEX_040200的身份往外连。安装文档里把这步叫 "Grant connect privileges to any host for the APEX_040200 database user",实际做法是:
BEGIN -- 创建一个 ACL 文件,把 connect 权限授给 APEX 自己的 schema DBMS_NETWORK_ACL_ADMIN.CREATE_ACL( acl => 'apex_net.xml', description => 'APEX outbound network access', principal => 'APEX_040200', is_grant => TRUE, privilege => 'connect'); -- 把 ACL 挂到所有主机上,开发环境图省事,生产上要收窄 DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL( acl => 'apex_net.xml', host => '*'); COMMIT; END; /host => '*'在开发环境可以接受,生产环境一定要改成具体域名或 IP 段,这跟安全基线直接相关。这步不做,页面本身没问题,但凡是涉及外部调用的功能都会报ORA-24247: network access denied by access control list (ACL)。
初始化参数方面,APEX 对数据库有几个软性要求,改完需要重启实例生效:
-- APEX 元数据查询会大量使用游标缓存,低于 50 会有明显卡顿 ALTER SYSTEM SET session_cached_cursors = 200 SCOPE = SPFILE; -- 每个页面请求都占用一个数据库会话,并发用户多的场景别用小值 ALTER SYSTEM SET processes = 300 SCOPE = SPFILE; -- APEX 内部有大量定时任务(邮件队列、工作流) ALTER SYSTEM SET job_queue_processes = 20 SCOPE = SPFILE; -- 以上三条都需要重启才生效 SHUTDOWN IMMEDIATE; STARTUP;session_cached_cursors是这里最容易被忽略、但对体感影响最大的一个。APEX 每渲染一个页面要跑几十上百条元数据查询,游标缓存不够时会频繁硬解析,页面打开速度肉眼可见地慢,而在AWR里又看不出明显瓶颈——这种问题只有改过参数前后对比才知道差别。
4. 账户体系落地:ADMIN、Workspace 和三种角色怎么建
装完能打开登录页,只是把"系统"跑起来了;把账户体系建对,才是把"工作环境"跑起来。APEX 的权限模型是三层:超级管理员管整个实例,Workspace 管一个项目,Developer 和终端用户管具体开发和使用。这三层搞混了,后面做 EBS 集成时会发现 schema 根本指不过去。
4.1 ADMIN 只做一件事:建 Workspace
ADMIN是实例级超级管理员,能创建、删除、修改 Workspace 以及 Workspace 的管理员。它的职责边界其实很窄——建工作空间、分配 schema、重置别人的密码,不参与具体应用开发。
以 ADMIN 登录http://server:8888/apex/apex_admin之后,创建 Workspace 时有三项要填:
- Workspace 名称:项目级的名字,比如按业务模块命名。这个名字后面会出现在登录 URL 和用户归属里,定了之后改起来麻烦,起名时想清楚。
- Schema:这个 Workspace 绑定的数据库 schema。做 EBS 集成开发的话,这里直接指向 EBS 的
APPSschema——这是原文里的做法,也是这套方案的关键点:APEX 页面直接操作 EBS 的表和视图,不需要再做数据同步。 - Workspace 管理员:这个 Workspace 的第一个管理者,不是 ADMIN,是项目级的管理员。
建完之后,系统会生成一个 Workspace 登录入口,路径形如/apex/f?p=4550。这个入口和apex_admin是两个不同的登录面,很多人第一次装完分不清,用 ADMIN 的密码去登 Workspace,当然是失败的。
提示:Workspace 绑定的 schema 一旦确定,尽量不要改。改 schema 相当于把所有应用的数据源换一遍,页面上所有基于该 schema 的报表、表单、LOV 全部要重新校验。
4.2 Workspace 里的三种角色,权限差别比想象中大
进到 Workspace 内部,角色分三种,创建入口在 Workspace 管理员的用户管理里:
| 角色 | 能做什么 | 不能做什么 |
|---|---|---|
| Workspace 管理员 | 建/删开发用户、改 Workspace 设置、管理应用 | 不直接改应用代码 |
| Developer | 创建和修改 Application、页面、共享组件 | 不能管其他开发者账号 |
| 终端用户(End User) | 登录运行业务应用、提交数据 | 看不到 App Builder 入口 |
新建开发用户时,用户名和邮箱是必填的,密码可以系统生成也可以手填。手填的话同样受复杂度策略约束,跟 ADMIN 改密是一个规则集。
这里有个实操细节值得记一笔:Developer 创建应用时,应用的解析 schema 默认继承 Workspace 的 schema,但也可以在应用级别单独指定。做 EBS 集成时我一般让应用级别显式指定APPS,而不是依赖继承——继承关系在后期换 Workspace 配置时会静默变掉,导致一堆报表突然查不到数据,排查起来像黑匣子。
4.3 把 Workspace、Application 和 EBS 的 Form 对上号
概念映射对做 Oracle ERP 二开的人特别重要,因为这决定了你该怎么切分应用:
- 一个Workspace对应数据库的一个 schema,可以理解成一个工程。
- 一个Application是这个工程里的子项目。在与 EBS 的集成开发里,一个 Application 大致对应 EBS 里的一个 Form,Form 里的多个窗口对应 Application 里的多个 Page。
- Page 0是整个 Application 的全局页,全局变量、全局常量都放这里。为了方便管理,我习惯把不同类型的变量放在 Page 0 下不同的区域里,这些区域设成不显示,效果类似于 HTML 里的 hidden 字段。
这个映射关系不是学术讨论,它直接影响 EBS 那边的挂载方式:EBS 里配置 APEX 页面调用,本质上是把一个 Function 指向 APEX 的 URL,用户点菜单,EBS 打开一个内嵌页面,页面里的 APEX 应用读写的还是APPSschema 的数据。所以 Application 切得太碎,EBS 那边就要挂一堆 Function;切得太粗,一个应用几十个页面,开发和部署都难管。
我一般的切法是按业务单据类型切,一张单据一个 Application,单据统计类页面塞进同一个应用的不同 Page,这样 EBS 菜单挂载点和应用数量大致对得上,迁移和部署也好控制。
5. 避坑与排查:五个把我逼到重装的现场
这一章记的都是真出过问题的现场。APEX 的报错信息有个特点:它很少直接告诉你根因,日志里那句ORA-往往是几层调用之后的结果。所以下面每条都按"现象 → 原因 → 解决"写,方便对上号。
5.1 登录页能打开,输对密码也登不进去
现象:安装全部跑完,apex_admin页面正常渲染,输入ADMIN和新改的密码,提示认证失败。改密码、重启数据库,问题依旧。
原因:11g 自带的 APEX 3.0 没清干净,旧的认证用户还留在dba_users里,登录校验走的是旧版本那套逻辑,跟新装的 4.2.5 不是一回事。原文里就是这么撞上的——系统启起来了,安装过程也没报错,但认证就是过不去。
解决:先查,再清。
-- 查所有 APEX 相关用户,正常情况下只应该有 4.2.5 自己的那几个 SELECT username, account_status FROM dba_users WHERE username LIKE 'APEX%';如果结果里出现APEX_030200或者别的旧版本 schema,手工 drop 掉:
-- 用户名按实际查到的替换,cascade 会连带清掉它拥有的所有对象 DROP USER APEX_030200 CASCADE;这一步有个后悔药:drop 之前一定确认APEX_040200不在列表里。原文里就是顺手把APEX_040200一起 drop 了,只能从头重装一遍。我现在的习惯是查完先截图,确认哪些该留哪些该删,再执行 drop。
5.2 访问 8888 端口返回 404
现象:curl -I http://127.0.0.1:8888/apex/apex_admin返回 404,但端口netstat看着是在听的。
原因:三种可能,按概率从高到低:一是 XDB 的 HTTP 服务没启动;二是 DAD 没建或者路径写错;三是document-root和安装时的/i/对不上,静态资源路径解析失败。
解决:先确认 HTTP 服务状态,没开就启起来:
-- 看 XDB 服务是否在运行,STATUS 应该是 ENABLED SELECT name, value FROM v$parameter WHERE name LIKE '%xdb%'; -- 查看已配置的 DAD 列表 SELECT * FROM dba_epg_dad_attributes WHERE dad_name = 'APEX';第二条查询如果返回空,说明 DAD 压根没建,回到第 3.4 节重新执行DBMS_EPG.CREATE_DAD。如果 DAD 在但属性不对,重点看document-root和database-username这两行。原文遇到的正是"服务没启起来",手动启一次就通了。
5.3 虚拟机关机再开,端口和参数全丢了
现象:第一次装完全部正常,关了虚拟机第二天再打开,http://server:8888/apex打不开,或者参数回到了默认值。
原因:ALTER SYSTEM SET ... SCOPE = MEMORY(或者没写SCOPE)只改内存,重启即失效;而虚拟机的关机操作会触发数据库实例重启。
解决:凡是希望长期生效的参数,一律写SCOPE = SPFILE,改完重启一次验证。原文里给的做法更省事——需要关虚拟机时把状态置为挂起,而不是关机,下次打开就不用重新配参数。但这只能算回避,不能算解决,参数该落盘还是要落盘:
-- 确认关键参数是否已经写入 spfile,ISSYS_MODIFIABLE 为 IMMEDIATE 说明运行时可改 SELECT name, value, issys_modifiable FROM v$parameter WHERE name IN ('session_cached_cursors', 'processes', 'job_queue_processes');5.4 页面能开但所有图标是红叉
现象:登录界面文字都在,布局也对,但图片资源 404,控制台一片红。
原因:apexins.sql第四个参数(静态文件 URL 前缀)与实际 DAD 的document-root不一致。装的时候写的是/i/,DAD 里配成了/images/或者干脆没配。
解决:两边对齐。DAD 属性的写入方式:
BEGIN -- 与 apexins 的第四个参数严格保持一致 DBMS_EPG.SET_DAD_ATTRIBUTE('APEX', 'document-root', '/i/'); COMMIT; END; /改完不需要重启数据库,重新访问页面即可。这类问题不影响功能,但会让人误以为整个安装失败了,浪费大量时间去查数据库。
5.5 表空间写满导致数据库挂起
现象:用了一段时间,某次上传附件之后数据库无响应,告警日志里出现ORA-01653: unable to extend table。
原因:CREATE TABLESPACE时没写MAXSIZE,或者MAXSIZE设得跟磁盘剩余空间一样大,自动扩展一路吃到挂载点满,UNDO 和 REDO 也跟着写不进去。
解决:先把MAXSIZE收住,再清理文件表空间:
-- 给数据文件加一个明确的上限,留出余量 ALTER DATABASE DATAFILE '/d01/oracle/ORCL/db/apps_st/data/apex01.dbf' AUTOEXTEND ON NEXT 100M MAXSIZE 4000M;然后去 APEX 管理界面清掉不再需要的导出文件和旧附件。文件表空间是增长最快的一块,开发环境里尤其容易被忽视——测试上传功能反复传同一个大文件,几轮下来就是几百兆。
6. 装完怎么验证:三条命令加一张页面自检表
装完不等于装对。我现在的习惯是,不管多熟的流程,装完都强制走一遍这套验证,五分钟,能省掉后面几小时的扯皮。
第一步,验证数据库侧对象齐了:
-- 三个关键 schema 都在,且状态正常,说明主安装是成功的 SELECT username, account_status FROM dba_users WHERE username IN ('APEX_040200', 'APEX_PUBLIC_USER', 'ANONYMOUS'); -- APEX 版本号,应该是 4.2.5 SELECT version_no FROM apex_release;apex_release这张表是 APEX 自己的版本表,返回值跟你的安装包对不上,说明装的根本不是你以为的那个版本——这种情况在接手别人环境时特别常见。
第二步,验证 HTTP 链路:
# 端口在听 netstat -tlnp | grep 8888 # 管理入口返回 200 或 302 curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8888/apex/apex_admin # 从宿主机访问,验证远程可达(SETLISTENERLOCALACCESS 是否生效) curl -s -o /dev/null -w "%{http_code}\n" http://<虚拟机IP>:8888/apex三条都通,链路才算真的通了。第二条通、第三条不通,问题一定出在SETLISTENERLOCALACCESS或者防火墙,跟 APEX 本身无关。
第三步,页面级自检。用 ADMIN 登录后台,按下面这张表逐项过:
| 检查项 | 期望结果 | 不通过的典型原因 |
|---|---|---|
| 登录 apex_admin | 进入实例管理首页 | 旧版 schema 未清、密码策略不满足 |
| 实例设置里的默认语言 | 可选简体中文 | 语言包未安装 |
| 新建一个 Workspace | 绑定 schema 成功 | schema 密码错、schema 不存在 |
| 用 Workspace 管理员登录 | 进入该工作空间 | 角色分配错、登错入口 |
| 新建一个空白 Application | 能进入 App Builder | 静态资源路径/i/不一致 |
| 运行该 Application 的首页 | 页面正常渲染,无红叉 | DAD 属性配错、ACL 未授权 |
这张表里我最看重最后两项。前四项通,说明"装上了";后两项通,说明"能用了"。很多环境卡在第五项——App Builder 打得开,但一建应用就报错,回头查基本都是document-root和安装参数对不上。
还有一个容易被跳过的验证:拿一个真实业务场景走一遍。我会新建一个页面,挂一个基于APPSschema 下某张视图的经典报表(Classic Report),跑出来有数据,再在页面上加一个按钮触发一次带Dynamic Action的交互。这一步走通,说明 schema 指向、PL/SQL 执行权限、页面渲染链路全是通的,后面开发才敢往上堆东西。
从那以后我每次装 APEX,不管多急,都强制把这套验证走一遍,尤其是dba_users里那几个 schema 的确认——被 3.0 的遗留用户坑过一次、又亲手 drop 过一次APEX_040200之后,这条已经刻进流程里了。希望帮到你。
本文还有配套的精品资源,点击获取