JavaScript dentro do Banco Oracle 21c

Recentemente a Oracle liberou a versão 21c do seu banco. Com essa nova versã, os desenvolvedores agora podem executar trechos de código JavaScript dentro do banco de dados. Isso permite que sejam executadas pequenas tarefas computacionais facilmente expressas em JavaScript, sem ter que mover os dados para uma camada intermediária ou navegador.

Como funciona?

O Multilingual Engine (MLE) no Oracle Database 21c, desenvolvido por GraalVM, mapeia automaticamente os tipos de dados JavaScript para os tipos de dados Oracle Database e vice-versa, para que os desenvolvedores não tenham que lidar com a conversão de tipo de dados eles próprios. Além disso, o próprio código JavaScript pode executar PL / SQL e SQL por meio de um módulo JavaScript integrado.

Tudo isso também permite que os desenvolvedores que utilizam a plataforma APEX (Oracle Application Express) usem JavaScript como uma linguagem de primeira classe em seus aplicativos APEX, sem ter que sacrificar o poder do PL / SQL e do SQL. Aqui está um exemplo de código que usa o pacote DBMS_MLE PL / SQL para executar o código JavaScript:

set serveroutput on;

DECLARE
  ctx dbms_mle.context_handle_t;
  source CLOB;
  greeting VARCHAR2(100);
BEGIN
  ctx := dbms_mle.create_context(); -- Cria um contexto para execução usando o MLE

  dbms_mle.export_to_mle(ctx, 'person', 'World'); -- Exporta os valores do PL/SQL

  source := q'~
    var bindings = require("mle-js-bindings");
    var person = bindings.importValue("person"); // Importa os valores exportados anteriormente
    var greeting = "Hello, " + person + "!";
    bindings.exportValue("greeting", greeting); // Exporta os valores para o PL
  ~';

  dbms_mle.eval(ctx, 'JAVASCRIPT', source); -- Avalia e executa o código dentro do contexto

  dbms_mle.import_from_mle(ctx, 'greeting', greeting); -- Importa os valores exportados pelo MLE

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

  dbms_mle.drop_context(ctx);
END;

Como você pode ver, o JavaScript pode ser usado como algumas linguagens de script já funcionam quando são invocadas dentro de outras.

Para aqueles que usam APEX

Agora se você estiver utilizando o APEX com o banco 21c, você poderá executar o código de forma bem mais simples e sem utilizar uma linha de PL. Basta mudar a configuração e executar seu código

Image for post
// getting page item values
const empno = apex.env.P1_ID;
const salary = apex.env.P1_SAL;

// executing DML operations
apex.conn.execute('update emp set sal = :sal where empno = :empno', {
    sal: salary,
    empno: empno 
});

// executing PL/SQL
apex.conn.execute('begin apex_debug.message(:1); end;', ['Updated salary for ' + empno]);

// messages passed to console.log will also end up in the debug logs
console.log('Updated salary for ' + empno, ' using console.log for printing');

// setting page item values
apex.env.P1_STATUS = 'Success!';

Como mostra este exemplo, você pode interagir com os itens da página via apex.env e executar DML ou PL / SQL via apex.conn.execute

A documentação formal da API dessas novas APIs ainda está por vir. No entanto, eles são um subconjunto do Driver Oracle Node.js, embora com diferenças notáveis, como a mudança de funções assíncronas para síncronas. Você também pode encontrar exemplos no texto de ajuda do respectivo atributo e navegando no preenchimento automático do editor de código.