Oracle 数据库支持一组丰富的语言来编写用户定义的函数和存储过程,包括 PL/SQL、Java 和 C。借助 Oracle 数据库多语言引擎 (MLE),开发人员可以选择通过动态执行或直接存储在数据库中的持久 MLE 模块来运行 JavaScript 代码。
编程语言的格局正在迅速发展,越来越多的开发人员选择使用像JavaScript这样的现代动态语言。除了更简单的语法和对现代语言功能的支持之外,这些语言流行的一个关键因素是存在丰富的模块生态系统。开发人员通常选择使用不同的语言来实现项目的不同部分,具体取决于给定任务的合适模块的可用性。
一种新语言是否被广泛采用往往取决于社区的参与。一旦一种语言达到某种流行的门槛,它的生态系统通常开始迅速扩展,吸引越来越多的开发人员。很多时候,会创建一组丰富的功能、库和可重用的代码模块来支持更广泛的使用。
Oracle数据库以其对丰富的编程语言生态系统的支持而闻名。Oracle 数据库最常见的编程服务器端接口是 PL/SQL。通过使用PL SQL,可以将业务逻辑和数据保持在一起,除了为数据提供统一的处理模式外,通常还可以显著提高效率,而不管使用何种客户端接口。使用MLE,你可以利用PL SQL来实现JavaScript模块,提供直接与数据库交互的额外途径。
Oracle 数据库多语言引擎MLE允许您直接在 Oracle 数据库中运行和存储 JavaScript。
使用 MLE 使 Oracle 数据库的用户能够运行:
存储过程
存储函数
PL/SQL 包命名空间中的代码
匿名、动态的代码片段(类似于DBMS_SQL)
接下来我们就通过例子来看看这项功能是如何使用的吧。
一、环境准备
1.Oracle 23数据库
2.一个CDB和一个PDB
二、创建用户并对用户授权
要直接在 Oracle 数据库中运行和存储 JavaScript,相关用户需要授权。
该应用需要授于如下权限:
GRANT EXECUTE ON JAVASCRIPT TO user/role;
如果此用户需要使用DBMS_MLE动态执行JS脚本还需要
GRANT EXECUTE DYNAMIC MLE TO <role | user>
此外23c新增加了一个开发员角色,强列建议使用,此开发员角色已包含大部份开发人员所需要的权限,使用如下方法进行赋权:
begin
dbms_developer_admin.grant_privs('DEVUSER');
end;
/
复制
三、创建JavaScript并执行
接下来演示在数据库里面创建并存储JavaScript代码,然后由PL/SQL存储过程进行调用,在SQL里面展示JavaScript代码执行后输出结果。
创建JavaScript MLE Module,暴露给PL/SQL或者SQL
create or replace mle module helloWorld_module
language JavaScript as
function helloWorld() {
console.log('Hello World, this is a JS module');
}
export { helloWorld }
/
创建存储过程并调用JavaScript MLE Module:
create or replace procedure helloWorld_proc
as mle module helloWorld_module
signature 'helloWorld()’;
/
在SQL会议里面调用此存储过程执行JavaScript代码:
set serveroutput on
BEGIN
helloWorld_proc;
END;
/
复制
四、调用外部JavaScript文件
Oracle Database 23c充话用户调用已经写好的JavaScript文件,内部指定的数据库目录名为JS_SRC_DIR,需要将.js文件放到此指定的目录下。
CREATE OR REPLACE DIRECTORY JS_SRC_DIR AS '/home/oracle/javascript';
grant Execute on DIRECTORY JS_SRC_DIR to dev_vli;
create mle module ch02mod03
language javascript
using bfile(JS_SRC_DIR, ‘myfile.js');
/
create or replace mle env ch03env01
imports ('ch03mod01' module ch03mod01);
DECLARE
l_ctx dbms_mle.context_handle_t;
l_snippet CLOB;
BEGIN
l_ctx := dbms_mle.create_context(environment => 'CH03ENV01');
l_snippet := q'~
(async () => {
let { hello } = await import('ch03mod01');
const greeting = hello('world');
console.log(greeting);
})();
~';
dbms_mle.eval(
l_ctx,
'JAVASCRIPT',
l_snippet
);
dbms_mle.drop_context(l_ctx);
EXCEPTION
WHEN OTHERS THEN
dbms_mle.drop_context(l_ctx);
RAISE;
END;
/
复制
五、总结
随着Oracle数据库多语言引擎(MLE)的引入,JavaScript被添加到数据库中。JavaScript的加入承认了该语言的受欢迎程度,并为服务器端数据库开发打开了其广泛的生态系统。使用 MLE,您可以使用 JavaScript 生态系统中可用的习语和工具,以及直接在数据库中部署和使用来自流行存储库(如 Node Package Manager (NPM))的模块。此外,可以在应用程序层之间移动,为处理不同工作负载的团队提供更大的灵活性。大量的 JavaScript 人才库可以帮助员工现有和即将到来的项目。
编辑: 殷海英