# Abfrage nach existierender SQL-Tabelle



## Einklang. (24. Jul 2012)

Hallo,

ich habe eine SQL-Tabelle mit Infos über eine Tabelle - als Namen, spaltennamen und datentyp.

Aus diesen Informationen möchte ich nun die Tabellen selbst erstellen mittels SQL! Funktioniert soweit auch ganz gut mit folgendem Code:


```
ResultSet restabellen = lokaldb.executeQuery("Select * from tabelleninfos");
		   // int id_tab = res.getInt(1);
		   
		   while (restabellen.next())
			{
			   String tabellenname = restabellen.getString(2);
			   // Abfrage ob Tabelle schon existent
			
			   Statement lokaldb1 = instanz.connection.createStatement();
				
				ResultSet tabellenspaltentyp = lokaldb1.executeQuery("Select * from tabelleninfos where tabname='"+tabellenname+"'");
				
			   while (tabellenspaltentyp.next())
				{
				   String spaltenname = tabellenspaltentyp.getString(3);
				   String datentyp = tabellenspaltentyp.getString(4);
				   sqlabfrage = sqlabfrage + " " + spaltenname + " " + datentyp + ",";
				   
				}
			// Tabelle mit Spalten und Datentyp erstellen mittels "if not exist"
			   System.out.println(tabellenname + sqlabfrage);
			}
		   
		} catch (SQLException ex) {
		   System.out.println("SQL-Exception ist aufgetreten: " + ex.getMessage());
		}
```

Das Problem ist hier nur, dass in der Tabelle mit den Infos jeder Datensatz für einen Spaltennamen besteht - also Datensatz 1 ist tabellenname1 - spaltennamen1 - datentyp1
Datensatz 2 ist tabellenname1 - spaltenname2 - datentyp2
usw

Der erste Datensatz funktioniert super - Tabellenname wird erkannt, alle Spaltennamen und Datentyp werden ausgelesen und zu einem String zusammengefügt........!
Beim zweiten Datensatz allerdings fängt das Problem an, da im zweiten Datensatz die gleiche Tabelle als Tabellenname drin steht - also sucht er von der gleichen Tabelle wie im ersten Datensatz nach den Spalten und Datentyp..............!

Was fehlt ist eine Überprüfung des Tabellennamens, ob diese SQL-Tabelle schon erstellt wurde....... und dann dementsprechend zum nächsten Datensatz geht bis eben ein neuer Tabellenname gefunden wird.......!

Nur wie mach ich diese Abfrage, ob eine SQL-Tabelle besteht? 


danke


----------



## Marcinek (24. Jul 2012)

Google SQL table exists.


----------



## aw3e1245 (24. Jul 2012)

Sinnvoller wäre, das richtig zu programmnieren:

- durch eine gruppierte Abfrage feststellen, wie viele Tabellen es überhaupt gibt
- dann die DB-Abfrage derart durchführen, dass alle Datensaätze zu der jeweiligen Tabelle geholt werden
- dann die Tabelle mit ihren Spalten erzeugen


----------



## Evil-Devil (24. Jul 2012)

Falls du MySQL verwendest kannst du in den Systemtabellen von MySQL nachschauen ob jene Tabelle existiert. Denn MySQL legt diese Informationen und den Aufbau selbst in Tabellen ab.


----------



## nillehammer (24. Jul 2012)

Bin nicht sicher, ob ich Deinen Anwendungsfall 100% verstanden habe. Glaube aber, dass es garnicht nötig ist, eine Tabelle mit Tabelleninfos vorzuhalten. Bei JDBC gibt es das Interface 
	
	
	
	





```
DatabaseMetaData
```
. Darüber kann man sehr viel abfragen, z.B. auch welche Tabellen in einem Schema/einer Datenbank vorhanden sind. Holen tust Du Dir es so:

```
DatabaseMetaData metadata = connection.getMetaData();
```
Und hier der Link zur API-Doku: Java Platform SE 7 - DatabaseMetaData


----------



## Einklang. (24. Jul 2012)

aw3e1245 hat gesagt.:


> Sinnvoller wäre, das richtig zu programmnieren:
> 
> - durch eine gruppierte Abfrage feststellen, wie viele Tabellen es überhaupt gibt
> - dann die DB-Abfrage derart durchführen, dass alle Datensaätze zu der jeweiligen Tabelle geholt werden
> - dann die Tabelle mit ihren Spalten erzeugen



Das mach ich ja, aber bei der Abfrage nach den TAbellen kommt eine Tabelle ja öfters vor dh die Tabelle wird immer wieder abgearbeitet mit diesen drei Schritten! Genau das ist nämlich das Problem...!  
(ok in dem Code von oben wird die Tabelle noch gar nicht erzeugt, aber das hat mit dem Problem nichts zu tun...)



> Falls du MySQL verwendest kannst du in den Systemtabellen von MySQL nachschauen ob jene Tabelle existiert. Denn MySQL legt diese Informationen und den Aufbau selbst in Tabellen ab.



Wie nillehammer geschrieben hat mit getMetaData()?



> Bin nicht sicher, ob ich Deinen Anwendungsfall 100% verstanden habe. Glaube aber, dass es garnicht nötig ist, eine Tabelle mit Tabelleninfos vorzuhalten.



Doch weil es nicht Informationen zu einer lokalen Datenbank sind sondern das ist eine TAbelle in der ich eine SQL Tabelle auf einem Server ausgelesen habe - damit ich später weiß wo welche Daten sind! JEtzt habe ich mich dazu entschlossen, die Datenbankstruktur zu behalten und einfach lokal die gleiche Tabellenstruktur zu erstellen.... daher auch einfach die Tabellen erstellen mit den Infos zu den Tabellen auf dem Server....! 

Mit der Metaabfrage könnte ich aber immer wieder Abfragen ob es die Tabelle nun gibt - da müsst ich schauen was in den Metadaten steht......... das wär also auf jeden Fall eine Lösung!
Was mir heute vormittag einfiel: Ich könnte auch ganz einfach eine Variable erstellen und dort nach der ERstellung der Tabellen den Namen eintragen und später bzw bei einem neuen SChleifendurchgang genau diese Variable dann nach dem TAbellennamen durchsuchen..... also einfach gedacht! :-D


----------



## gasssssst (24. Jul 2012)

Hehe, bei deinen posts facepalme ich immer so hart D:

recommended reading: The Inner-Platform Effect - The Daily WTF
(sowie der entsprechende wikipedia artikel)


----------



## aw3e1245 (25. Jul 2012)

Wo machst du das? Mit Select * from tabelleninfos" holst du dir alle Datensätze und nicht erstmal die Gruppe der überhaupt zu erstellenden Tabellen. Und selbstveständlich holst du dir auch nicht in einer zweiten Abfrage nur die Datensätze die zu einer zu erzeugenden Tabelle gehören



> Was mir heute vormittag einfiel: Ich könnte auch ganz einfach eine Variable erstellen und dort nach der ERstellung der Tabellen den Namen eintragen und später bzw bei einem neuen SChleifendurchgang genau diese Variable dann nach dem TAbellennamen durchsuchen..... also einfach gedacht!



Murks


----------

