2015-06-10 2 views
0

Я хочу динамически добавлять хранимые процедуры из своего Java-кода, используя спящий режим. я сделал следующее, но это постоянно приводит к ошибке говоря "Можно ли динамически добавлять хранимую процедуру из спящего режима?

У Вас есть ошибка в вашем синтаксисе SQL, проверьте руководство, которое соответствует Вашей версии сервера MySQL для корректного синтаксиса использовать

то, что я делаю неправильно

String dnyLockProcedure = "DELIMITER ||" 
         +"\n DROP PROCEDURE IF EXISTS `dyn_lock`; " 
         +"\n CREATE PROCEDURE `dyn_lock`(IN `query` TEXT, IN `lock_name` CHAR(64), IN `timeout` TINYINT UNSIGNED)" 
         -- PROCEDURE HERE 
         +"\n END;" 
         +"\n || " 
         +"\n DELIMITER ;"; 

       Query queryTest = mEntityManager.createNativeQuery(dnyLockProcedure); 
       queryTest.executeUpdate(); 

EDIT: Ниже вся процедура:

 String dnyLockProcedure ="DROP PROCEDURE IF EXISTS `dyn_lock`; " 
       +" CREATE PROCEDURE `dyn_lock`(IN `query` TEXT, IN `lock_name` CHAR(64), IN `timeout` TINYINT UNSIGNED)" 
       +" NO SQL " 
       +" LANGUAGE SQL " 
       +" COMMENT 'Get a lock for dyn cursor' " 
       +" BEGIN " 
       +" DECLARE lock_res TINYINT UNSIGNED;" 
       +" DECLARE CONTINUE HANDLER" 
       +" FOR SQLEXCEPTION" 
       +" SIGNAL SQLSTATE VALUE '45000' SET" 
       +" MESSAGE_TEXT = '[dyn_lock] Dynamic SQL returned an error';" 
       +" SET lock_res = GET_LOCK(`lock_name`, IFNULL(`timeout`, 5));" 
       +" IF (lock_res IS NULL) THEN" 
       +" SIGNAL SQLSTATE VALUE '45000' SET" 
       +" MESSAGE_TEXT = '[dyn_lock] Could not acquire lock: Unknown error';" 
       +" ELSEIF (lock_res = 0) THEN" 
       +" SIGNAL SQLSTATE VALUE '45000' SET" 
       +" MESSAGE_TEXT = '[dyn_lock] Could not acquire lock: Timeout expired';" 
       +" END IF;" 
       +" SET @dyn_sql = CONCAT('CREATE OR REPLACE VIEW `', lock_name, '` AS ', query, ';');" 
       +" PREPARE stmt_dyn_view FROM @dyn_sql;" 
       +" EXECUTE stmt_dyn_view;" 
       +" DEALLOCATE PREPARE stmt_dyn_view;" 
       +" END;"; 
+0

Вам действительно нужны \ n и || в dnyLockProcedure? –

+0

будет проблемой, я могу попробовать удалить \ n, но isi't разделитель необходимо? – rd22

+0

Пожалуйста, передайте весь код процедуры, чтобы кто-то мог вам помочь. Может быть, есть синтаксическая ошибка в теле процедуры. – BabyDuck

ответ

1

Так я узнал, что было неправильно в приведенном выше хранимой процедуре:

  1. Использование DELIMITER не требуется, начните с CREATE PROCEDURE
  2. Использование «\ п» также не требуется, но он не будет вызывать ошибку при использовании.
  3. Вы не можете использовать DROP и CREATE в том же запросе; они должны быть вызваны из отдельного запроса.

Cheers!

0

Попробуйте использовать этот код. Надеюсь, ваша проблема будет решена.

public final List<CoverageEntity> getCMDataTable(final String countryCode, final CoverageBean coverageBean) { 

      getHibernateTemplate().execute(new HibernateCallback() { 
       public (List) doInHibernate(final Session session)throws HibernateException, SQLException { 
//     Query query = getQuery(countryCode, coverageBean , session); 
        Query query = session.createSQLQuery("call ASPECT.SC_CVRG_SEARCH('99991',null,null,null,null,null,null)").addEntity(CoverageEntity.class); 
        System.out.println(ToStringBuilder.reflectionToString(query.list(),ToStringStyle.MULTI_LINE_STYLE)); 

        return query.query.list(); 

     } 
      }) 
      ; 
      return new ArrayList<CoverageEntity>(); 
} 
Смежные вопросы