Init OrdImage对象,不向DB插入任何内容

时间:2011-11-01 09:53:10

标签: java database oracle

我正在尝试使用双表上的选择(从双重选择ordsys.ordimage.init())从Oracle数据库中检索OrdImage对象,因为在IMGSimilar运算符中为了搜索目的而使用OrdImageSinature创建。问题是,在ORDImage代理中存储数据后,我收到此错误:

java.sql.SQLException: ORA-22275: invalid LOB locator specified
ORA-06512: at "SYS.DBMS_LOB", line 797
ORA-06512: at "ORDSYS.ORDSOURCE", line 778
ORA-06512: at "ORDSYS.ORDIMAGE", line 508
ORA-06512: at line 1

我的代码如下:

Statement statement = connection.createStatement();
OracleResultSet result = (OracleResultSet) statement.executeQuery("SELECT ordsys.ordimage.init(), ordsys.ordimagesignature.init() FROM DUAL");

if (result.next()) {
    OrdImage imageProxy = (OrdImage) result.getORAData(1, OrdImage.getORADataFactory());
    OrdImageSignature imageSignatureProxy = (OrdImageSignature) result.getORAData(2, OrdImageSignature.getORADataFactory());

    statement.close();
    result.close();

    imageProxy.loadDataFromByteArray(image.write().toByteArray()); //this line invokes error
    imageProxy.setProperties();
    imageSignatureProxy.generateSignature(imageProxy);

    //here will be performed search operation
}

我在imageProxy中放置的图像本地存储在HDD上(它不存储在数据库中)。是否有任何解决方法如何创建OrdImageSignature而不创建OrdImage来绕过此错误或如何解决它?

非常感谢!

1 个答案:

答案 0 :(得分:4)

试试这段代码

// retrieve dummy Oracle Mm Java objects from the database
        OrdImage imgProxy = null;
        OrdImageSignature sigProxy = null;
        OracleCallableStatement cstmtOrdImageCreator = (OracleCallableStatement) conn.prepareCall(
                "DECLARE"
                + "  IMG ORDSYS.ORDIMAGE;"
                + "  SIG ORDSYS.ORDIMAGESIGNATURE;"
                + "  IMGBLOB BLOB;"
                + "  SIGBLOB BLOB;"
                + "BEGIN"
                + "  IMG := ORDImage.init();" // init an image
                + "  DBMS_LOB.CreateTemporary(IMG.source.localdata, TRUE);" // an emply BLOB for the image
                + "  SIG := ORDImageSignature.init();" // init a signature of the image
                + "  DBMS_LOB.CreateTemporary(SIG.signature, TRUE);" // an emply BLOB for its signature
                + "  ? := IMG;" // return both the image and its signature as values of output parameters
                + "  ? := SIG;"
                + "END;");
        try {
            cstmtOrdImageCreator.registerOutParameter(1,
                    OrdImage._SQL_TYPECODE, OrdImage._SQL_NAME);
            cstmtOrdImageCreator.registerOutParameter(2,
                    OrdImageSignature._SQL_TYPECODE, OrdImageSignature._SQL_NAME);
            cstmtOrdImageCreator.executeUpdate();
            imgProxy = (OrdImage) cstmtOrdImageCreator.getORAData(1, OrdImage.getORADataFactory());
            sigProxy = (OrdImageSignature) cstmtOrdImageCreator.getORAData(2, OrdImageSignature.getORADataFactory());
        } finally {
            cstmtOrdImageCreator.close();
        }
相关问题