Jag hade fel. Det kan ske. Det tog ett tag för mig att få det att fungera, men äntligen, här är ett fungerande exempel:
Java-klass
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;
}
}
Som du kan se har jag använt oracle.sql.BLOB
för resultatet. Jag skapar den med den statiska createTemporary
metod för BLOB
klass, som anger att den ska skapas under sessionens varaktighet (oracle.sql.BLOB.DURATION_SESSION
parameter).
Sedan får jag OutputStream
och skriv data. Spola behövdes.
Databassidan
create or replace FUNCTION getBlobWrp (username IN VARCHAR2) RETURN BLOB
AS LANGUAGE JAVA NAME
'TestBlob.getBlob(java.lang.String) return oracle.sql.BLOB';
Testa:
DECLARE
l_blob BLOB;
BEGIN
l_blob := getBlobWrp('test');
dbms_output.put_line(UTL_RAW.CAST_TO_VARCHAR2(l_blob));
END;
Utdata:
test
(föregående svar)
Jag tycker att du ska ha en IN OUT BLOB
parametern i din test_create_excel
funktion (ändra den till en procedur) och kör på den parametern i din Java-lagrade metod. Jag såg det tillvägagångssättet en gång.
Innan du anropar test_create_excel
, bör du skapa en BLOB
objekt:
DECLARE
l_blob BLOB;
BEGIN
DBMS_LOB.createtemporary(l_blob, TRUE);
test_create_excel('username', l_blob);
END;
Redigera
Jag tror inte att det du försöker göra är möjligt. Du kan dock slå in ovanstående kod i en annan funktion. Det är lite rörigt, men då har du en funktion som returnerar 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;