sql >> Databasteknik >  >> RDS >> Oracle

Skapa java.sql.blob-instans i lagrad java-procedur

Jag hade fel. Det kan ske. Det tog ett tag för mig att få det att fungera, men äntligen, här är ett fungerande exempel:

Java-klass

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

Som du kan se har jag använt oracle.sql.BLOB för resultatet. Jag skapar den med den statiska createTemporary metod för BLOB klass, som anger att den ska skapas under sessionens varaktighet (oracle.sql.BLOB.DURATION_SESSION parameter).

Sedan får jag OutputStream och skriv data. Spola behövdes.

Databassidan

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

Testa:

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

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

Utdata:

test

(föregående svar)

Jag tycker att du ska ha en IN OUT BLOB parametern i din test_create_excel funktion (ändra den till en procedur) och kör på den parametern i din Java-lagrade metod. Jag såg det tillvägagångssättet en gång.

Innan du anropar test_create_excel , bör du skapa en BLOB objekt:

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

Redigera

Jag tror inte att det du försöker göra är möjligt. Du kan dock slå in ovanstående kod i en annan funktion. Det är lite rörigt, men då har du en funktion som returnerar 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. Vad är skillnaden mellan MySQL och SQL?

  2. Varför ignorerar Oracle index med ORDER BY?

  3. sysdate skillnad

  4. MySQL CASE...WHERE...DÅ uttalanden