Инициировать объект OrdImage без вставки чего-либо в БД - PullRequest
3 голосов
/ 01 ноября 2011

Я пытаюсь получить объект OrdImage из базы данных Oracle, используя выбор по двойной таблице (выберите ordsys.ordimage.init () из двойной) из-за использования в создании OrdImageSinature для целей поиска в операторе IMGS Similar. Проблема в том, что после сохранения данных в прокси 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, хранится локально на жестком диске (оно не хранится в базе данных). Есть ли обходной путь, как создать OrdImageSignature без создания OrdImage, чтобы обойти эту ошибку или как ее исправить?

Большое спасибо!

1 Ответ

4 голосов
/ 07 декабря 2011

Попробуйте этот кусок кода

// 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();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...