不支持。oracle 21c 仅通过 mle(多语言引擎)支持在数据库内执行 javascript 代码,但未提供 javascript 存储过程功能;该能力直至 23c 才正式实现,21c 中官方支持的存储过程语言仅有 pl/sql、java 和 c。
oracle 21c 支持 javascript 存储过程吗?
不支持。oracle 21c 的 pl/sql 引擎(包括 dbms_java 和内置脚本引擎)**没有提供 javascript 作为存储过程的宿主语言能力**。官方文档明确列出的存储过程语言只有 pl/sql、java(通过 create or replace java source)、c(外部过程),以及极有限的 sql script(仅用于 sql*plus / sqlcl 脚本,非数据库持久对象)。
为什么有人误以为 Oracle 支持 JS 存储过程?
常见混淆来源有三个:
- Oracle 21c 引入了
JSON_OBJECT、JSON_ARRAY等原生 JSON 函数,配合JSON_TABLE可以解析和生成类 JS 结构,但底层仍是 SQL/PL/SQL 语法; - Oracle REST Data Services(ORDS)允许用 JavaScript 编写客户端或中间层逻辑(如 Node.js 后端调用 Oracle),但这与数据库内存储过程无关;
- 某些第三方工具(如 APEX 的动态动作、APEX_JSON 包)支持 JS 表达式,但它们运行在应用层,不进入数据库执行引擎。
想在 Oracle 中实现类似 JS 的灵活性,实际能做什么?
如果目标是简化 JSON 处理、动态逻辑或避免硬编码,可组合使用以下 PL/SQL 特性:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 用
JSON_OBJECT和JSON_ARRAY构建结构,比字符串拼接安全得多; - 用
APEX_JSON包(需安装 APEX 或单独部署)解析复杂嵌套 JSON,它比原生JSON_VALUE更接近 JS 的遍历习惯; - 用
EXECUTE IMMEDIATE动态执行 PL/SQL 块——注意:这不是 JS,但能实现“运行时决定逻辑”的效果,需严格校验输入防注入; - 把真正需要 JS 行为的逻辑移到应用层(如 Node.js + oracledb 驱动),数据库只负责原子 CRUD 和事务控制。
例如,用 PL/SQL 模拟简单“map”操作:
DECLARE
l_json CLOB := '{"items": [{"id":1,"val":"a"},{"id":2,"val":"b"}]}';
l_result CLOB;
BEGIN
SELECT JSON_OBJECT(
KEY 'mapped' VALUE JSON_ARRAYAGG(
JSON_OBJECT(KEY 'new_id' VALUE i.id * 10, KEY 'upper_val' VALUE UPPER(i.val))
)
)
INTO l_result
FROM JSON_TABLE(l_json, '$.items[*]'
COLUMNS (id NUMBER PATH '$.id', val VARCHAR2(10) PATH '$.val')) i;
DBMS_OUTPUT.PUT_LINE(l_result);
END;
升级或迁移时要注意什么?
如果你正在评估从其他支持 JS 存储过程的数据库(如 PostgreSQL 的 plv8、MongoDB 的 server-side JS)迁移到 Oracle,必须重写所有 JS 逻辑为 PL/SQL 或拆分到应用层。尤其注意:eval() 类动态执行、闭包状态、异步回调这些 JS 特性,在 Oracle 内部完全不可用,也没有替代方案。别指望用 DBMS_SCHEDULER 或外部表绕过这个限制——它们不改变语言边界。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










