Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Criar instância java.sql.blob no procedimento armazenado java


Eu estava errado. Ele pode ser feito. Demorei um pouco para fazê-lo funcionar, mas, finalmente, aqui está um exemplo de trabalho:

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;
  }
}

Como você pode ver, eu usei o oracle.sql.BLOB para o resultado. Eu crio com o estático createTemporary método do BLOB class, especificando que ela deve ser criada durante a sessão (oracle.sql.BLOB.DURATION_SESSION parâmetro).

Então, obtenho o OutputStream e escrever os dados. A descarga era necessária.

Lado do banco de dados

create or replace FUNCTION getBlobWrp (username IN VARCHAR2) RETURN BLOB
  AS LANGUAGE JAVA NAME
              'TestBlob.getBlob(java.lang.String) return oracle.sql.BLOB';

Teste:
DECLARE
  l_blob BLOB;
BEGIN
  l_blob := getBlobWrp('test');

  dbms_output.put_line(UTL_RAW.CAST_TO_VARCHAR2(l_blob));
END;

Resultado:
test

(resposta anterior)

Acho que você deveria ter um IN OUT BLOB parâmetro em seu test_create_excel função (altere-a para um procedimento) e opere nesse parâmetro dentro de seu método armazenado Java. Eu vi essa abordagem uma vez.

Antes de chamar o test_create_excel , você deve criar um BLOB objeto:
DECLARE
  l_blob BLOB;
BEGIN
  DBMS_LOB.createtemporary(l_blob, TRUE);
  test_create_excel('username', l_blob);
END;

Editar

Eu não acho que o que você está tentando fazer é possível. No entanto, você pode envolver o código acima em outra função. É um pouco confuso, mas você terá uma função que retorna o 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;