J'ai eu tort. Il peut être terminé. J'ai mis du temps à le faire fonctionner, mais finalement, voici un exemple fonctionnel :
Classe 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;
}
}
Comme vous pouvez le voir, j'ai utilisé le oracle.sql.BLOB
pour le résultat. Je le crée avec le statique createTemporary
méthode du BLOB
classe, en précisant qu'elle doit être créée pour la durée de la session (oracle.sql.BLOB.DURATION_SESSION
paramètre).
Ensuite, j'obtiens le OutputStream
et écrire les données. Flush était nécessaire.
Côté base de données
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;
Sortie :
test
(réponse précédente)
Je pense que vous devriez avoir un IN OUT BLOB
paramètre dans votre test_create_excel
fonction (changez-la en procédure) et utilisez ce paramètre dans votre méthode stockée Java. J'ai vu cette approche une fois.
Avant d'appeler le test_create_excel
, vous devez créer un BLOB
objet :
DECLARE
l_blob BLOB;
BEGIN
DBMS_LOB.createtemporary(l_blob, TRUE);
test_create_excel('username', l_blob);
END;
Modifier
Je ne pense pas que ce que tu essaies de faire soit possible. Cependant, vous pouvez envelopper le code ci-dessus dans une autre fonction. C'est un peu confus, mais vous aurez alors une fonction qui renvoie le 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;