PSQLException przy dynamicznym query

0
      String carName = "renault";
      PreparedStatement preparedStatement = connection.prepareStatement("CREATE TABLE ?(\n"
          + "    id        integer not null UNIQUE,\n"
          + "    title       varchar(40) NOT NULL,\n"
          + "    did         integer NOT NULL,\n"
          + "    date_prod   date,\n"
          + "    kind        varchar(10),\n"
          + "    len         interval hour to minute\n"
          + ");");

      preparedStatement.setString(1, carName);
      preparedStatement.executeUpdate();

Dostaję taki błąd...
org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"

W jaki sposób powinienem poprawnie to sformułować?

2

Nie da się tak zrobić za pomocą prepared statement. Zresztą to byłoby bardzo dziwna rzecz i na 99% jestem pewien że robisz coś bardzo bardzo złego. Czemu próbujesz zrobić nową tabelę dla samochodu, zamiast mieć jedną tabelę cars i dodać do niej wpisy?

0

Chcę potworzyć wiele tabel na podstawie nazw które już dostałem w liście tutaj przykład konkretny

List<String> collectionsNames = collectionDataExtractor.listCollections();
    for (String collName : collectionsNames) {
      PreparedStatement preparedStatement = connection.prepareStatement("CREATE TABLE ?(\n"
          + "    id        integer not null UNIQUE,\n"
          + "    title       varchar(40) NOT NULL,\n"
          + "    did         integer NOT NULL,\n"
          + "    date_prod   date,\n"
          + "    kind        varchar(10),\n"
          + "    len         interval hour to minute\n"
          + ");");
      preparedStatement.setString(1, collName);
      preparedStatement.executeUpdate();
    }
1

Tym bardziej: czemu?! Tworzenie tabel w ten sposób to BARDZO zly pomysł, chyba że piszesz właśnie klienta do bazy danych. Jesli piszesz normalną aplikacje to NA PEWNO robisz coś źle. Uderzamy w klasyczny http://xyproblem.info/ Napisz co chcesz osiągnąć, ale nie że chcesz tworzyć milion tabel, tylko jaki problem biznesowy chcesz rozwiązać w ten sposób. Jestem pewien że twój problem należy rozwiązać w zupełnie inny sposób.

Już sam fakt że te twoje tabele maja tą samą strukturę sugeruje że potrzebujesz tylko jedną tabele.

1

Tak jak pisze @Shalom, jeśli aplikacja tworzy nowe tabele podczas działania aplikacji to znaczy że została źle zaprojektowana.

Ale odpowiadając na pytanie, nie można używać prepareStatement do zmiany nazwy tabeli w zapytaniu. Musisz stworzyć zwykłe statement a wcześniej ręcznie posklejać Stringa.
BTW nie musisz w w zapytaniu dawać znaków nowej lini, bez tego też zadziała

0

@Shalom:
@KamilAdam
Ponieważ w mam tyle nazw kolekcji w mongodb około 20 (są to modele aut), a nastepnie chciałbym dla każdego modelu stworzyć taką tabelę w bazie danych postgres. Następnym krokiem byłoby wypełnienie tych tabel w posgresie danymi z mongodb.

2

To nadal nie tłumaczy czemu chcesz mieć osobną tabelę dla każdego modelu samochodu, zamiast mieć jedną tabelę cars. Czy faktycznie każdy z tych modeli ma inny schemat bazy? Bo jak nie, jak wszystkie są takie same, to robisz jedną tabelę i najwyżej dodajesz do niech pole model

0

Ponieważ w mongo mam tak, że nazwa kolekcji to nazwa modelu auta. A potem mam tylko te atrybuty wewnątrz i ich wartości. I jest tak, że jeżeli chcę zobaczyć jakie auta mam w bazie mongo np bmw to wybieram taką nazwę kolekcji.

Myślałem to samo zrobić w postgresie, tylko na podstawie tabel. Jeżeli źle postępuję to proszę mi doradź.

1

Tak, źle postępujesz. Zrób tak jak napisałem:

  • jedna tabela cars
  • w niej pole model, możesz na nie sobie dać secondary index jak będziesz po nim szukać często
  • wszystkie samochody wrzucasz do tej jednej tabeli
3

W sumie w mongo jeszcze wydaje się dość "naturalne" tworzyć kolekcje w ten sposób, bo jest to proste, nie ma dużego overheadu pamięci (choć jeśli chciałbyś mieć osobną kolekcję nie tylko dla marki ale też dla każdego MODELU auta, to wtedy już ten overhead byłby istotny:D) i nikt nie pisze że tak nie można.

Jeśli chodzi o relacyjne bazy danych to już tak jak Shalom pisze, robisz jedną tabelę ze wszystkim. Tworzysz indeks na polu w którym będzie nazwa marki, a potem możesz sobie porobić widoki "renault", "fiat" itp... które będą brały z tabeli głównej wg wartości tego pola.

0

Dzięki wielkie Panowie za wypowiedzi i pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1