sql >> Databáze >  >> RDS >> Oracle

Vytvořte instanci java.sql.blob v uložené proceduře java

Mýlil jsem se. může být hotov. Chvíli mi trvalo, než jsem to zprovoznil, ale konečně zde je funkční příklad:

Třída 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;
  }
}

Jak můžete vidět, použil jsem oracle.sql.BLOB pro výsledek. Vytvořím jej pomocí statického createTemporary metoda BLOB třída s uvedením, že by měla být vytvořena po dobu trvání relace (oracle.sql.BLOB.DURATION_SESSION parametr).

Poté získám OutputStream a zapište data. Bylo potřeba spláchnutí.

Strana databáze

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;

Výstup:

test

(předchozí odpověď)

Myslím, že byste měli mít IN OUT BLOB parametr ve vašem test_create_excel funkce (změňte ji na proceduru) a operujte s tímto parametrem uvnitř vaší uložené metody Java. Jednou jsem ten přístup viděl.

Před voláním test_create_excel , měli byste vytvořit BLOB objekt:

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

Upravit

Nemyslím si, že to, o co se snažíš, je možné. Výše uvedený kód však můžete zabalit do jiné funkce. Je to trochu chaotické, ale pak budete mít funkci, která vrátí 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. java.sql.SQLException:Připojení již bylo uzavřeno

  2. Kolejnice 2.3.3 - Nastavení do produkčního režimu

  3. mysql dotaz, výběr určitého pole výsledků

  4. SQL (oracle) pro porovnání dvou seznamů