Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tạo cá thể java.sql.blob trong thủ tục lưu trữ java

Tôi đã sai. Nó có thể được thực hiện. Tôi đã mất một thời gian để làm cho nó hoạt động, nhưng cuối cùng, đây là một ví dụ hoạt động:

Lớp 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;
  }
}

Như bạn thấy, tôi đã sử dụng oracle.sql.BLOB cho kết quả. Tôi tạo nó bằng createTemporary tĩnh phương thức của BLOB , chỉ định rằng nó sẽ được tạo trong suốt thời gian của phiên (oracle.sql.BLOB.DURATION_SESSION tham số).

Sau đó, tôi nhận được OutputStream và ghi dữ liệu. Cần xả nước.

Phía cơ sở dữ liệu

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

Kiểm tra:

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

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

Đầu ra:

test

(câu trả lời trước)

Tôi nghĩ bạn nên có IN OUT BLOB trong test_create_excel của bạn (thay đổi nó thành một thủ tục), và hoạt động trên tham số đó bên trong phương thức được lưu trữ trong Java của bạn. Tôi đã thấy cách tiếp cận đó một lần.

Trước khi gọi test_create_excel , bạn nên tạo một BLOB đối tượng:

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

Chỉnh sửa

Tôi không nghĩ những gì bạn đang cố gắng làm là khả thi. Tuy nhiên, bạn có thể bọc đoạn mã trên trong một hàm khác. Nó hơi lộn xộn, nhưng sau đó bạn sẽ có một hàm trả về 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. Cách lấy vĩ độ và độ dài từ sdo_geometry trong oracle

  2. sử dụng DBMS_APPLICATION_INFO với Jboss

  3. <> Có nghĩa là gì trong Oracle

  4. Cập nhật đồng thời trong Oracle:Khóa hay không?

  5. làm thế nào để sửa đổi một ràng buộc kiểm tra hiện có?