Oracle
 sql >> Base de données >  >> RDS >> Oracle

Créer une instance java.sql.blob dans la procédure stockée Java

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;