Oracle Java:将 java.sql.Blob 数据类型转换为 Oracle BLOB

在执行接受并返回 BLOB 数据的 Oracle Java 过程时,我收到以下错误,

错误报告 - ORA-00932:不一致的数据类型:预期返回值是可转换为 Oracle 类型的用户定义 Java 类的实例,得到一个无法转换的对象 ORA-06512:在“”,第 86 行 ORA- 06512:在第 7 行 00932.00000 -“不一致的数据类型:预期的 %s 得到了 %s”*原因:
*操作:

Java 代码

public static java.sql.Blob Convert_Image(java.sql.Blob srcBlob) {


java.sql.Blob desBlob = null;


try {

    Document document = new Document();


    ByteArrayOutputStream pdfDocumentOutputStream = new ByteArrayOutputStream();

    PdfWriter pdfDocumentWriter = PdfWriter.getInstance(document, pdfDocumentOutputStream);                        

    document.open();


    if (document.newPage()) {


        int indentation = 0;

        Image img = Image.getInstance(srcBlob.getBytes(1, (int) srcBlob.length()));

        float scaler = document.getPageSize().getWidth() - document.leftMargin() - document.rightMargin() - indentation;

        img.scalePercent((scaler / img.getWidth()) * 100);


        document.newPage();

        document.add(Image.getInstance(img));

        document.close();


        desBlob = new SerialBlob(pdfDocumentOutputStream.toByteArray());


        pdfDocumentWriter.close();

        pdfDocumentOutputStream.close();


    }   

}

catch (Exception e) {

    Show_Message(e);

}


return desBlob;


}

甲骨文代码


FUNCTION CONVERT_IMAGE(

    P_BLOB IN DOCUMENTS.BLOB_CONTENT%TYPE)

  RETURN BLOB

AS

  LANGUAGE JAVA NAME 'egift.Util.Convert_Image (java.sql.Blob) return java.sql.Blob';  

触发器实现


...

DECLARE


    v_blob_content DOCUMENTS.BLOB_CONTENT%TYPE;




大话西游666
浏览 490回答 3
3回答

潇潇雨雨

这是我实施的临时解决方案,因为我接近截止日期,我仍在寻找一个解决方案,其中我不必使用不推荐使用的类,并且希望避免引用 oracle.sql.BLOB 并使用 java .sql.Blob。解决方法涉及创建一个 oracle.sql.BLOB 对象而不是 SerialBlob,然后从输出流中填充 bytearray,如下所示,conn = new OracleDriver().defaultConnection();desBlob = BLOB.createTemporary(conn, false, BLOB.DURATION_SESSION);desBlob.setBytes(1, pdfDocumentOutputStream.toByteArray());并使用抑制弃用警告,@SuppressWarnings("deprecation")最终的 Java 代码@SuppressWarnings("deprecation")public static java.sql.Blob Convert_Image(java.sql.Blob srcBlob) {    java.sql.Blob desBlob = null;    try {        Document document = new Document();        ByteArrayOutputStream pdfDocumentOutputStream = new ByteArrayOutputStream();        PdfWriter pdfDocumentWriter = PdfWriter.getInstance(document, pdfDocumentOutputStream);        document.open();        if (document.newPage()) {            int indentation = 0;            Image img = Image.getInstance(srcBlob.getBytes(1, (int) srcBlob.length()));            float scaler =                document.getPageSize().getWidth() - document.leftMargin() - document.rightMargin() - indentation;            img.scalePercent((scaler / img.getWidth()) * 100);            document.newPage();            document.add(Image.getInstance(img));            document.close();            //desBlob = new SerialBlob(pdfDocumentOutputStream.toByteArray());            conn = new OracleDriver().defaultConnection();            desBlob = BLOB.createTemporary(conn, false, BLOB.DURATION_SESSION);            desBlob.setBytes(1, pdfDocumentOutputStream.toByteArray());            pdfDocumentWriter.close();            pdfDocumentOutputStream.close();        }    } catch (Exception e) {        Show_Message(e);    }    return desBlob;}我已经设置了一个赏金来获得一个解决方案来解决这个问题而不使用不推荐使用的类,但我找不到一个,尽管我收到了对这个问题的关注。在我找到正确的解决方案之前,这对我来说是一个悬而未决的问题。感谢所有努力的人。

拉莫斯之舞

我找到了这个没有弃用代码的解决方案:    public static Blob bytes2Blob(byte[] b) throws Exception {        if (System.getProperty("oracle.server.version") != null) {            Connection con = DriverManager.getConnection("jdbc:default:connection");            CallableStatement cStmt = con.prepareCall ("{ call DBMS_LOB.createtemporary(?,true,DBMS_LOB.SESSION) }");            cStmt.registerOutParameter(1, OracleTypes.BLOB);            cStmt.execute();            Blob blob = ((OracleCallableStatement)cStmt).getBLOB(1);            cStmt.close();            OutputStream out = blob.setBinaryStream(1L);            out.write(b);            out.flush();            return blob;        } else {            return new javax.sql.rowset.serial.SerialBlob(b);        }

喵喵时光机

您需要返回 Java 过程的实例oracle.sql.BLOB或oracle.jdbc2.Blob从 Java 过程返回实例,以创建调用 Java 过程并返回 BLOB 的触发器。ORACLE 实际上有一个表,他们将数据类型与他们可以接受的 Java 实例进行比较:合法的数据类型映射。Oracle 数据库自动在 SQL 类型和 Java 类之间进行转换更新 1:我实际上测试了传递 java.sql.Blob 并在函数中返回相同的类型,它按预期工作:CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "Util" aspublic class Util {  public static java.sql.Blob Convert_Image(java.sql.Blob srcBlob) {    return srcBlob;    }}/CREATE OR REPLACE FUNCTION CONVERT_IMAGE(    P_BLOB BLOB)  RETURN BLOBAS  LANGUAGE JAVA NAME 'Util.Convert_Image (java.sql.Blob) return java.sql.Blob';select utl_raw.cast_to_varchar2(convert_image(utl_raw.cast_to_raw('test'))) from dual;-- test你可以尝试运行上面的代码,看看你是否得到同样的错误?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java