Myliłem się. może będzie zrobione. Zajęło mi trochę czasu, aby to zadziałało, ale w końcu oto działający przykład:
Klasa Javy
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;
}
}
Jak widać, użyłem oracle.sql.BLOB
za wynik. Tworzę go za pomocą statycznego createTemporary
metoda BLOB
klasy, określając, że powinna być tworzona na czas trwania sesji (oracle.sql.BLOB.DURATION_SESSION
parametr).
Następnie otrzymuję OutputStream
i zapisz dane. Potrzebne było spłukiwanie.
Strona bazy danych
create or replace FUNCTION getBlobWrp (username IN VARCHAR2) RETURN BLOB
AS LANGUAGE JAVA NAME
'TestBlob.getBlob(java.lang.String) return oracle.sql.BLOB';
Test:
DECLARE
l_blob BLOB;
BEGIN
l_blob := getBlobWrp('test');
dbms_output.put_line(UTL_RAW.CAST_TO_VARCHAR2(l_blob));
END;
Wyjście:
test
(poprzednia odpowiedź)
Myślę, że powinieneś mieć IN OUT BLOB
parametr w test_create_excel
funkcji (zmień ją na procedurę) i operuj na tym parametrze wewnątrz metody przechowywanej w Javie. Widziałem kiedyś takie podejście.
Przed wywołaniem test_create_excel
, powinieneś utworzyć BLOB
obiekt:
DECLARE
l_blob BLOB;
BEGIN
DBMS_LOB.createtemporary(l_blob, TRUE);
test_create_excel('username', l_blob);
END;
Edytuj
Nie sądzę, że to, co próbujesz zrobić, jest możliwe. Możesz jednak owinąć powyższy kod w inną funkcję. To trochę nieporządne, ale wtedy będziesz mieć funkcję, która zwraca 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;