Java en las bases de datos

Últimamente me he encontrado con alguna base de datos que almacena código Java, la verdad es que no conocía mucho sobre este tema, así que aquí incluyo algunas cosillas básicas que me han servido para apañarme un poco

Ver las clases java de un usuario:

SELECT dbms_java.longname (object_name), object_type
FROM user_objects
WHERE object_type = 'JAVA CLASS'

Cómo ver el código Java almacenado en la base de datos

En todas las casos, name es nombre del objeto Java que queremos exportar, schema es el nombre de esquema propietario de objeto, en este caso si no pasamos ningún parametro lo busca en el esquema sobre el que estas.

Se tiene que exportar la clase en un campo BLOB y el código se almacena en UTF8.

Aquí pongo un ejemplo de un procedimiento que encontré por ahí para exportar el código fuente y lograr ver que contiene.

Existen tres tipos de objetos  class, source y resource en función de lo que queramos ver debemos utilizar uno de los siguientes procedimientos: dbms_java.export_class, dbms_java.EXPORT_RESOURCE, dbms_java.source

CREATE OR REPLACE PROCEDURE mostrar_fuente_java (
   NAME     IN   VARCHAR2,
   SCHEMA   IN   VARCHAR2 := NULL
)
/*
||  Overview: Shows Java source (prototype)
||
||  Author: Vadim Loevski
*/
IS
   b                      BLOB;
   v                      VARCHAR2 (2000);
   i                      INTEGER;
   object_not_available   EXCEPTION;
   PRAGMA EXCEPTION_INIT (object_not_available, -29532);

   PROCEDURE pl (
      str         IN   VARCHAR2,
      len         IN   INTEGER := 80,
      expand_in   IN   BOOLEAN := TRUE
   )
   IS
      v_len   PLS_INTEGER     := LEAST (len, 255);
      v_str   VARCHAR2 (2000);
   BEGIN
      IF LENGTH (str) > v_len
      THEN
         v_str := SUBSTR (str, 1, v_len);
         DBMS_OUTPUT.put_line (v_str);
         pl (SUBSTR (str, len + 1), v_len, expand_in);
      ELSE
         v_str := str;
         DBMS_OUTPUT.put_line (v_str);
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         IF expand_in
         THEN
            DBMS_OUTPUT.ENABLE (1000000);
            DBMS_OUTPUT.put_line (v_str);
         ELSE
            RAISE;
         END IF;
   END;
BEGIN
   /* Move the Java source code to a CLOB. */
   DBMS_LOB.createtemporary (b, FALSE );
   dbms_java.export_class (NAME, NVL (SCHEMA, USER), b);
   /* Read the CLOB to a VARCHAR2 variable and display it. */
   i := 1000;
   DBMS_LOB.READ (b, i, 1, v);
   pl (v);
EXCEPTION
   WHEN object_not_available
   THEN
      IF (SQLERRM) LIKE '%no such%object'
      THEN
         DBMS_OUTPUT.put_line ('Java object cannot be found.');
      END IF;
END;
/

Se puede ver el código de la siguiente manera, claro el  DBMS_OUTPUT tiene que estar activado

SQL> exec mostrar_fuente_java ('<nombre_fuente>')

Compilar una clase java almacenada en la base de datos:

 alter  java class "QualifyHost" resolve;

SET_OUTPUT: Activando el Output de Java

Las clases System.out y System.err mandan sus salidas al archivo de trazas que se este utilizando (cuando se ejecutan dentro de la base de datos Oracle).

Este no es un repositorio muy efectivo si simplemente se quiere probar el código para ver si está funcionando correctamente.

DBMS_JAVA time un procedimiento para re direccionar la salida al buffer de texto del DBMS_OUTPUT y así se muestra en la pantalla de SQL*Plus automáticamente.La sintaxis del procedimiento es:

PROCEDURE DBMS_JAVA.SET_OUTPUT (buffersize NUMBER);

Y un ejemplo de cómo utilizarlo:

SET SERVEROUTPUT ON SIZE 1000000

CALL DBMS_JAVA.SET_OUTPUT (1000000);

El mínimo buffer (y por defecto) es de 2000 bytes y el tamaño máximo 1,000,000 bytes (se puede pasar un número mayor sin que provoque error salvo que sea realmente grande. El tamaño del buffer especificado con SET SERVEROUTPUT suprime lo que se indique en DBMS_JAVA.SET_OUTPUT. Como con el DBMS_OUTPUT, no se verá ninguna salida hasta que no termine la llamada al procedimiento almacenado.