# SQL Abfrage: Zeige alle Values von bestimmten Tabellen



## Taramsis (8. Mai 2009)

Hi,

ich möchte von vorher ausgewählten Tablen einer DB die Namen der Colums auflisten:


```
public Object[][] listDBValue() {
        Object[][] list = null;
        int listSize = 0;
        
        try {
            Class.forName(driver);
            con =  (Connection) DriverManager.getConnection(url , user, pass);
           
            stmt = (Statement) con.createStatement();

            values =(ResultSet) stmt.executeQuery( "SHOW COLUMNS FROM " + 
                                                            managerApp.getManagerWiz().getChooseTable() + " " + " IN " + 
                                                            managerApp.getManagerWiz().getSelectDB() + " ");
            

            while (values.next()) {
                listSize++;
            }
            values.first();

            if (listSize > 0) {
                list = new Object[listSize][1];
                for (int i = 0; i < listSize; i++) {
                    list[i][0] = values.getString(1);
            
                    values.next();
                }
            }
            con.close();
        }

        catch(Exception e) {
            e.printStackTrace();
        }
        System.out.println("DB: " + listSize);
        
        return list;
    }
```

Die obige Methode wird in einem jTable angezeigt. Das Problem ist,wenn ich vorher mehr als eine Tabelle ausgewählt habe, bekomme ich die SQLException: No database selected.
Kann man mit 
	
	
	
	





```
SHOW COLUMNS FROM x IN y
```
 nicht mehrere Tabellen wählen????:L


----------



## sparrow (8. Mai 2009)

Schau dir mal das an: ResultSet (Java Platform SE 6))
Damit erhälst du ein ResultSetMetaData-Objekt, daraus kannst du die Spalten einfach auslesen.

Gruß
Sparrow


----------



## Taramsis (8. Mai 2009)

meinst du soetwas?

```
if (listSize > 0) {
                list = new Object[listSize][1];
                for (int i = 0; i < listSize; i++) {
                    list[i][0] = values.getMetaData();
            
                    values.next();
                }
            }
```
Kann man mit der DB Anweisung 
	
	
	
	





```
"SHOW COLUMNS FROM " + 
                                                            managerApp.getManagerWiz().getChooseTable() + " " + " IN " + 
                                                            managerApp.getManagerWiz().getSelectDB() + " "
```
in Ordnung?

Wenn ich nur eine Tabelle auswähle klappt es, denn

```
managerApp.getManagerWiz().getChooseTable()
```
gibt mir einen String der ausgewählten Tabellen mit einem Komma dazwischen wieder.

Danke im Voraus!


----------



## SlaterB (8. Mai 2009)

MySQL :: MySQL 5.1 Referenzhandbuch :: 13.5.4.3 SHOW COLUMNS
offensichtlich geht nur eine Tabelle,

mehrere Tabellen -> mehrere Anfragen,
--------

zu den MetaDaten:
Get column names of a table using ResultSetMetaData : Metadata DB InfoDatabase SQL JDBCJava

aber auch das sicherlich tabellenweise einzeln


----------



## Taramsis (10. Mai 2009)

Hi Leute,

ich verstehe aber nicht warum mir 

```
values =(ResultSet) stmt.executeQuery( "SELECT " + 
                                                            managerApp.getManagerWiz().getChooseTable() + " " + "FROM " + 
                                                            managerApp.getManagerWiz().getSelectDB() + " ");
```

nicht die Values mehrer oder mindestens einer Tabelle liefert.
Denn im gegensatz zu dem Befehl "SHOW COLUMNS" bekomme ich bei der Auswahl von einer Tabele die Fehlermeldung: "java.sql.SQLException: No database selected" !?

Eine andere Frage wäre wie könnte ich den die Strings, die ich in "getChooseTable()" gespeichert habe einzeln in einer For-Schleife auslesen und dann entsprechende "SHOW COLUMNS" Anfragen starten. -> Kann man die SQL Anfragen in einer FOR Schleife einbauen. Hab leider keine Beispiele gefunden.???:L


----------



## SlaterB (10. Mai 2009)

> nicht die Values mehrer oder mindestens einer Tabelle liefert.

was soll das denn bedeuten?
welchen unendlich unverständlichen Sinn kann es haben, irgendwas von  managerApp.getManagerWiz().getChooseTable() mit SQL zu mischen,

wenn du eine SQL-Kommando
"SELECT tableX FROM dbX"
meinst und dazu noch erklärst, dass das eine ein Tabellenname ist und das andere eine Datenbank,
dann kann man das als halbwegs verständliche Frage bezeichnen,

und die Antwort: das ist kein ordentliches SQL,
um alle Werte einer Tabelle abzufragen ginge z.B.
"SELECT * FROM tabelleX"

SQL hat gewisse Regeln, ist kein Wunschkonzert

-----------

> wie könnte ich den die Strings, die ich in "getChooseTable()" gespeichert habe einzeln in einer For-Schleife auslesen und dann [..]

stop, nicht zwei Dinge vermischen, erstmal die String abfragen, 
was getChooseTable() ist, weiß niemand, ob da ein String oder ein Array oder sonst was rauskommt,
jedenfalls musst du am Ende deine Strings zusammen bekommen,
dann darüber eine Schleife, jeweils eine Datenbankabfrage erstellen (klar kann man sowas mehrmals machen), und die Ergebnisse zusammen-sammeln

Beispiel:
eine DB-Anfrage:
DB-Anfrage

viele DB-Anfragen in einer Schleife:
for (..) {
DB-Anfrage
}


----------



## Taramsis (10. Mai 2009)

zur ersten Frage klar!!  

zur zweiten Frage:
Ich will ja über

```
"SHOW COLUMNS FROM " + 
                                                            managerApp.getManagerWiz().getChooseTable() + " " + " IN " + 
                                                            managerApp.getManagerWiz().getSelectDB() + " ")
```
alle Values von den gewählten DB und meheren Tabellen.
In "getChooseTable() " speichere ich ein Strin in der Form: tabelle1, tabelle2, ... (je nach dem welche Tabelle ich im Vorherigen Fenster ausgewählt habe).
Das Problem ist ja, damit ich in der Anfrage mehrere Tabellen angezeigt bekomme muß ich ja mehrere Anfragen straten.
Ich müßte ja die Strings wieder einzeln auslesen oder Sie gleich in verschiedenen Variablen speichern????:L


----------



## SlaterB (10. Mai 2009)

da du nicht weißt, wie viele Tabellen es sein werden, fallen Variablen aus,
der String muss in einer Liste oder Array umgewandelt werden und dann Schleife


----------



## sparrow (10. Mai 2009)

Nur um es nochmal zu sagen:

Im Augenblick konzentrierst du dich darauf das ganze ohne die (eigentlich sehr gute) Unterstützung von Java zu lösen, indem du spezielle mySQL-Kommandos verwendest. Zumindest soweit ich das sehe.
Java selbst hat aber die Möglichkeit über die die Klassen "DatabaseMetaData" und "ResultSetMetaData" die von dir gewünschten Informationen selbst ermitteln. Nur für den Fall, dass du irgendwann mal mit einer anderen Datenbank arbeiten möchtest.


----------



## Taramsis (11. Mai 2009)

Hi,

wie könnte ich diese Schleife aufbauen:

```
for (int i=0; i< managerApp.getManagerWiz().getChooseTable().length; i++) {}
```
Ich habe nun die Tabellen in einem Object[] gespeichert und möchte in der Schleife z.N folgende Anweisung:

```
values = (ResultSet) stmt.executeQuery( "SHOW COLUMNS FROM " + 
                                                                managerApp.getManagerWiz().getChooseTable() + " " + "IN " + 
                                                                managerApp.getManagerWiz().getSelectDB() + " ");
```

Obige Anfrage soll nun i-mal ausgeführt werden. Ich komme einfach nicht dahinter wie man es mit einem ResultSet macht.

@ Sparrrow: die Klassen "DatabaseMetaData" und "ResultSetMetaData" könnte ich dies auch auf meiner mysql DB anwenden und gänzlich auf meiner SQL-Anfrage verzichten?


----------



## sparrow (11. Mai 2009)

Jap, genau.

Hier mal eine kleiner Beispielcode, übrigens eines meiner ersten Programme in Java, nur ein bisschen modernisiert:

```
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;


public class Start {
	
	final static String[] TYPES = {"TABLE"};
	

	
	private static ArrayList<Object> showrs(ResultSet rs, String returnColumnName) throws SQLException {
		ArrayList<Object> returnlist = new ArrayList<Object>();
		int dscount = 1;
		ResultSetMetaData rsmd;
		rsmd = rs.getMetaData();
		while (rs.next()) {
			System.out.println("---  Datensatz " + dscount + "---");
			for (int i = 1; i <= rsmd.getColumnCount(); i++) {
				System.out.print(rsmd.getColumnName(i) + " (" + 
						rsmd.getColumnType(i) + "): ");
						if (rs.getObject(i) != null) {
							System.out.print(rs.getObject(i).toString()+"\n");
						} else {
							System.out.print("NULL\n");
						}
			}
			if (returnColumnName != null) {
				returnlist.add(rs.getObject(returnColumnName));
			}
			dscount++;
		}
		return returnlist;
	}


	public static void main(String[] args) {
		// laden des Datenbanktreibers
		try {
			ResultSet rs;
			Class.forName("org.hsqldb.jdbcDriver");
			Connection con = DriverManager.getConnection("jdbc:hsqldb:file:/home/sparrow/daba/daba","sa","");
			DatabaseMetaData dmd= con.getMetaData();
			// Lese alle Tabelleninformationen für den Typ "TABLES" aus
			System.out.println("**** ES FOLGEN DIE TABELLENINFORMATIONEN ****");
			rs = dmd.getTables(null, null, "%", TYPES);
			ArrayList<Object> tablenames = showrs(rs, "TABLE_NAME");
			rs.close();
			// Lese die Spalten für die Tabellen aus
			for (int i = 0; i < tablenames.size(); i++) {
				System.out.println("**** ES FOLGEN DIE SPALTEN FÜR TABELLE " + tablenames.get(i).toString() + " ****");
				rs = dmd.getColumns(null, null, tablenames.get(i).toString(), "%");
				showrs(rs, null);
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
		


}
```

Diesen wende ich nun auf meine Beispieldatenbank an.
Wie du siehst in diesem Fall HSQLDB weil es schnell gehen musste 
Folgende Tabellen habe ich angelegt:
CREATE table TABA (id IDENTITY, name VARCHAR)
CREATE table TABB (id IDENTITY, lange INTEGER, uhrzeit TIMESTAMP

Und nun schau mal was die Metadaten so alles verraten:

```
**** ES FOLGEN DIE TABELLENINFORMATIONEN ****
---  Datensatz 1---
TABLE_CAT (12): NULL
TABLE_SCHEM (12): NULL
TABLE_NAME (12): TABA
TABLE_TYPE (12): TABLE
REMARKS (12): NULL
TYPE_CAT (12): NULL
TYPE_SCHEM (12): NULL
TYPE_NAME (12): NULL
SELF_REFERENCING_COL_NAME (12): NULL
REF_GENERATION (12): NULL
HSQLDB_TYPE (12): MEMORY
READ_ONLY (16): false
---  Datensatz 2---
TABLE_CAT (12): NULL
TABLE_SCHEM (12): NULL
TABLE_NAME (12): TABB
TABLE_TYPE (12): TABLE
REMARKS (12): NULL
TYPE_CAT (12): NULL
TYPE_SCHEM (12): NULL
TYPE_NAME (12): NULL
SELF_REFERENCING_COL_NAME (12): NULL
REF_GENERATION (12): NULL
HSQLDB_TYPE (12): MEMORY
READ_ONLY (16): false
**** ES FOLGEN DIE SPALTEN FÜR TABELLE TABA ****
---  Datensatz 1---
TABLE_CAT (12): NULL
TABLE_SCHEM (12): NULL
TABLE_NAME (12): TABA
COLUMN_NAME (12): ID
DATA_TYPE (5): 4
TYPE_NAME (12): INTEGER
COLUMN_SIZE (4): NULL
BUFFER_LENGTH (4): 4
DECIMAL_DIGITS (4): NULL
NUM_PREC_RADIX (4): 10
NULLABLE (4): 0
REMARKS (12): NULL
COLUMN_DEF (12): NULL
SQL_DATA_TYPE (4): 4
SQL_DATETIME_SUB (4): NULL
CHAR_OCTET_LENGTH (4): NULL
ORDINAL_POSITION (4): 1
IS_NULLABLE (12): NO
SCOPE_CATLOG (12): NULL
SCOPE_SCHEMA (12): NULL
SCOPE_TABLE (12): NULL
SOURCE_DATA_TYPE (12): NULL
TYPE_SUB (4): 1
---  Datensatz 2---
TABLE_CAT (12): NULL
TABLE_SCHEM (12): NULL
TABLE_NAME (12): TABA
COLUMN_NAME (12): NAME
DATA_TYPE (5): 12
TYPE_NAME (12): VARCHAR
COLUMN_SIZE (4): 2147483647
BUFFER_LENGTH (4): NULL
DECIMAL_DIGITS (4): NULL
NUM_PREC_RADIX (4): NULL
NULLABLE (4): 1
REMARKS (12): NULL
COLUMN_DEF (12): NULL
SQL_DATA_TYPE (4): 12
SQL_DATETIME_SUB (4): NULL
CHAR_OCTET_LENGTH (4): NULL
ORDINAL_POSITION (4): 2
IS_NULLABLE (12): YES
SCOPE_CATLOG (12): NULL
SCOPE_SCHEMA (12): NULL
SCOPE_TABLE (12): NULL
SOURCE_DATA_TYPE (12): NULL
TYPE_SUB (4): 1
**** ES FOLGEN DIE SPALTEN FÜR TABELLE TABB ****
---  Datensatz 1---
TABLE_CAT (12): NULL
TABLE_SCHEM (12): NULL
TABLE_NAME (12): TABB
COLUMN_NAME (12): ID
DATA_TYPE (5): 4
TYPE_NAME (12): INTEGER
COLUMN_SIZE (4): NULL
BUFFER_LENGTH (4): 4
DECIMAL_DIGITS (4): NULL
NUM_PREC_RADIX (4): 10
NULLABLE (4): 0
REMARKS (12): NULL
COLUMN_DEF (12): NULL
SQL_DATA_TYPE (4): 4
SQL_DATETIME_SUB (4): NULL
CHAR_OCTET_LENGTH (4): NULL
ORDINAL_POSITION (4): 1
IS_NULLABLE (12): NO
SCOPE_CATLOG (12): NULL
SCOPE_SCHEMA (12): NULL
SCOPE_TABLE (12): NULL
SOURCE_DATA_TYPE (12): NULL
TYPE_SUB (4): 1
---  Datensatz 2---
TABLE_CAT (12): NULL
TABLE_SCHEM (12): NULL
TABLE_NAME (12): TABB
COLUMN_NAME (12): LANGE
DATA_TYPE (5): 4
TYPE_NAME (12): INTEGER
COLUMN_SIZE (4): NULL
BUFFER_LENGTH (4): 4
DECIMAL_DIGITS (4): NULL
NUM_PREC_RADIX (4): 10
NULLABLE (4): 1
REMARKS (12): NULL
COLUMN_DEF (12): NULL
SQL_DATA_TYPE (4): 4
SQL_DATETIME_SUB (4): NULL
CHAR_OCTET_LENGTH (4): NULL
ORDINAL_POSITION (4): 2
IS_NULLABLE (12): YES
SCOPE_CATLOG (12): NULL
SCOPE_SCHEMA (12): NULL
SCOPE_TABLE (12): NULL
SOURCE_DATA_TYPE (12): NULL
TYPE_SUB (4): 1
---  Datensatz 3---
TABLE_CAT (12): NULL
TABLE_SCHEM (12): NULL
TABLE_NAME (12): TABB
COLUMN_NAME (12): UHRZEIT
DATA_TYPE (5): 93
TYPE_NAME (12): TIMESTAMP
COLUMN_SIZE (4): NULL
BUFFER_LENGTH (4): 12
DECIMAL_DIGITS (4): NULL
NUM_PREC_RADIX (4): NULL
NULLABLE (4): 1
REMARKS (12): NULL
COLUMN_DEF (12): NULL
SQL_DATA_TYPE (4): 9
SQL_DATETIME_SUB (4): 3
CHAR_OCTET_LENGTH (4): NULL
ORDINAL_POSITION (4): 3
IS_NULLABLE (12): YES
SCOPE_CATLOG (12): NULL
SCOPE_SCHEMA (12): NULL
SCOPE_TABLE (12): NULL
SOURCE_DATA_TYPE (12): NULL
TYPE_SUB (4): 1
```


Du siehst, dass du schon über die Metadaten an viele Infos kommst.
Über das ResultSetMetaData kommst du auch problemlos an die Typen und Spaltennamen von gejointen Tabellenabfragen.


----------



## Taramsis (13. Mai 2009)

Hatte vergessen mich zu bedanken


----------

