Сгреших. Може бъде направено. Отне ми известно време, за да го накарам да работи, но най-накрая ето работещ пример:
Клас на 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;
}
}
Както можете да видите, използвах oracle.sql.BLOB
за резултата. Създавам го със статичния createTemporary
метод на BLOB
клас, указвайки, че трябва да бъде създаден за продължителността на сесията (oracle.sql.BLOB.DURATION_SESSION
параметър).
След това получавам OutputStream
и напишете данните. Беше необходимо промиване.
Страната на базата данни
create or replace FUNCTION getBlobWrp (username IN VARCHAR2) RETURN BLOB
AS LANGUAGE JAVA NAME
'TestBlob.getBlob(java.lang.String) return oracle.sql.BLOB';
Тест:
DECLARE
l_blob BLOB;
BEGIN
l_blob := getBlobWrp('test');
dbms_output.put_line(UTL_RAW.CAST_TO_VARCHAR2(l_blob));
END;
Изход:
test
(предишен отговор)
Мисля, че трябва да имате IN OUT BLOB
параметър във вашия test_create_excel
функция (променете я на процедура) и работете с този параметър във вашия съхранен метод на Java. Веднъж видях този подход.
Преди да извикате test_create_excel
, трябва да създадете BLOB
обект:
DECLARE
l_blob BLOB;
BEGIN
DBMS_LOB.createtemporary(l_blob, TRUE);
test_create_excel('username', l_blob);
END;
Редактиране
Не мисля, че това, което се опитваш да направиш, е възможно. Можете обаче да обвиете горния код в друга функция. Малко е объркано, но тогава ще имате функция, която връща петното:
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;