Oracle
 sql >> Database >  >> RDS >> Oracle

Crea un'istanza java.sql.blob nella procedura memorizzata java

Mi sbagliavo. può essere fatto. Mi ci è voluto un po' per farlo funzionare, ma, finalmente, ecco un esempio funzionante:

Classe 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;
  }
}

Come puoi vedere, ho usato oracle.sql.BLOB per il risultato. Lo creo con il createTemporary statico metodo del BLOB classe, specificando che deve essere creata per la durata della sessione (oracle.sql.BLOB.DURATION_SESSION parametro).

Quindi, ottengo il OutputStream e scrivi i dati Era necessario il lavaggio.

Lato database

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

Prova:

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

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

Uscita:

test

(risposta precedente)

Penso che dovresti avere un IN OUT BLOB parametro nel tuo test_create_excel funzione (cambialo in una procedura) e opera su quel parametro all'interno del tuo metodo memorizzato Java. Ho visto quell'approccio una volta.

Prima di chiamare il test_create_excel , dovresti creare un BLOB oggetto:

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

Modifica

Non credo che quello che stai cercando di fare sia possibile. Tuttavia, potresti racchiudere il codice sopra in un'altra funzione. È un po' disordinato, ma poi avrai una funzione che restituisce il 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;