2 Stimmen

Wann würde isSearchable für eine Oracle JDBC-Spalte auf false zurückgeben?

In welchen Fällen würde ein Aufruf von java.sql.ResultSetMetaData.isSearchable(int col) bei einer Oracle-Datenbank false zurückgeben? Die Dokumentation für die Methode beantwortet die Frage nicht wirklich:

"Gibt an, ob die bezeichnete Spalte in einer WHERE-Klausel verwendet werden kann."

Ich kann nur einen Fall denken - wenn die Spalte das Ergebnis einer Aggregatfunktion ist (in diesem Fall müsste sie Teil eines HAVING-Filters sein und nicht eines WHERE-Filters).

Gibt es noch andere Fälle?

2voto

BalusC Punkte 1034465

Dies hängt mehr mit dem Typ des Spaltenwerts zusammen, nicht damit, wie die Spalte ausgewählt wird. Diese Informationen sind in DatabaseMetaData#getTypeInfo() gespeichert. Die Spalte SEARCHABLE kann entweder DatabaseMetaData.typePredNone (nicht durchsuchbar) oder andere Werte zurückgeben.

9: SEARCHABLE short => können Sie "WHERE" basierend auf diesem Typ verwenden:

  • typePredNone - Keine Unterstützung
  • typePredChar - Nur mit WHERE .. LIKE unterstützt
  • typePredBasic - Unterstützt außer für WHERE .. LIKE
  • typeSearchable - Unterstützt für alle WHERE ..

Hier ist ein Ausschnitt, der diese Informationen anzeigt:

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

Dies ergibt bei einer PostgreSQL 8.4-Verbindung etwas Ähnliches wie folgt:

Typname                      | Datentyp | durchsuchbar
-------------------------------+-----------+------------
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     
(\*Ausschnitt\*, ca. 270 Zeilen, alle WAHR übrigens)

Der Datentyp korreliert mit ResultSetMetaData#getColumnType().

0 Stimmen

Also gibt es keine Beispiele, wo dies falsch wäre? Was ist dann der Sinn? :)

0 Stimmen

Ich habe ehrlich gesagt keine Ahnung. Ich habe es auch noch nie benutzt, sehe aber keine realen Vorteile dafür, außer vielleicht bei webbasierten Datenbankverwaltungstools auf Basis von JDBC. Übrigens habe ich auch einen weiteren Test mit MySQL durchgeführt, alles wahr. Ich habe auch einen expliziteren Test mit typeInfo.getShort("SEARCHABLE") == DatabaseMetaData.typeSearchable gemacht und alles war true.

0 Stimmen

@BalusC Vielen Dank für die Antwort, hast du eine Idee, wie man bestimmen kann, welche Spalten aus der ursprünglichen Abfrage Aggregate-Funktionen waren?

0voto

user7294900 Punkte 52028

@BalusC Antwort ist nicht aktuell, wenn sie auf Oracle 12 ausgeführt wird, gibt es mehrere searchable=false Typen (wie LONG):

Typname                        | Datentyp | durchsuchbar
-------------------------------+-----------+------------
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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X