代码之家  ›  专栏  ›  技术社区  ›  wadesworld

在没有结果集的情况下使用JDBC Spring读取blob

  •  1
  • wadesworld  · 技术社区  · 15 年前

    我有一个Oracle存储过程,它在输出参数中返回一个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;
    

    我想使用JDBCSpring来读取这些数据。但是,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参数而不是resultset时,如何获取blob数据?

    2 回复  |  直到 14 年前
        1
  •  1
  •   OMG Ponies    15 年前

    JDBC Spring API( DefaultLobHandler OracleLobHandler )要求 ResultSet 对象以获取与blob相关的方法。

    你需要转换你的 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;
    

    输出参数总是有利于一些悲伤,尤其是斑点。

        2
  •  0
  •   Community CDub    8 年前

    确实可以在没有结果集的情况下将blob读取为stream/byte[]。检查 this 一个出来。