Tôi đã sai. Nó có thể được thực hiện. Tôi đã mất một thời gian để làm cho nó hoạt động, nhưng cuối cùng, đây là một ví dụ hoạt động:
Lớp 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;
}
}
Như bạn thấy, tôi đã sử dụng oracle.sql.BLOB
cho kết quả. Tôi tạo nó bằng createTemporary
tĩnh phương thức của BLOB
, chỉ định rằng nó sẽ được tạo trong suốt thời gian của phiên (oracle.sql.BLOB.DURATION_SESSION
tham số).
Sau đó, tôi nhận được OutputStream
và ghi dữ liệu. Cần xả nước.
Phía cơ sở dữ liệu
create or replace FUNCTION getBlobWrp (username IN VARCHAR2) RETURN BLOB
AS LANGUAGE JAVA NAME
'TestBlob.getBlob(java.lang.String) return oracle.sql.BLOB';
Kiểm tra:
DECLARE
l_blob BLOB;
BEGIN
l_blob := getBlobWrp('test');
dbms_output.put_line(UTL_RAW.CAST_TO_VARCHAR2(l_blob));
END;
Đầu ra:
test
(câu trả lời trước)
Tôi nghĩ bạn nên có IN OUT BLOB
trong test_create_excel
của bạn (thay đổi nó thành một thủ tục), và hoạt động trên tham số đó bên trong phương thức được lưu trữ trong Java của bạn. Tôi đã thấy cách tiếp cận đó một lần.
Trước khi gọi test_create_excel
, bạn nên tạo một BLOB
đối tượng:
DECLARE
l_blob BLOB;
BEGIN
DBMS_LOB.createtemporary(l_blob, TRUE);
test_create_excel('username', l_blob);
END;
Chỉnh sửa
Tôi không nghĩ những gì bạn đang cố gắng làm là khả thi. Tuy nhiên, bạn có thể bọc đoạn mã trên trong một hàm khác. Nó hơi lộn xộn, nhưng sau đó bạn sẽ có một hàm trả về 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;