sql >> Database >  >> RDS >> Oracle

Maak een java.sql.blob-instantie in de Java-opgeslagen procedure

Ik had het fout. Het kan klaar zijn. Het kostte me een tijdje om het werkend te krijgen, maar tot slot is hier een werkend voorbeeld:

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

Zoals je kunt zien, heb ik de oracle.sql.BLOB . gebruikt voor het resultaat. Ik maak het met de statische createTemporary methode van de BLOB class, waarbij wordt aangegeven dat deze moet worden gemaakt voor de duur van de sessie (oracle.sql.BLOB.DURATION_SESSION parameter).

Vervolgens verkrijg ik de OutputStream en schrijf de gegevens. Doorspoelen was nodig.

Databasezijde

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;

Uitgang:

test

(vorige antwoord)

Ik denk dat je een IN OUT BLOB . moet hebben parameter in uw test_create_excel functie (verander het in een procedure), en werk op die parameter binnen uw opgeslagen Java-methode. Ik heb die benadering ooit gezien.

Voordat u de test_create_excel . aanroept , moet u een BLOB . maken voorwerp:

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

Bewerken

Ik denk niet dat wat je probeert te doen mogelijk is. U kunt de bovenstaande code echter in een andere functie inpakken. Het is een beetje rommelig, maar dan heb je een functie die de blob retourneert:

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;



  1. Mysql online gebruiken met een desktop-app

  2. Aangepaste SELECT-clausule opnemen in ActiveRecord-query

  3. Gebruikersaccountbeheer, rollen, machtigingen, authenticatie PHP en MySQL -- Deel 5

  4. Mogelijke injectie vanaf datumreeks Selecteer zoekopdracht