Oracle
 sql >> база данни >  >> RDS >> Oracle

Създайте екземпляр на java.sql.blob в съхранена процедура на java

Сгреших. Може бъде направено. Отне ми известно време, за да го накарам да работи, но най-накрая ето работещ пример:

Клас на 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;
  }
}

Както можете да видите, използвах oracle.sql.BLOB за резултата. Създавам го със статичния createTemporary метод на BLOB клас, указвайки, че трябва да бъде създаден за продължителността на сесията (oracle.sql.BLOB.DURATION_SESSION параметър).

След това получавам OutputStream и напишете данните. Беше необходимо промиване.

Страната на базата данни

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

Тест:

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

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

Изход:

test

(предишен отговор)

Мисля, че трябва да имате IN OUT BLOB параметър във вашия test_create_excel функция (променете я на процедура) и работете с този параметър във вашия съхранен метод на Java. Веднъж видях този подход.

Преди да извикате test_create_excel , трябва да създадете BLOB обект:

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

Редактиране

Не мисля, че това, което се опитваш да направиш, е възможно. Можете обаче да обвиете горния код в друга функция. Малко е объркано, но тогава ще имате функция, която връща петното:

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. ORA-28000:акаунтът е заключен Грешка става често

  2. където клауза за избор на термин кодове

  3. Как да използвате Oracle Wallet

  4. regexp за всички знаци с ударения в Oracle

  5. Oracle изберете за поведение на актуализиране