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