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 createTemporary
static 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;