Seleccionar página

Uso de Javascript en Oracle 23c

Javascript en la base de datos Oracle

Escrito por: Eddie Molina

Oracle ACE Pro. Oracle APEX Cloud Developer Certified Professional. Presidente de ORAUGCRC (Grupo de Usuarios Oracle de Costa Rica). Miembro de líderes de LAOUC. Conferencista, consultor, desarrollador y capacitador en tecnologías Oracle, especialmente Oracle Application Express con más de 30 años de experiencia.

10/04/2023

Que hay de nuevo

Introducción

A inicios del mes de abril de este año, Oracle puso a disposición de todos, especialmente de desarrolladores, la primera versión de disponibilidad general de su nuevo motor de bases de datos 23c. Pueden leer al respecto aquí.

Una de las nuevas características de esta base de datos, pensada en los desarrolladores, es la posibilidad de manejar Javascript dentro de la base de datos, permitiendo crear funciones o procedimientos Javascript almacenados en la base de datos, y de la misma manera, la posibilidad de importar a la base de datos librerías o APIs Javascript.

En este artículo voy a tratar de explicar de manera sencilla, los requerimientos y procesos a seguir para poder almacenar y ejecutar código Javascript desde la base de datos 23c, gracias a lo que se conoce dentro de la base de datos Oracle como MLE (Oracle Database Multilingual Engine) que es posible por el uso de GraalVM.

Requerimientos

Para manejar módulos en la base de datos, es necesario que su usuarios de base de datos tenga al menos estos privilegios:

  • CREATE MLE, que le permitirá crear módulos Javascript en la base de datos
  • Privilegios de ejecución sobre el objeto Javascript que desea ejecutar

Entonces, para poder crear módulos Javascript, suponiendo que su usuario de base de datos es el usuario Test, debe ejecutar con usuario con los privilegios para hacerlo, la siguiente sentencia:

grant CREATE MLE to Test;

Suponiendo que ha creado un módulo Javascript llamado holaMundo_Mod, para que el usuario Test pueda ejecutar dicho módulo, este deberá tener privilegios de ejecución, sobre el mismo, lo que hacemos ejecutando la sentencia:

grant execute on javascript to Test;

De la sentencia y párrafo anteriores es importante hacer notar, que los nombres de los objetos Javascript creados en la base de datos son “case sensitive”, de manera que no es lo mismo el módulo holaMundo_Mod, que un módulo llamado HolaMundo_Mod, por lo que debe tener cuidado al utilizar los nombres de objetos Javascript.

Javascript es un lenguaje codificado en Unicode, si su base de datos usa el set de caracteres AL32UTF8, no tendrá ningún problema al crear módulos MLE, si por el contrario, su base de datos utiliza un set de caracteres de byte simple, como por ejemplo US7ASCII, WE8ISO8859-n, o WE8MSWIN1252, debe tener cuidado de no utilizar caracteristicas Unicode en sus módulos Javascript para que no tenga problemas con estos.

Administración de módulos Javascript en la base de datos

Lo primero que debemos saber acerca de los módulos Javascript en la base de datos, es acerca de los nombres que vamos a utilizar para estos.

Los módulos Javascript son creados como objetos del esquema de base de datos, por lo que es importante saber que:

  • sus nombres deben ser únicos dentro del esquema en que son creados,
  • los nombres al igual que con otros objetos, son case sensitive, por lo que un módulo llamado “miModulo” es distinto de uno llamado “mimodulo” o de uno llamado “MIMODULO”
  • al ser objetos del esquema de base de datos, los objetos MLE comparten estos con otros tipos de objetos dentro del esquema como tablas, vistas, vistas materializadas, secuencias, sinónimos privados, paquetes, funciones, procedimientos y grupos de cache.

Creación de módulos Javascript en la base de datos

Los módulos Javascript en la base de datos son creados usando la sentencia CREATE MLE MODULE DDL, a la cual debemos especificar el nombre y el código fuente para el módulo.

Como ejemplo de creación de un módulo Javascript vamos a utilizar lo más sencillo que existe, el famoso Hola Mundo, que simplemente pasa a consola el mensaje “Hola Mundo” y cuyo código es el siguiente:

CREATE MLE MODULE holamundo_mod LANGUAGE JAVASCRIPT AS

function holamundo() {
console.log(‘Hola Mundo’);
}

export { holamundo }
/

La primera línea del código especifica el nombre del módulo Javascript “holamundo_mod”. Las líneas subsiguientes definen el código Javascript del módulo.

MLE está basado en el estándar EMACScript, por lo que la palabra export indica la función a ser exportada a llamadas potenciales del módulo.

Tan pronto hemos creado un módulo en la base de datos, este estará de manera persistente en el diccionario de la base de datos, lo que lo diferencia de una ejecución dinámica que hagamos utilizando el API DBMS_MLE, en donde el módulo creado sería temporal.

Cuando intentamos crear un módulo Javascript en la base de datos, si el nombre ya existe para un módulo creado anteriormente, vamos a recibir un mensaje de error, si queremos evitar esto y que el módulo sea reemplazado por el código proporcionado por la nueva sentencia, debemos utilizar la clausula OR REPLACE, de manera que la sentencia del ejemplo anterior quedaría de la siguiente manera:

CREATE OR REPLACE MLE MODULE holamundo_mod LANGUAGE JAVASCRIPT AS

function holamundo() {
console.log(‘Hola Mundo’);
}

export { holamundo }
/

Si nuestra intención es crear un módulo Javascript, pero sin sobre escribir un módulo existente y sin obtener un mensaje de error en caso de que el módulo ya exista, podemos utilizar la clausula IF NOT EXIST, de la siguiente manera:

CREATE MLE MODULE IF NOT EXIST holamundo_mod LANGUAGE JAVASCRIPT AS

function holamundo() {
console.log(‘Hola Mundo’);
}

export { holamundo }
/

Las clausulas REPLACE y IF NOT EXIST son mutuamente excluyentes.

De la misma manera en que podemos crear módulos Javascript en la base de datos, podemos eliminarlos de la misma, para lo cual utilizamos la sentencia DROP MLE MODULE de la siguiente manera:

DROP MLE MODULE holamundo_mod;

también podemos usar la sentencia de la siguiente manera:

DROP MLE MODULE IF EXIST holamundo_mod;

Con esta segunda opción no obtendremos un mensaje de error en caso de que el módulo no exista en el esquema de base de datos, cosa que si sucede con la primera forma de la sentencia.

Ahora que conocemos la teoría, pasemos a la práctica.

Ejecución de módulos Javascript desde PL/SQL

Para ejecutar los pasos siguientes, lo primero que vamos a hacer, si todavía no lo hemos hecho, es crear un nuevo esquema de base de datos:

create user TEST identified by Test;

Una vez creado el usuario, vamos a asignarle el nuevo rol de base de datos DB_DEVELOPER_ROLE:

grant DB_DEVELOPER_ROLE to TEST;

Ahora vamos a crear nuestro módulo Javascript:

CREATE OR REPLACE MLE MODULE holamundo_mod LANGUAGE JAVASCRIPT AS

function holamundo() {
console.log(‘Hola Mundo’);
}

export { holamundo }
/

Una vez que el módulo ha sido creado y antes de poder ejecutarlo, debemos crear o definir una especificación de llamado, para lo cual usamos el siguiente código:

CREATE OR REPLACE PROCEDURE holamundo_proc
AS MLE MODULE holamundo_mod
SIGNATURE ‘holamundo()’;
/

Si esta es la primera vez que trata de ejecutar un procedimiento en Javascript para el usuario, obtendrá un error ORA-01031: privilegios insuficientes.

Para evitar que este error se produzca, es necesario asignar al usuario el privilegio necesario para ejecutar código Javascript, lo cual hacemos ejecutando la siguiente sentencia:

GRANT EXECUTE ON JAVASCRIPT TO TEST;

Todo lo que queda por hacer es ejecutar nuestro nuevo procedimiento, pero antes algo importante. Como podemos ver en el código del módulo Javascript, estamos utilizando la sentencia console.log. Esta sentencia está “mapeada” para que sea mostrada en PL/SQL por medio de DBMS_OUTPUT, por lo que es importante habilitar la salida del servidor en nuestra sesión SQL. Teniendo esto en cuenta, para probar nuestro módulo Javascript, en nuestra sesión de SQL vamos a ejecutar las siguientes sentencias:

set serveroutput on

begin
holamundo_proc;
end;
/

Si todo fue bien y escrito correctamente, en la ventana de su sesión SQL, aparecerá el mensaje Hola Mundo.

Esta funcionalidad tiene muchas más cosas, pero por el momento esta introducción es suficiente para que empecemos a probar con la misma.

Ya les contaré más sobre esta y otras nuevas funcionalidades de la base de datos 23c.

Enlaces

Si desean seguir investigando por su cuenta, les dejo estos enlaces que los pueden resultar útiles.
Javascript Developer’s Guide
Oracle Database New Features

También te puede gustar…

Alcance de Acciones Dinámicas

Alcance de Acciones Dinámicas

Las acciones dinámicas son una de las características más importantes de APEX, puesto que nos permiten extender...

Share This