代码之家  ›  专栏  ›  技术社区  ›  Ian Varley

对于oraclejdbc列,issearable何时返回false?

  •  1
  • Ian Varley  · 技术社区  · 14 年前

    在什么情况下 java.sql.ResultSetMetaData.isSearchable(int col) documentation 因为这个方法并不能真正回答这个问题:

    "Indicates whether the designated column can be used in a where clause."
    

    HAVING 过滤器,不是 WHERE 过滤器)。

    还有别的案子吗?

    1 回复  |  直到 14 年前
        1
  •  2
  •   BalusC    14 年前

    这与列值的类型有关,而与列的选择方式无关。此信息存储在 DatabaseMetaData#getTypeInfo() . 列 SEARCHABLE 可以返回任何一个 DatabaseMetaData.typePredNone

    9: 短=>你能用吗 "WHERE" 基于此类型:

    • typePredNone -不支持
    • typePredChar -仅支持 WHERE .. LIKE
    • typePredBasic -支持,但 哪里。。就像
    • typeSearchable -支持所有人 WHERE ..

    DatabaseMetaData databaseMetaData = connection.getMetaData();
    ResultSet typeInfo = databaseMetaData.getTypeInfo();
    System.out.println("type name                      | data type | searchable");
    System.out.println("-------------------------------+-----------+------------");
    while (typeInfo.next()) {
        String typeName = typeInfo.getString("TYPE_NAME");
        int dataType = typeInfo.getInt("DATA_TYPE");
        boolean searchable = typeInfo.getShort("SEARCHABLE") != DatabaseMetaData.typePredNone;
        System.out.printf("%-30s | %-9d | %-9s%n", typeName , dataType, searchable);
    }
    

    这会在PostgreSQL 8.4连接上产生如下结果:

    type name                      | data type | searchable
    -------------------------------+-----------+------------
    bool                           | -7        | true     
    bytea                          | -2        | true     
    char                           | 1         | true     
    name                           | 12        | true     
    int8                           | -5        | true     
    bigserial                      | -5        | true     
    int2                           | 5         | true     
    int2vector                     | 1111      | true     
    int4                           | 4         | true     
    serial                         | 4         | true     
    regproc                        | 1111      | true     
    text                           | 12        | true     
    (*snip*, it were about 270 rows, all TRUE by the way)
    

    这个 data type ResultSetMetaData#getColumnType()

        2
  •  0
  •   Ori Marko    5 年前

    @巴卢斯克 answer 在oracle12上执行时,有几个 searchable=假 类型(尽可能长):

    type name                      | data type | searchable
    -------------------------------+-----------+------------
    INTERVALDS                     | -104      | true     
    INTERVALYM                     | -103      | true     
    TIMESTAMP WITH LOCAL TIME ZONE | -102      | true     
    TIMESTAMP WITH TIME ZONE       | -101      | true     
    NCHAR                          | -15       | true     
    NVARCHAR2                      | -9        | true     
    NUMBER                         | -7        | true     
    NUMBER                         | -6        | true     
    NUMBER                         | -5        | true     
    LONG RAW                       | -4        | false    
    RAW                            | -3        | true     
    LONG                           | -1        | false    
    CHAR                           | 1         | true     
    NUMBER                         | 2         | true     
    NUMBER                         | 4         | true     
    NUMBER                         | 5         | true     
    FLOAT                          | 6         | true     
    REAL                           | 7         | true     
    VARCHAR2                       | 12        | true     
    DATE                           | 92        | true     
    DATE                           | 93        | true     
    TIMESTAMP                      | 93        | true     
    STRUCT                         | 2002      | false    
    ARRAY                          | 2003      | false    
    BLOB                           | 2004      | false    
    CLOB                           | 2005      | false    
    REF                            | 2006      | false    
    NCLOB                          | 2011      | false