Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Utwórz instancję java.sql.blob w procedurze składowanej java

Myliłem się. może będzie zrobione. Zajęło mi trochę czasu, aby to zadziałało, ale w końcu oto działający przykład:

Klasa Javy

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

Jak widać, użyłem oracle.sql.BLOB za wynik. Tworzę go za pomocą statycznego createTemporary metoda BLOB klasy, określając, że powinna być tworzona na czas trwania sesji (oracle.sql.BLOB.DURATION_SESSION parametr).

Następnie otrzymuję OutputStream i zapisz dane. Potrzebne było spłukiwanie.

Strona bazy danych

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;

Wyjście:

test

(poprzednia odpowiedź)

Myślę, że powinieneś mieć IN OUT BLOB parametr w test_create_excel funkcji (zmień ją na procedurę) i operuj na tym parametrze wewnątrz metody przechowywanej w Javie. Widziałem kiedyś takie podejście.

Przed wywołaniem test_create_excel , powinieneś utworzyć BLOB obiekt:

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

Edytuj

Nie sądzę, że to, co próbujesz zrobić, jest możliwe. Możesz jednak owinąć powyższy kod w inną funkcję. To trochę nieporządne, ale wtedy będziesz mieć funkcję, która zwraca 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;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. łącząca wyrocznię z r

  2. Typy danych Oracle

  3. REgex, aby uzyskać numerację z ciągu w oracle

  4. Uzyskaj kopertę.tj. nakładające się okresy czasu

  5. Oracle odpowiednik information_schema.tables