23ai大幅扩展PL/SQL语法与能力,而21c以兼容为主:23ai新增CONTINUE、VECTOR/AI_MODEL类型、JSON原生方法及VECTOR_DISTANCE函数,支持隐式JSON转换、FOR UPDATE SKIP LOCKED全语义和链式调用,执行行为(如JSON_EXISTS、TLS默认版本)亦有隐蔽差异。

PL/SQL 在 21c 和 23ai 中的语法扩展差异
21c 引入了少量 PL/SQL 语言层增强,但整体仍以兼容性为主;23ai 则大幅加码,新增多个关键字和结构化能力,部分功能已脱离传统 PL/SQL 范式。关键区别不在“有没有”,而在“能不能直接用、要不要改代码”。
-
JSON_OBJECT_T和JSON_ARRAY_T在 21c 中仅支持基本构造与遍历;23ai 新增PUT、APPEND、REMOVE等原生方法,且可链式调用(如json_obj.PUT('a', 1).PUT('b', 'x')) - 23ai 支持
FOR UPDATE SKIP LOCKED的完整语义(包括在游标 FOR 循环中),而 21c 仅允许在显式SELECT ... FOR UPDATE后使用,否则报错ORA-02014 - 23ai 新增
CONTINUE语句(类似 C/Java),21c 不识别该关键字,误用会触发PLS-00103错误 - 23ai 允许在匿名块或函数中直接声明
VECTOR类型变量(如v_vec VECTOR(1536) := VECTOR('[0.1,0.9,...]');),21c 编译即失败
向量操作与 AI 集成对 PL/SQL 的实际影响
23ai 的 PL/SQL 不再只是“操作关系数据”,而是能直接参与向量计算闭环——这是 21c 完全不具备的能力。它不是加几个函数的事,而是改变了 PL/SQL 的执行边界。
- 23ai 提供
VECTOR_DISTANCE内置函数,可在 PL/SQL 中直接调用,返回NUMBER;21c 没有该函数,强行写会报PLS-00201: identifier 'VECTOR_DISTANCE' must be declared - 23ai 支持在
SELECT子句中嵌套VECTOR字段 +ORDER BY VECTOR_DISTANCE(...),且该语句可被 PL/SQLEXECUTE IMMEDIATE安全执行;21c 执行相同语句会因解析失败中断 - 23ai 允许在存储过程中定义
AI_MODEL变量并绑定到向量列(如v_model AI_MODEL := 'my_llm@pdb1';),21c 无此类型,声明即语法错误
JSON 关系二元性如何改变 PL/SQL 开发习惯
23ai 的 JSON_TABLE 增强和隐式 JSON 转换,让 PL/SQL 处理混合数据时不再需要手动 JSON_VALUE 提取字段——但这也意味着旧逻辑可能意外跳过类型校验。
- 23ai 中,若表某列为
JSON类型,PL/SQL 直接赋值字符串(如my_json_col := '{"id":1}';)自动转为合法 JSON;21c 必须显式调用JSON_OBJECT或抛出ORA-40458 - 23ai 的
JSON_TABLE支持FORMAT JSON子句,配合 PL/SQL 动态 SQL 可省略中间CLOB变量;21c 必须先存入CLOB再传参,否则ORA-40443 - 23ai 允许在
WHERE子句中直接写json_col.id = 123(隐式路径访问),该写法在 PL/SQL 中生效;21c 会报PLS-00306: wrong number or types of arguments
容易被忽略的运行时兼容性陷阱
23ai 的 PL/SQL 编译器更宽松,但执行期行为变化隐蔽——尤其当代码跨版本迁移或复用老模板时,表面成功,实则逻辑偏移。
- 23ai 默认启用
PLSQL_OPTIMIZE_LEVEL=2(内联优化),某些含副作用的函数(如带DBMS_OUTPUT.PUT_LINE的自定义函数)可能被跳过执行;21c 默认为 1,行为可预测 - 23ai 对空 JSON 数组
[]的JSON_EXISTS返回FALSE,而 21c 返回TRUE—— 若 PL/SQL 逻辑依赖该判断,结果会反转 - 23ai 的
UTL_HTTP在 PL/SQL 中默认启用 TLS 1.3,若后端服务只支持 TLS 1.2,会静默失败(无异常抛出),仅返回空响应;21c 默认 TLS 1.2,兼容性更强


















