sql >> Database teknologi >  >> RDS >> Oracle

Opret java.sql.blob-instans i Java-lagret procedure

Jeg tog fejl. Det kan være færdig. Det tog mig et stykke tid at få det til at virke, men endelig er her et eksempel på arbejdet:

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

Som du kan se, har jeg brugt oracle.sql.BLOB for resultatet. Jeg opretter det med den statiske createTemporary metoden for BLOB klasse, der angiver, at den skal oprettes under sessionens varighed (oracle.sql.BLOB.DURATION_SESSION parameter).

Derefter henter jeg OutputStream og skriv dataene. Skylning var nødvendig.

Databaseside

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;

Output:

test

(tidligere svar)

Jeg synes, du skal have en IN OUT BLOB parameter i din test_create_excel funktion (ændre den til en procedure), og betjen den parameter inde i din Java-lagrede metode. Jeg så den tilgang en gang.

Før du kalder test_create_excel , bør du oprette en BLOB objekt:

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

Rediger

Jeg tror ikke det du prøver at gøre er muligt. Du kan dog pakke ovenstående kode ind i en anden funktion. Det er lidt rodet, men så har du en funktion, som returnerer klatten:

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. Hvad er begrænsningerne ved at implementere MySQL NDB Cluster?

  2. Hvordan Oracle Index klyngefaktor beregnes

  3. advarselsproblem:forventer, at parameter 1 er mysqli_result

  4. vælg flere rækker forskellig værdi fra samme tabel