大势趋007

每个人都是🏆 时时刻刻::::: 1 新的技术经常性尝试,经常性测试;;;;; 2 一线dba的经常性操作和总结,二线技术的经常性思考
  新随笔  :: 管理

oracle javascripts 学习

Posted on 2026-02-02 16:08  大势趋007  阅读(1)  评论(0)    收藏  举报

为什么使用 JavaScript 存储过程?
JavaScript 是最流行的编程语言之一,除了更简单的语法和对现代语言特性的支持外,它受欢迎的一个关键因素是丰富的生态系统,它在浏览器、服务端、客户端等场景提供了大量可重用的代码模块。

 

 

在数据库中调用 JavaScript

JavaScript 可通过动态执行调用规范来调用。调用规范可以引用 MLE 模块,也可以引用内联的 JavaScript 函数。

一般来说,服务器端的 JavaScript 代码可以通过两种方式调用:

  • 通过 DBMS_MLE 包进行动态调用。

  • 使用 PL/SQL 代码,引用 JavaScript 模块中导出的函数(即所谓的 MLE 模块调用)或直接在 DDL 中定义的函数。

 

动态调用!

SQL> SET SERVEROUTPUT ON;
SQL> DECLARE
  2      l_ctx DBMS_MLE.context_handle_t;
  3      l_jscode CLOB;
  4  BEGIN
  5      l_ctx := DBMS_MLE.create_context;
  6      l_jscode := q'~
  7          console.log('Hello World, this is DBMS_MLE')
  8      ~';
  9      DBMS_MLE.eval(
 10          context_handle => l_ctx,
 11          language_id => 'JAVASCRIPT',
 12          source => l_jscode,
 13          source_name => 'My JS Snippet'
 14      );
 15  END;
 16  /
Hello World, this is DBMS_MLE
PL/SQL procedure successfully completed
SQL> 

上面提供的代码演示了以下动态调用 JavaScript 代码的概念:

  • 必须显式创建一个执行上下文。

  • JavaScript 代码作为字符大对象或 VARCHAR2 类型变量提供。

  • 必须对上下文进行显式求值。

当您动态执行 JavaScript 时,会同时涉及 PL/SQL 和 JavaScript。所提供的代码片段在其命名空间之外是不可重用的。对 console.log 的调用所产生的输出会被传递至 DBMS_OUTPUT,以便在屏幕上打印显示

 

 

MLE 模块调用简介

DBMS_MLE.eval() 函数用于计算并返回 JavaScript 代码的执行结果。

可以将 JavaScript 模块创建为模式对象,并持久化存储在数据库中。

一旦定义了 JavaScript 模块,就可以如下所示在 SQL 和 PL/SQL 中使用它。

SQL> CREATE OR REPLACE MLE MODULE helloWorld_module
  2  LANGUAGE JAVASCRIPT AS
  3  function helloWorld() {
  4      console.log('Hello World, this is a JS module');
  5  }
  6  export { helloWorld }
  7  /
MLE module created.

在调用已导出的 JavaScript 函数之前,必须定义一个调用规范。

下面的代码片段展示了如何在 PL/SQL 中为 JavaScript 的 helloWorld() 函数创建一个调用规范:

SQL> CREATE OR REPLACE PROCEDURE helloWorld_proc
  2  AS MLE MODULE helloWorld_module
  3  SIGNATURE 'helloWorld()';
  4  /
Procedure created.

这个被称为 MLE 模块调用的调用规范,公开了 JavaScript 函数 helloWorld()。此后,它便可以像任何其他 PL/SQL 过程一样使用。以下代码片段展示了如何调用该函数及其结果:

SQL> SET SERVEROUTPUT ON
SQL> BEGIN
  2      helloWorld_proc;
  3  END;
  4  /
Hello World, this is a JS module
PL/SQL procedure successfully completed.
SQL>