Mýlil jsem se. může být hotov. Chvíli mi trvalo, než jsem to zprovoznil, ale konečně zde je funkční příklad:
Třída 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;
}
}
Jak můžete vidět, použil jsem oracle.sql.BLOB
pro výsledek. Vytvořím jej pomocí statického createTemporary
metoda BLOB
třída s uvedením, že by měla být vytvořena po dobu trvání relace (oracle.sql.BLOB.DURATION_SESSION
parametr).
Poté získám OutputStream
a zapište data. Bylo potřeba spláchnutí.
Strana databáze
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;
Výstup:
test
(předchozí odpověď)
Myslím, že byste měli mít IN OUT BLOB
parametr ve vašem test_create_excel
funkce (změňte ji na proceduru) a operujte s tímto parametrem uvnitř vaší uložené metody Java. Jednou jsem ten přístup viděl.
Před voláním test_create_excel
, měli byste vytvořit BLOB
objekt:
DECLARE
l_blob BLOB;
BEGIN
DBMS_LOB.createtemporary(l_blob, TRUE);
test_create_excel('username', l_blob);
END;
Upravit
Nemyslím si, že to, o co se snažíš, je možné. Výše uvedený kód však můžete zabalit do jiné funkce. Je to trochu chaotické, ale pak budete mít funkci, která vrátí 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;