sql >> データベース >  >> RDS >> Oracle

Javaストアドプロシージャでjava.sql.blobインスタンスを作成します

    私は間違っていた。 できます 終わり。それが機能するようになるまでしばらく時間がかかりましたが、最後に、ここに実際の例があります:

    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;
    

    編集

    あなたがやろうとしていることは不可能だと思います。ただし、上記のコードを別の関数でラップすることはできます。少し面倒ですが、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. MySQL接続がSSL暗号化されているかどうかを確認するにはどうすればよいですか?

    2. ラインフィードを含むデータをPostgreSQLからCSVとしてエクスポートする

    3. 列の値に基づいてOracleクエリの結果を展開する方法

    4. PostgreSQLデータベースのコメントを取得するにはどうすればよいですか?