sql >> Base de Datos >  >> RDS >> Oracle

Crear una instancia de java.sql.blob en el procedimiento almacenado de Java

Estaba equivocado. puede hacerse Me tomó un tiempo hacerlo funcionar, pero, finalmente, aquí hay un ejemplo de trabajo:

clase Java

import oracle.jdbc.driver.*;

public class TestBlob {
  public static oracle.sql.BLOB getBlob(String username) throws Exception {
    oracle.jdbc.OracleConnection conn = 
      (oracle.jdbc.OracleConnection)new OracleDriver().defaultConnection();

    oracle.sql.BLOB retBlob =
      oracle.sql.BLOB.createTemporary(conn,
                                      true,
                                      oracle.sql.BLOB.DURATION_SESSION);

    java.io.OutputStream outStr = retBlob.setBinaryStream(0);
    outStr.write(username.getBytes());
    outStr.flush();

    return retBlob;
  }
}

Como puede ver, he usado el oracle.sql.BLOB por el resultado Lo creo con el createTemporary estático método del BLOB class, especificando que debe crearse mientras dure la sesión (oracle.sql.BLOB.DURATION_SESSION parámetro).

Luego, obtengo el OutputStream y escribir los datos. Era necesario enjuagar.

Lado de la base de datos

create or replace FUNCTION getBlobWrp (username IN VARCHAR2) RETURN BLOB
  AS LANGUAGE JAVA NAME
              'TestBlob.getBlob(java.lang.String) return oracle.sql.BLOB';

Prueba:

DECLARE
  l_blob BLOB;
BEGIN
  l_blob := getBlobWrp('test');

  dbms_output.put_line(UTL_RAW.CAST_TO_VARCHAR2(l_blob));
END;

Salida:

test

(respuesta anterior)

Creo que deberías tener un IN OUT BLOB parámetro en su test_create_excel (cámbielo a un procedimiento) y opere en ese parámetro dentro de su método almacenado de Java. Vi ese enfoque una vez.

Antes de llamar al test_create_excel , debe crear un BLOB objeto:

DECLARE
  l_blob BLOB;
BEGIN
  DBMS_LOB.createtemporary(l_blob, TRUE);
  test_create_excel('username', l_blob);
END;

Editar

No creo que lo que intentas hacer sea posible. Sin embargo, podría envolver el código anterior en otra función. Es un poco complicado, pero luego tendrás una función que devuelve el blob:

CREATE OR REPLACE FUNCTION get_excel_blob(p_username VARCHAR2) RETURN BLOB
AS
  l_blob BLOB;
BEGIN
  DBMS_LOB.createtemporary(l_blob, TRUE);
  test_create_excel(p_username, l_blob);
  RETURN l_blob;
END;