GraalVM dans Oracle Database 21c pour exécuter du code JavaScript

Par:
fredericmazue

jeu, 18/02/2021 - 13:10

Oracle a récemment annoncé la disponibilité de Oracle Database 21c. Il s'agit bien entendu d'une mouture riche dans laquelle nous remarquons l'arrivée de GraalVM pour exécuter du code JavaScript pour les procédures stockées, ceci pour remplacer l'ancienne implémentation JavaScript fournie par Nashorn JavaScript Engine depuis Oracle Database 12c et qui s'appuyait sur Java 8 pour fonctionner.

Exécuter des extraits de code JavaScript dans la base de données, où résident les données, permet d'exécuter de courtes tâches de calcul facilement exprimées en JavaScript, sans avoir à déplacer les données vers un navigateur ou un navigateur de niveau intermédiaire. Le moteur multilingue (MLE) dans Oracle Database 21c, optimisé par GraalVM selon Oracle, mappe automatiquement les types de données JavaScript vers types de données Oracle Database et vice versa afin que les développeurs n'aient pas à gérer eux-mêmes la conversion des types de données. De plus, le code JavaScript lui-même peut exécuter PL / SQL et SQL via un module JavaScript intégré. Tout cela permet également aux développeurs APEX d'utiliser JavaScript comme langage de première classe dans leurs applications APEX, sans avoir à sacrifier la puissance de PL / SQL et SQL.  

Voici un exemple de code qui utilise le package DBMS_MLE PL / SQL pour exécuter du code JavaScript:

set serveroutput on;

DECLARE
  ctx dbms_mle.context_handle_t;
  source CLOB;
  greeting VARCHAR2(100);
BEGIN
  ctx := dbms_mle.create_context(); -- Create execution context for MLE execution

  dbms_mle.export_to_mle(ctx, 'person', 'World'); -- Export value from PL/SQL

  source := q'~
    var bindings = require("mle-js-bindings");
    var person = bindings.importValue("person"); // Import value previously exported from PL/SQL
    var greeting = "Hello, " + person + "!";
    bindings.exportValue("greeting", greeting); // Export value to PL/SQL
  ~';

  dbms_mle.eval(ctx, 'JAVASCRIPT', source); -- Evaluate the source code snippet in the execution context

  dbms_mle.import_from_mle(ctx, 'greeting', greeting); -- Import value previously exported from MLE

  dbms_output.put_line('Greetings from MLE: ' || greeting);

  dbms_mle.drop_context(ctx); -- Drop the execution context once no longer required
END;
/

Nous remaquons encore, dans Oracle Databse 21c, l'arrivée d'un  type JSON natif. JSON est supporté depuis Oracle Database 12c, mais jusqu'ici les données étaient stockées en tant que VARCHAR2 ou LOB (CLOB ou BLOB). Dans Oracle Database 21c, la prise en charge de JSON offre un type de données natif, "JSON", ce qui signifie qu'au lieu d'avoir à analyser JSON lors des opérations de lecture ou de mise à jour, l'analyse se produit uniquement sur une insertion et le JSON est alors conservé dans un format binaire interne qui rend l'accès beaucoup plus rapide. Cela peut entraîner des opérations de lecture et de mise à jour 4 ou 5 fois plus rapides et des mises à jour de très gros documents JSON 20 à 30 fois plus rapides, assure Oracle.