2016-04-14 3 views
1

Я хочу использовать инструкцию insert с подзапросом select из другой таблицы. В моем случае я хочу добавить строку из таблицы PRESENTATION в таблицу AVAILABILITY.Вставить инструкцию с подзапросом и дополнительным столбцом

AVAILABILITY структура таблицы:

availableID  (number, generated using sequence) 
availableDay  (varchar) 
availableStart  (varchar) 
availableEnd  (varchar) 
lecturerID(FK)  (varchar) 
presentationID(FK) (number, generated using sequence) 

PRESENTATION структура таблицы:

presentationID   (number, generated using sequence) 
presentationDay  (varchar) 
presentationStart  (varchar) 
presentationEnd  (varchar) 

Я пытался построить запрос в DAO, как это:

 String lecturerID = Abean.getLecturerID(); 
     String availableDay = Abean.getAvailableDay(); 
     String availableStart = Abean.getAvailableStart(); 
     String availableEnd = Abean.getAvailableEnd(); 
     Date availableDate = Abean.getAvailableDate(); 
     String presentationID = Abean.getPresentationID(); 

    try{ 

      currentCon = JavaConnectionDB.getConnection(); 

      PreparedStatement ps=currentCon.prepareStatement(" 
      insert into availability (availableID, 
             lecturerID, 
             availableDay, 
             availableStart, 
             availableEnd, 
             presentationid) 
      select(availabilityseq.nextval, 
        ?, 
        presentationDay, 
        presentationStart, 
        presentationEnd, 
        presentationid) 
        from presentation where presentationid=? 

      "); 
      ps.setString(1,Abean.getLecturerID()); 
      ps.setString(2,Abean.getAvailableDay()); 
      ps.setString(3,Abean.getAvailableStart()); 
      ps.setString(4,Abean.getAvailableEnd()); 
      ps.setString(5,Abean.getPresentationID()); 
      // ps.setString(6,Abean.getAvailableID()); 
      ps.executeUpdate(); 

      } 
    catch(Exception e){ 
     System.out.println("add availability 2 failed: An Exception has occurred! " + e); 
    } 

Как и ожидалось, он вернет ошибку

ОШИБКА: java.sql.SQLException: Invalid column index

Итак, как я могу вставить с подзапросом с дополнительной колонкой?

UPDATE: МОЯ DAO коды

+0

Вы указали переменную связывания дважды? –

+0

Обратите внимание, что в подзапросе предложение where: 'presentation id =?' Должно быть 'presentationid =?' –

+0

Мой плохой. Но после того, как я его сменил, произошла такая же ошибка. Может быть, я должен показать остальную часть моего DAO? – Elly

ответ

0

Вы должны соответствовать настройки значений переменных связывания со спецификацией связывания переменных в тексте SQL:

EDIT 18 апреля: удалены скобка от выбора подзапроса

PreparedStatement ps=currentCon.prepareStatement(" 
      insert into availability (availableID, 
             lecturerID, 
             availableDay, 
             availableStart, 
             availableEnd, 
             presentationid) 
      select availabilityseq.nextval, 
        ?, 
        presentationDay, 
        presentationStart, 
        presentationEnd, 
        presentationid 
        from presentation where presentationid=? 
      "); 
      ps.setString(1,Abean.getLecturerID()); // match first "?" 
      ps.setString(2,Abean.getPresentationID()); // match 2nd "?" 
+0

Я получаю' NullPointerException', но он получает правильные 'presentationID' и' lecturerID'. Я проверил с помощью SOP 'availabilityDay',' availabilityStart' и 'availabilityEnd' были нулевыми – Elly

+0

, где вы делаете это? –

+0

что делает презентацияDay/Start/End для указанного 'Abean.getPresentationID()' –