APEX 26.1 之后,别再把 App Builder 当作唯一开发入口

小黑在 App Builder、APEXlang 与 Git 之间搬运 APEX 应用定义

过去做 APEX 项目,开发现场几乎只有一个:App Builder。

页面、区域、Dynamic Action、Validation、Shared Components,都在浏览器里配置。改完刷新页面,结果马上出现。这个反馈速度很难替代,也是许多人喜欢 APEX 的原因。

问题出在项目变大以后。两三个人同时修改同一个应用,Git 里只留下一份导出 SQL,评审者很难看清某个按钮为什么换了位置、某个 Authorization Scheme 是否被误改。再把 AI Coding Agent 拉进来,麻烦会更明显:它能写 SQL 和 PL/SQL,却很难从安装脚本里还原整套应用结构。

APEX 26.1 给出了新的解法。APEXlang 把应用元数据表达成结构化、可读的 .apx 文件;SQLcl 提供生成、导出、验证和导入命令;Blueprint 把规格先变成可试用的应用骨架;Oracle 提供的 Skills 则告诉 Coding Agent 怎样理解和修改这些文件。[^oracle-apexlang-new]

我更愿意把它看成一次开发现场的扩建。App Builder 还在,而且仍然重要。只是从 26.1 开始,浏览器不再是唯一现场。

一、App Builder 没有退场,应用定义走出了浏览器

App Builder 与 APEXlang 是同一套应用定义的两个工作现场

APEXlang 在 26.1 中是可选的应用表达格式。开发者仍然可以在 App Builder 里搭页面,也可以把应用导出成 APEXlang,在 VS Code、Git 和 Coding Agent 中阅读、修改,再用 SQLcl 验证和导入。两条路径操作的是同一套 APEX 应用元数据。[^oracle-working-apexlang]

一份典型的 APEXlang 项目会包含类似结构:

1
2
3
4
5
6
application.apx
pages/
shared_components/
supporting_objects/
deployments/
.apex/

这组文件先补上了三个一直难处理的缺口。

第一,应用变化终于比较容易读了。Pull Request 不必只展示一份庞大的安装脚本,评审者可以定位到页面、组件和属性。

第二,Coding Agent 有了明确的编辑对象。它可以搜索某类按钮、分析共享组件引用、修改多个页面,再根据编译错误继续修正。

第三,CI 有了官方验证入口。SQLcl 26.1 的 APEX 命令包括:

1
2
3
4
apex generate
apex export
apex validate
apex import

其中 apex validate 可以在没有数据库连接时编译 APEXlang。这个能力很适合放进本地检查和 Pull Request 流水线。导入仍然需要数据库连接,并会先完成验证。[^oracle-sqlcl-apexlang]

这并不意味着“源码文件永远正确,数据库里的应用只是副本”。浏览器里的紧急修改、不同环境的运行状态、应用 ID 和 Workspace 映射都可能造成偏差。团队仍要规定谁可以修改哪一端,以及什么时候重新导出基线。

二、六个名词看起来挨得很近,其实各管一层

Spec、Blueprint、APEXlang、Skills、MCP 与 AI Agent 的六层边界

APEX 26.1 的资料里经常同时出现 Functional Specification、Blueprint、APEXlang、Skills、SQLcl/MCP 和 AI Agent。把它们统称为“AI 开发工具”会掩盖最重要的边界。

名称它解决的问题不应该被理解为
Functional Specification业务目标、角色、流程、规则和验收条件一次性的 Prompt
Blueprint把规格和数据模型整理成可导入的应用骨架完整生产应用源码
APEXlang表达完整 APEX 应用定义数据库 Migration 的替代品
Skills给 Coding Agent 提供 APEX 领域规则和工作方法数据库连接或执行权限
SQLcl / MCP验证、导入以及受控数据库操作通道可以绕过权限治理的万能接口
APEX AI Agent在运行期通过已批准的 Tools 服务最终用户开发期修改 APEXlang 的 Coding Agent

Blueprint 最容易被高估。Oracle 官方的 Spec-Driven Development 流程以功能规格、Schema Metadata 和 Blueprint System Prompt 为输入,AI 产出结构化 Markdown,再由 APEX 导入并确定性生成脚手架应用。这个应用可以给业务人员提前试用,但官方文档也明确提醒:脚手架不是成品,后续仍要补体验、业务逻辑和集成。[^oracle-blueprint]

APEXlang 负责另一个阶段。骨架通过评审后,团队可以继续在 App Builder 和文本工具中演进完整应用。Oracle 的 APEXlang Skills 支持 Coding Agent 生成页面、组件和增量修改,并建议把 apex validate 放进编辑循环。[^oracle-coding-agents]

MCP 更不能和 Skill 混用。Skill 告诉 Agent 应该怎样做,MCP 给 Agent 一条调用工具和数据的通道。SQLcl MCP Server 官方文档专门提醒:给 LLM 数据库权限会带来数据泄露和越权风险,应使用最小权限账号,避免直连生产,并审计它执行的操作。[^oracle-sqlcl-mcp]

三、一条能落地的 APEX 26.1 工程流程

APEX 26.1 从规格、原型到开发、验证和环境部署的工程闭环

这条流程的起点不该是“请 AI 帮我创建五个页面”,而是一份可以评审的规格。

规格至少应说明业务目标、用户角色、核心对象、流程、权限、异常处理、验收标准,以及本期明确不做什么。数据库表、约束、索引、Package 和初始化数据则进入独立的数据库目录,由 Migration 管理。

1
2
3
4
5
6
database/
├── migrations/
├── packages/
├── views/
├── seed-data/
└── tests/

准备好功能规格和 Schema Metadata 后,再生成 Blueprint。业务人员先围绕可运行骨架确认页面、导航和流程。骨架得到认可后导出 APEXlang,建立 Git 基线。之后的每次修改,都用一份小型 Change Spec 约束 AI 和人工操作。

例如,统一四个“新建”按钮,不需要写一篇长需求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Change ID
CRM-142

# 目标
统一 New Lead、New Opportunity、New Account、New Contact 的位置和样式。

# 约束
- 按钮放在 Breadcrumb Bar 右侧
- 使用 Hot 样式
- 不修改 Authorization Scheme、Branch 和 Dynamic Action

# 验收
- 四个页面位置一致
- 未授权用户仍不可见
- 原有跳转保持不变
- APEXlang 验证通过
- 浏览器回归通过

Coding Agent 可以据此分析影响范围、修改 APEXlang、运行验证并总结 Diff。开发者要审查它是否碰了范围外的组件。然后部署数据库 Migration,导入应用,在 DEV 或临时环境运行数据库测试、页面冒烟、核心流程 E2E、权限矩阵和安全检查。

apex validate 通过只说明应用定义能够被编译。它不理解你的业务口径,也不知道“财务审批人不能看到其他法人数据”是不是硬规则。编译器负责语法和元数据约束,测试与人工评审负责业务正确性。

四、别强求唯一的 Source of Truth,先把边界划清

开发期 AI 与运行期 AI 的对象、通道和责任边界

很多团队喜欢问:“到底哪一份才是唯一事实来源?”在 APEX 项目里,硬把所有事实塞进一个仓库目录,通常会制造新的误解。

层级建议的事实来源主要内容
业务Functional Specification目标、角色、流程、规则、验收
原型设计Blueprint页面骨架、导航、报表、表单、初始行为
应用定义APEXlang页面、共享组件、流程和应用元数据
数据与业务逻辑DDL、PL/SQL、Migration表、约束、Package、视图和数据变更
环境Deployment 配置与 CI 变量Workspace、Schema、App ID 和目标环境
验收自动化测试与人工证据实现是否满足规格
运行已部署的 APEX Application某个环境此刻真正运行的实例

开发期 AI 和运行期 AI 也应分开治理。

Codex、Claude 等 Coding Agent 读取规格和 APEXlang,修改仓库文件,再通过 SQLcl 验证或导入。APEX 应用里的 AI Agent 面向最终用户,它通过事先定义的 AI Tools 查询允许的数据或执行业务动作。APEX 26.1 的原生 Tool 类型包括检索数据、执行服务端代码和执行客户端代码;开发者决定工具能做什么,以及是否需要用户确认。[^oracle-ai-tools]

这两类 Agent 可以使用同一个模型,但责任完全不同。开发期 Agent 受 Git、Diff、测试和部署权限约束;运行期 Agent 受 APEX 授权、工具定义、会话与业务规则约束。把两条通道混在一起,很容易让“辅助开发”滑向“模型直接操作生产数据”。

五、从实验走向生产,先接受 APEXlang 26.1 的现实边界

APEXlang 进入生产前要经过 Migration、测试、权限和审批气闸

APEXlang 让工程化容易了不少,但 26.1 不是把所有历史问题一次性清零。

当前版本有几条边界值得提前写进团队规范:

  • APEXlang 导入以整应用为单位,不能按 APEXlang 格式只导入单个页面;单页导入仍可使用 SQL 格式。
  • APEXlang 导出暂不包含 Public Reports、Private Reports、Report Subscriptions、Workflow Instances 和 Task Instances 等运行期数据。
  • 通过 App Builder 导入 APEXlang 时,Workspace 中至少要有一个 REST-enabled Schema。
  • .apex/apexlang.json 中的 MMD 版本决定编译规则,不应手工改写。
  • 整应用导入会放大多人并行开发冲突,团队要建立基线、分支、Rebase、备份和回滚规则。[^oracle-apexlang-new]

数据库变更也不能塞进应用导入里碰运气。更稳妥的发布顺序是:

1
2
3
4
5
部署数据库 Migration
→ 验证数据库对象
→ 导入依赖这些对象的 APEXlang
→ 执行数据与应用测试
→ 人工审批进入下一环境

生产环境尤其要克制。Coding Agent 可以在本地修改文件和运行离线验证;DEV 可以给受控账号导入与测试权限;TEST 和 PROD 应由审批后的流水线部署。SQLcl MCP Server 即使支持限制和审计,也不构成把生产库直接交给 LLM 的理由。

APEX 26.1 已有公开 Known Issues 和 Patch Set Bundle。准备把新流程用于正式项目时,应检查目标实例的精确版本、补丁和已知问题,而不是只确认“已经是 26.1”。[^oracle-known-issues]

结语

APEX 的优势一直是快速反馈。以前,这种速度主要来自浏览器里的声明式开发;现在,APEXlang 又把文本编辑、Git、Coding Agent 和编译验证接进了同一套应用模型。

App Builder 仍然适合处理复杂页面和即时调试。APEXlang 适合版本管理、批量修改和 AI 协作。Blueprint 负责把模糊需求变成可试用骨架。SQLcl 负责把应用定义送进编译与部署环节。测试、权限和审批继续由团队承担。

工具多了,责任并没有消失。APEX 26.1 只是把一条更容易审查、复现和治理的路铺到了团队面前。能不能沿着它稳定交付,仍取决于规格、数据库、应用定义、测试和权限有没有被认真分开。

[^oracle-apexlang-new]: Oracle APEX 26.1 Release Notes: New Features - APEXlang

[^oracle-working-apexlang]: Oracle APEX Developer’s Companion: Working with APEXlang

[^oracle-sqlcl-apexlang]: Oracle SQLcl User’s Guide: APEXlang Commands

[^oracle-blueprint]: Oracle APEX App Builder User’s Guide: Creating an App Using AI and Spec-Driven Development

[^oracle-coding-agents]: Oracle APEX Developer’s Companion: Using APEXlang with AI Coding Agents

[^oracle-sqlcl-mcp]: Oracle SQLcl User’s Guide: Using the Oracle SQLcl MCP Server

[^oracle-ai-tools]: Oracle APEX App Builder User’s Guide: Managing AI Agents and AI Tools

[^oracle-known-issues]: Oracle: APEX 26.1 Known Issues