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;