Jeg tog fejl. Det kan være færdig. Det tog mig et stykke tid at få det til at virke, men endelig er her et eksempel på arbejdet:
Java-klasse
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 jeg brugt oracle.sql.BLOB
for resultatet. Jeg opretter det med den statiske createTemporary
metoden for BLOB
klasse, der angiver, at den skal oprettes under sessionens varighed (oracle.sql.BLOB.DURATION_SESSION
parameter).
Derefter henter jeg OutputStream
og skriv dataene. Skylning var nødvendig.
Databaseside
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;
Output:
test
(tidligere svar)
Jeg synes, du skal have en IN OUT BLOB
parameter i din test_create_excel
funktion (ændre den til en procedure), og betjen den parameter inde i din Java-lagrede metode. Jeg så den tilgang en gang.
Før du kalder test_create_excel
, bør du oprette en BLOB
objekt:
DECLARE
l_blob BLOB;
BEGIN
DBMS_LOB.createtemporary(l_blob, TRUE);
test_create_excel('username', l_blob);
END;
Rediger
Jeg tror ikke det du prøver at gøre er muligt. Du kan dog pakke ovenstående kode ind i en anden funktion. Det er lidt rodet, men så har du en funktion, som returnerer klatten:
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;