Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

insert...; select last_value from sequence=не вернул результ
Список форумов
 ->  Работа с базами данных


 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
andrey_bb : 27
Новичок

СообщениеМар 09, 2010 3:01 
Ответить с цитатой
при вызове этого метода :
Код:

   public void openShift() {
      int userid = controller.DatabaseConnector.getCurrentUserId();
      String req = new String(
            "INSERT INTO shifts (id,subjectid,started) VALUES "
                  + "(default," + userid + ",'"
                  + new Timestamp(System.currentTimeMillis()) + "');"
                  + "select last_value as id from shiftid");
      try {
         System.out.println(req);
         ResultSet rs = (controller.DatabaseConnector.getConnection()
               .createStatement().executeQuery(new String(req)));
         rs.next();
         currentShiftId = rs.getInt("id");
         rs.close();
         System.out.println("CURRENT SHIFT IS:" + currentShiftId);

      } catch (SQLException e) {
         e.printStackTrace();
         System.exit(0);
      }
   }



получаю:
Код:

INSERT INTO shifts (id,subjectid,started) VALUES (default,1,'2010-03-09 01:45:29.468');select last_value as id from shiftid
org.postgresql.util.PSQLException: Запрос не вернул результатов.
   at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:253)
   at model.OperationManager.openShift(OperationManager.java:49)
   at view.openShiftPage.openShiftButtonActionPerformed(openShiftPage.java:131)
   at view.openShiftPage.access$0(openShiftPage.java:128)
   at view.openShiftPage$1.actionPerformed(openShiftPage.java:57)
   at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
   at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
   at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
   at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
   at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
   at java.awt.Component.processMouseEvent(Unknown Source)
   at javax.swing.JComponent.processMouseEvent(Unknown Source)
   at java.awt.Component.processEvent(Unknown Source)
   at java.awt.Container.processEvent(Unknown Source)
   at java.awt.Component.dispatchEventImpl(Unknown Source)
   at java.awt.Container.dispatchEventImpl(Unknown Source)
   at java.awt.Component.dispatchEvent(Unknown Source)
   at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
   at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
   at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
   at java.awt.Container.dispatchEventImpl(Unknown Source)
   at java.awt.Window.dispatchEventImpl(Unknown Source)
   at java.awt.Component.dispatchEvent(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)




Самое радужное в этом, что если я скармливаю базе идентичный запрос запрос,который скопипастил из вывода System.out... оно всё делает правильно - добавляет запись и возвращает номер смены О_о
Код:
INSERT INTO shifts (id,subjectid,started) VALUES (default,1,'2010-03-09 01:45:29.468');select last_value as id from shiftid


p.s. shiftid default вызывает nextval('shiftid') ;
К началу Посмотреть профиль Отправить личное сообщение
masyan : 920
Supreme moderator

СообщениеМар 09, 2010 5:13 
Ответить с цитатой
я думаю проблема в том что вы выполняете команду INSERT в методе executeQuery. Просто этот запрос не выполняется.

попробуйте разделить эти два запроса.
Код:

public void openShift() {
   int userid = controller.DatabaseConnector.getCurrentUserId();
   String req = new String(
         "INSERT INTO shifts (id,subjectid,started) VALUES "
               + "(default," + userid + ",'"
               + new Timestamp(System.currentTimeMillis()));
     
   try {
      System.out.println(req);
      controller.DatabaseConnector.getConnection()      .createStatement().executeUpdate(req));
ResultSet rs = controller.DatabaseConnector.getConnection()      .createStatement().executeQuery("select last_value as id from shiftid");
      rs.next();
      currentShiftId = rs.getInt("id");
      rs.close();
      System.out.println("CURRENT SHIFT IS:" + currentShiftId);

   } catch (SQLException e) {
      e.printStackTrace();
      System.exit(0);
   }
}
К началу Посмотреть профиль Отправить личное сообщение
andrey_bb : 27
Новичок

СообщениеМар 09, 2010 14:07 
Ответить с цитатой
Запросы разделять не желательно т.к. системой. вероятно будут пользоваться десятки людей (десктопное приложение), есть шанс, что вернется номер другой смены ( пользователя, который на доли секунды раньше создал ещё одну ) =(( т.к. все пользователи будут открывать смену примерно в одно время.

ещё была мысль, что стоит просто написать хранимую процедуру =)
но я, пока, не нашёл адекватного мануала именно по хранимым процедурам ( синтаксис, туториал ).

з.ы. если использовать int executeUpdate - строка добавляется, но возвращается еденица - кто сталкивался - засоветуйте как быть ( или на мануал по хранимым процедурам укажите =)

з.з.ы. хотя пока что оставил два запроса
К началу Посмотреть профиль Отправить личное сообщение
Vasia : 236
Новичок
Откуда: Минск

СообщениеМар 09, 2010 16:15 
Ответить с цитатой
andrey_bb писал(а):
Запросы разделять не желательно т.к. системой. вероятно будут пользоваться десятки людей (десктопное приложение), есть шанс, что вернется номер другой смены ( пользователя, который на доли секунды раньше создал ещё одну ) =(( т.к. все пользователи будут открывать смену примерно в одно время.

Это вам не поможет - все равно высока вероятность нарваться на "чужую смену".
andrey_bb писал(а):
з.ы. если использовать int executeUpdate - строка добавляется, но возвращается еденица - кто сталкивался - засоветуйте как быть ( или на мануал по хранимым процедурам укажите =)
Все правильно, метод возвращает количество обновленных (или вставленных) строк.
_________________
Реальность это галлюцинация, вызванная отсутствием алкоголя (не мое)
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Vasia : 236
Новичок
Откуда: Минск

СообщениеМар 11, 2010 15:32 
Ответить с цитатой
Для того, чтобы не нарваться на чужую смену я вижу два способа:
1. Заполнять поле id не default (я так понял инкрементное поле), а с помощью sequence - сперва достаете новый уникальный id, а потом его вставляете - таким образом в методе у вас есть id вставленной записи, по которой вы ее можете найти, не рискуя нарваться на чужую смену.
2. Если интересует последняя запись КОНКРЕТНОГО пользователя - просто разделите запросы (как было сказано выше) а второй запрос сделайте таким
Код:
"select last_value as id from shiftid where subjectid ="+userid;

А еще посоветовал бы посмотреть что такое PreparedStatement.
ЗЫ я бы предпочел первый вариант.
_________________
Реальность это галлюцинация, вызванная отсутствием алкоголя (не мое)
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
 
Начать новую тему  Ответить на тему
Страница 1 из 1
Список форумов
 -> Работа с базами данных


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru