Eu estava errado. Ele pode ser feito. Demorei um pouco para fazê-lo funcionar, mas, finalmente, aqui está um exemplo de trabalho:
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;
}
}
Como você pode ver, eu usei o
oracle.sql.BLOB
para o resultado. Eu crio com o estático createTemporary
método do BLOB
class, especificando que ela deve ser criada durante a sessão (oracle.sql.BLOB.DURATION_SESSION
parâmetro). Então, obtenho o
OutputStream
e escrever os dados. A descarga era necessária. Lado do banco de dados
create or replace FUNCTION getBlobWrp (username IN VARCHAR2) RETURN BLOB
AS LANGUAGE JAVA NAME
'TestBlob.getBlob(java.lang.String) return oracle.sql.BLOB';
Teste:
DECLARE
l_blob BLOB;
BEGIN
l_blob := getBlobWrp('test');
dbms_output.put_line(UTL_RAW.CAST_TO_VARCHAR2(l_blob));
END;
Resultado:
test
(resposta anterior)
Acho que você deveria ter um
IN OUT BLOB
parâmetro em seu test_create_excel
função (altere-a para um procedimento) e opere nesse parâmetro dentro de seu método armazenado Java. Eu vi essa abordagem uma vez. Antes de chamar o
test_create_excel
, você deve criar um BLOB
objeto:DECLARE
l_blob BLOB;
BEGIN
DBMS_LOB.createtemporary(l_blob, TRUE);
test_create_excel('username', l_blob);
END;
Editar
Eu não acho que o que você está tentando fazer é possível. No entanto, você pode envolver o código acima em outra função. É um pouco confuso, mas você terá uma função que retorna o 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;