2009-09-24 25 views
1

我有一個Oracle存儲過程中的輸出參數返回BLOB:閱讀使用JDBC春天沒有結果的BLOB設置

PROCEDURE GET_IMAGE_DATA(i_image_type IN NUMBER, o_image_data OUT BLOB) IS 
BEGIN 
     SELECT IMAGE_DATA 
     INTO o_image_data 
     FROM IMAGES 
     WHERE IMAGE_TYPE = i_image_type; 

END GET_IMAGE_DATA; 

我想用JDBC Spring來讀取該數據。但是,DefaultLobHandler(我認爲OracleLobHandler)getBlobAsBytes()需要一個結果集。

private static class QueryForBinaryCryptKey extends StoredProcedure { 

     private static final String SQL = "IMAGE_PKG.GET_IMAGE_DATA"; 
     private DefaultLobHandler lobHandler; 

     QueryForImageData(DataSource dataSource) { 
      super(dataSource, SQL); 
      setFunction(false); 
      lobHandler = new DefaultLobHandler(); 

      declareParameter(new SqlParameter(KEY_TYPE, OracleTypes.NUMBER)); 
      declareParameter(new SqlOutParameter(KEY_BLOB, OracleTypes.BLOB)); 

     } 

     public Map getImage(int keyType) { 
      Map outParams = super.execute(inParams(keyType)); 
        //how can I get the contents of the blob right here since 
        //getBlobAsBytes requires a resultSet??? 
      return outParams; 
     } 

     private Map inParams(int keyType) { 
      Map params = new HashMap(); 
      params.put(KEY_TYPE, new Integer(keyType)); 
      return params; 
     } 
    } 

當我擁有的是out參數而不是結果集時,如何獲得blob數據?

回答

1

對於他們的BLOB相關方法,JDBC Spring API(DefaultLobHandlerOracleLobHandler)需要一個ResultSet對象。

您需要將GET_IMAGE_DATA過程轉換爲功能

FUNCTION ATTACHMENT_BLOB_GET(IN_IMAGE_TYPE IN IMAGES.IMAGE_TYPE%TYPE) 
RETURN SYS_REFCURSOR AS 

results_cursor SYS_REFCURSOR; 

BEGIN 

    OPEN results_cursor FOR 
    SELECT t.image_data 
     FROM IMAGES t 
     WHERE t.image_type = IN_IMAGE_TYPE; 

    RETURN results_cursor; 

END; 

OUT參數總是好一些悲痛,尤其是BLOB的。

0

確實有可能在沒有ResultSet的情況下將Blob作爲Stream/byte []讀取。檢查this一出。