2011-11-01 55 views
3

我想從Oracle數據庫檢索OrdImage對象使用選擇雙表(從雙重選擇ordsys.ordimage.init())由於OrdImageSinature創建用於IMGSimilar運算符中的搜索目的。問題是,在的ORDImage代理存儲數據後,我得到這個錯誤:初始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來繞過此錯誤或如何解決它?

非常感謝!

回答

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(); 
     } 
相關問題