# Java und Postgresql



## erdmulch (25. Sep 2011)

Hallo zusammen,

hab mir mit Java einen zugriff auf meine postgresql datenbank gemacht
leider kann ich nur select * from person abfragen
würde aber gerne select vorname, nachname, Geburtsdatum from person machen.

leider kommt folgender kompilerfehler:

org.postgresql.util.PSQLException: Der Spaltenindex 2 ist außerhalb des gültigen Bereichs. Anzahl Spalten: 1.
    at org.postgresql.jdbc2.AbstractJdbc2ResultSetMetaData.getField(AbstractJdbc2ResultSetMetaData.java:422)
    at org.postgresql.jdbc2.AbstractJdbc2ResultSetMetaData.getColumnLabel(AbstractJdbc2ResultSetMetaData.java:162)
    at Database.showTimezones(Database.java:126)
    at Database.<init>(Database.java:30)
    at Database$1.run(Database.java:161)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)



kann mir jemand sagen an was das liegt?


```
try
    {
      Statement statement = connection.createStatement ();

      ResultSet resultSet = statement.executeQuery ("select * from person");
 
      ResultSetMetaData resultSetMetaData = resultSet.getMetaData ();
 
      String format = "%10s   %-20s   %-20s   %-10s  %s\n";
      //"-" mit dem Minus, werden die Datensätze linksbündig angeordnet
      
      System.out.printf (format + "\n",
                         resultSetMetaData.getColumnLabel (1),
                         resultSetMetaData.getColumnLabel (2),
                         resultSetMetaData.getColumnLabel (3),
                         resultSetMetaData.getColumnLabel (4),
                         resultSetMetaData.getColumnLabel (5));
 
      while (resultSet.next ())
      {
        System.out.printf (format,
                           resultSet.getString (1),
                           resultSet.getString (2),
                           resultSet.getString (3),
                           resultSet.getString (4),
                           resultSet.getString (5));
      }
 
      resultSet.close ();
      statement.close ();
    }
    catch (SQLException e)
    {
      e.printStackTrace ();
      System.exit (1);
    }
```


----------



## Marcinek (25. Sep 2011)

Schon mal nach dem Fehler gegoogelt?

Das wäre erheblich schneller, als hier zu posten -.-

P.S. Die meisten Programiersprachen fangen bei 0 an zu zählen und nicht bei 1


----------



## tfa (25. Sep 2011)

@Marcinek
SQL ist eine der wenigen Sprachen, die bei 1 anfangen zu zählen.

@TS
Kommt der Fehler bei dem Programm, das du gepostet hast oder einer anderen SQL-Query?


----------



## musiKk (25. Sep 2011)

JDBC fängt bei 1 an, nicht SQL.

Wie sieht denn die Tabellendefinition aus? ([c]\d person[/c])

Weiterhin ist nicht ganz klar, wo der Fehler auftritt. Passiert das beim Auslesen der Spaltennamen aus den Metadaten oder der Inhalte? Falls es bei ersterem passiert: Kommt der gleiche Fehler, wenn Du das weg lässt?

Ich würde jedenfalls auch dringend empfehlen, die zu selektierenden Spalten aufzuzählen, statt den * zu benutzen. Wenn Du dort fünf Spalten benennst, darf obiger Fehler eigentlich nicht auftreten. Da sollte allenfalls ein Syntaxfehler beim Ausführen des Queries kommen können.


----------



## homer65 (26. Sep 2011)

Zunächst mal hast du nur den funktionierenden Code gepostet. Wie soll man da den Fehler finden?
Poste doch mal den nicht funktionierenden Code.


----------



## erdmulch (26. Sep 2011)

Das funktioniert:


```
"","Alexandra",,,,"","","",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"123456",,,"22",,,,,,,,,,,,"blonde@aim.com","SMTP","Alexandra (blonde@aim.com)",,,,,,,,"1.1.1900","Keine Angabe",,"A.",,"0.0.00",,,"",,,,,"",,,,"Normal","Aus",,,"","","Normal"
```


```
drop table if exists person;

create table person (



Anrede varchar (30),
Vorname varchar (30),
Weitere Vornamen varchar (30),
Nachname varchar (30),
Suffix varchar (30),
Firma varchar (30),
Abteilung varchar (30),
Position varchar (30),
Straße geschäftlich varchar (30),
Straße geschäftlich 2 varchar (30),
Straße geschäftlich 3 varchar (30),
Ort geschäftlich varchar (30),
Region geschäftlich varchar (30),
Postleitzahl geschäftlich varchar (30),
Land geschäftlich varchar (30),
Straße privat varchar (30),
Straße privat 2 varchar (30),
Straße privat 3 varchar (30),
Ort privat varchar (30),
Region privat varchar (30),
Postleitzahl privat varchar (30),
Land privat varchar (30),
Weitere Straße varchar (30),
Weitere Straße 2 varchar (30),
Weitere Straße 3 varchar (30),
Weiterer Ort varchar (30),
Weitere Region varchar (30),
Weitere Postleitzahl varchar (30),
Weiteres Land varchar (30),
Telefon Assistent varchar (30),
Fax geschäftlich varchar (30),
Telefon geschäftlich varchar (30),
Telefon geschäftlich 2 varchar (30),
Rückmeldung varchar (30),
Autotelefon varchar (30),
Telefon Firma varchar (30),
Fax privat varchar (30),
Telefon privat varchar (30),
Telefon privat 2 varchar (30),
ISDN varchar (30),
Mobiltelefon varchar (30),
Weiteres Fax varchar (30),
Weiteres Telefon varchar (30),
Pager varchar (30),
Haupttelefon varchar (30),
Mobiltelefon 2 varchar (30),
Telefon für Hörbehinderte varchar (30),
Telex varchar (30),
Abrechnungsinformation varchar (30),
Benutzer 1 varchar (30),
Benutzer 2 varchar (30),
Benutzer 3 varchar (30),
Benutzer 4 varchar (30),
Beruf varchar (30),
Büro varchar (30),
E-Mail-Adresse varchar (30),
E-Mail-Typ varchar (30),
E-Mail: Angezeigter Name varchar (30),
E-Mail 2: Adresse varchar (30),
E-Mail 2: Typ varchar (30),
E-Mail 2: Angezeigter Name varchar (30),
E-Mail 3: Adresse varchar (30),
E-Mail 3: Typ varchar (30),
E-Mail 3: Angezeigter Name varchar (30),
Empfohlen von varchar (30),
Geburtstag varchar (30),
Geschlecht varchar (30),
Hobby varchar (30),
Initialen varchar (30),
Internet-Frei/Gebucht varchar (30),
Jahrestag varchar (30),
Kategorien varchar (30),
Kinder varchar (30),
Konto varchar (30),
Name Assistent varchar (30),
Name des/der Vorgesetzten varchar (30),
Notizen varchar (30),
Organisations-Nr. varchar (30),
Ort varchar (30),
Partner varchar (30),
Postfach geschäftlich varchar (30),
Postfach privat varchar (30),
Priorität varchar (30),
Privat varchar (30),
Regierungs-Nr. varchar (30),
Reisekilometer varchar (30),
Sprache varchar (30),
Stichwörter varchar (30),
Vertraulichkeit varchar (30),
--Verzeichnisserver varchar (30),
--Webseite varchar (30),
--Weiteres Postfach varchar (30)

);
```


Das funktioniert nicht:



```
"","Alexandra",,,,"","","",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"123456",,,"22",,,,,,,,,,,,"blonde@aim.com","SMTP","Alexandra (blonde@aim.com)",,,,,,,,"1.1.1900","Keine Angabe",,"A.",,"0.0.00",,,"",,,,,"",,,,"Normal","Aus",,,"","","Normal","","",""
```


```
drop table if exists person;

create table person (



Anrede varchar (30),
Vorname varchar (30),
Weitere Vornamen varchar (30),
Nachname varchar (30),
Suffix varchar (30),
Firma varchar (30),
Abteilung varchar (30),
Position varchar (30),
Straße geschäftlich varchar (30),
Straße geschäftlich 2 varchar (30),
Straße geschäftlich 3 varchar (30),
Ort geschäftlich varchar (30),
Region geschäftlich varchar (30),
Postleitzahl geschäftlich varchar (30),
Land geschäftlich varchar (30),
Straße privat varchar (30),
Straße privat 2 varchar (30),
Straße privat 3 varchar (30),
Ort privat varchar (30),
Region privat varchar (30),
Postleitzahl privat varchar (30),
Land privat varchar (30),
Weitere Straße varchar (30),
Weitere Straße 2 varchar (30),
Weitere Straße 3 varchar (30),
Weiterer Ort varchar (30),
Weitere Region varchar (30),
Weitere Postleitzahl varchar (30),
Weiteres Land varchar (30),
Telefon Assistent varchar (30),
Fax geschäftlich varchar (30),
Telefon geschäftlich varchar (30),
Telefon geschäftlich 2 varchar (30),
Rückmeldung varchar (30),
Autotelefon varchar (30),
Telefon Firma varchar (30),
Fax privat varchar (30),
Telefon privat varchar (30),
Telefon privat 2 varchar (30),
ISDN varchar (30),
Mobiltelefon varchar (30),
Weiteres Fax varchar (30),
Weiteres Telefon varchar (30),
Pager varchar (30),
Haupttelefon varchar (30),
Mobiltelefon 2 varchar (30),
Telefon für Hörbehinderte varchar (30),
Telex varchar (30),
Abrechnungsinformation varchar (30),
Benutzer 1 varchar (30),
Benutzer 2 varchar (30),
Benutzer 3 varchar (30),
Benutzer 4 varchar (30),
Beruf varchar (30),
Büro varchar (30),
E-Mail-Adresse varchar (30),
E-Mail-Typ varchar (30),
E-Mail: Angezeigter Name varchar (30),
E-Mail 2: Adresse varchar (30),
E-Mail 2: Typ varchar (30),
E-Mail 2: Angezeigter Name varchar (30),
E-Mail 3: Adresse varchar (30),
E-Mail 3: Typ varchar (30),
E-Mail 3: Angezeigter Name varchar (30),
Empfohlen von varchar (30),
Geburtstag varchar (30),
Geschlecht varchar (30),
Hobby varchar (30),
Initialen varchar (30),
Internet-Frei/Gebucht varchar (30),
Jahrestag varchar (30),
Kategorien varchar (30),
Kinder varchar (30),
Konto varchar (30),
Name Assistent varchar (30),
Name des/der Vorgesetzten varchar (30),
Notizen varchar (30),
Organisations-Nr. varchar (30),
Ort varchar (30),
Partner varchar (30),
Postfach geschäftlich varchar (30),
Postfach privat varchar (30),
Priorität varchar (30),
Privat varchar (30),
Regierungs-Nr. varchar (30),
Reisekilometer varchar (30),
Sprache varchar (30),
Stichwörter varchar (30),
Vertraulichkeit varchar (30),
Verzeichnisserver varchar (30),
Webseite varchar (30),
Weiteres Postfach varchar (30)

);
```

man beachte an dem Daten Satz die zusätzlichen "" am Ende


----------



## Deros (27. Sep 2011)

dein sql-code der funktionieren soll hört in der Klammer in zeile 95 mit einem ',' auf dürfte also so schonmal nicht klappen....dein javacode macht ein select der sqlcode mit sicherheit nicht...irgendwas passt da vorne und hinten nicht


----------



## musiKk (27. Sep 2011)

Ja. Oder Leerzeichen in Bezeichnern. Was auch immer das ist; SQL ist es jedenfalls nicht.


----------



## nillehammer (27. Sep 2011)

Und, wenn Du das Datenmodell beeinflussen kannst, dann *muss es ganz dringend normalisiert werden*. Adresse ist z.B. eine eigene Entität. Die Beziehung ist eine Person hat 0 bis n Addressen. Dann kannst Du Dir das Konstrukt mit Straße geschäftlich, Straße privat, Weitere Straße sparen. Gleiches gilt für viele andere Spalten Deiner Tabelle.


----------

