Saya salah. Itu bisa dilakukan. Butuh beberapa saat untuk membuatnya berfungsi, tetapi, akhirnya, inilah contoh yang berfungsi:
Kelas 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;
}
}
Seperti yang Anda lihat, saya telah menggunakan oracle.sql.BLOB untuk hasilnya. Saya membuatnya dengan createTemporarystatic statis metode BLOB kelas, menetapkan bahwa itu harus dibuat selama sesi (oracle.sql.BLOB.DURATION_SESSION parameter).
Kemudian, saya mendapatkan OutputStream dan tulis datanya. Flush diperlukan.
Sisi basis data
create or replace FUNCTION getBlobWrp (username IN VARCHAR2) RETURN BLOB
AS LANGUAGE JAVA NAME
'TestBlob.getBlob(java.lang.String) return oracle.sql.BLOB';
Tes:
DECLARE
l_blob BLOB;
BEGIN
l_blob := getBlobWrp('test');
dbms_output.put_line(UTL_RAW.CAST_TO_VARCHAR2(l_blob));
END;
Keluaran:
test
(jawaban sebelumnya)
Saya pikir Anda harus memiliki IN OUT BLOB parameter di test_create_excel . Anda function (ubah ke prosedur), dan operasikan parameter itu di dalam metode tersimpan Java Anda. Saya pernah melihat pendekatan itu.
Sebelum memanggil test_create_excel , Anda harus membuat BLOB objek:
DECLARE
l_blob BLOB;
BEGIN
DBMS_LOB.createtemporary(l_blob, TRUE);
test_create_excel('username', l_blob);
END;
Sunting
Saya tidak berpikir apa yang Anda coba lakukan adalah mungkin. Namun, Anda bisa membungkus kode di atas dalam fungsi lain. Agak berantakan, tetapi Anda akan memiliki fungsi yang mengembalikan gumpalan:
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;