Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Erstellen Sie eine java.sql.blob-Instanz in einer gespeicherten Java-Prozedur

Ich lag falsch. Es kann getan werden. Ich habe eine Weile gebraucht, um es zum Laufen zu bringen, aber hier ist endlich ein funktionierendes Beispiel:

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

Wie Sie sehen können, habe ich das oracle.sql.BLOB verwendet für das Ergebnis. Ich erstelle es mit dem statischen createTemporary Methode des BLOB Klasse, die angibt, dass sie für die Dauer der Sitzung erstellt werden soll (oracle.sql.BLOB.DURATION_SESSION Parameter).

Dann erhalte ich den OutputStream und die Daten schreiben. Eine Spülung war erforderlich.

Datenbankseite

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;

Ausgabe:

test

(vorherige Antwort)

Ich denke, Sie sollten einen IN OUT BLOB haben Parameter in Ihrem test_create_excel Funktion (ändern Sie sie in eine Prozedur) und bearbeiten Sie diesen Parameter in Ihrer gespeicherten Java-Methode. Ich habe diesen Ansatz einmal gesehen.

Vor dem Aufruf von test_create_excel , sollten Sie ein BLOB erstellen Objekt:

DECLARE
  l_blob BLOB;
BEGIN
  DBMS_LOB.createtemporary(l_blob, TRUE);
  test_create_excel('username', l_blob);
END;

Bearbeiten

Ich glaube nicht, dass das, was du vorhast, möglich ist. Sie könnten den obigen Code jedoch in eine andere Funktion einschließen. Es ist ein bisschen chaotisch, aber dann haben Sie eine Funktion, die den Blob zurückgibt:

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;