Hibernate: как создать и выполнить sql процедуру с помощью опции jpa.hibernate.ddl-auto - PullRequest
1 голос
/ 09 января 2020

У меня есть несколько хранимых процедур, которые я хочу выполнить в качестве начальной настройки. Итак, что я сделал, поместил эту хранимую процедуру в data.sql и установил jpa.hibernate.ddl-auto=create.

Но при запуске моего springboot приложения происходит сбой приложения с com. mysql .jdb c .exceptions.jdbc4.MySQLSyntaxErrorException . Это означает, что он не может понять синтаксис этой процедуры, однако ту же процедуру можно выполнить вручную на листе sql без каких-либо проблем. Так как я могу выполнить это с помощью data.sql

данных. sql -

DELIMITER $$

CREATE PROCEDURE `GetStocks`(int_stockcode varchar(20))
BEGIN
  DECLARE stock_name VARCHAR(100);
  SELECT name FROM stock where stock_code = int_stockcode INTO stock_name;
END $$

DELIMITER ;

ошибка -

Причина: org.springframework.jdb c .datasource.init.ScriptStatementFailedException:

Не удалось выполнить SQL Оператор сценария # 29 ресурса пути к классу [default-data.sql]: РАЗДЕЛИТЕЛЬ $$ CREATE PROCEDURE GetStocks (int_stockcode varchar (20)) НАЧАЛО ВЫБРАТЬ * ОТ акции, где stock_code = int_stockcode; вложенное исключение: com. mysql .jdb c .exceptions.jdbc4.MySQLSyntaxErrorException: в синтаксисе SQL возникла ошибка; обратитесь к руководству, соответствующему вашей MySQL версии сервера, чтобы узнать правильный синтаксис для использования рядом с 'DELIMITER $$ CREATE PROCEDURE GetStocks (int_stockcode varchar (20)) BEGIN SELE C' в строке 1

в org.springframework.jdb c .datasource.init.ScriptUtils.executeSqlScript (ScriptUtils. java: 491) в org.springframework.jdb c .datasource.init.ResourceDatabasePopulator.populate: .ourceDender 10p. 238) в org.springframework.jdb c .datasource.init.DatabasePopulatorUtils.execute (DatabasePopulatorUtils. java: 48) в org.springframework.boot.autoconfigure.jdb c .DataSourceInitializer.runScripts. *: 192) по адресу org.springframework.boot.autoconfigure.jdb c .DataSourceInitializer.runDataScripts (DataSourceInitializer. java: 128) по адресу org.springframework.boot.autoconfigure.jdb c 1052 *: 118) в org.springframework.boot.autoconfigure.jdb c .DataSourceInitializer.onApplicationEven t (DataSourceInitializer. java: 51) в org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener (SimpleApplicationEventMulticaster. java: 167) в org.springframework.context.event.Elltic.Event.EulticE 139) по адресу org.springframework.context.support.AbstractApplicationContext.publishEvent (AbstractApplicationContext. java: 393) по адресу org.springframework.context.support.AbstractApplicationContext.publishEvent (AbstractApplication58.pr. (*. DataSourceInitializedPublisher 1059 *: 77) .autoconfigure.orm.jpa.DataSourceInitializedPublisher.publishEventIfRequired в org.springframework.boot.autoconfigure.orm.jpa.DataSourceInitializedPublisher.postProcessAfterInitialization (DataSourceInitializedPublisher java:. 68) в org.springframework.beans . .factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization (AbstractAutowireCapableBeanFactory java: 423) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.postProcessObjectFromFactoryBean (AbstractAutowireCapableBeanFactory java:. 1775) в org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean (FactoryBeanRegistrySupport java:. 113) .. . 75 общих кадров опущено. Причина: com. mysql .jdb c .exceptions.jdbc4.MySQLSyntaxErrorException: в синтаксисе SQL имеется ошибка; обратитесь к руководству, соответствующему вашей MySQL версии сервера, чтобы узнать правильный синтаксис для использования рядом с 'DELIMITER $$ CREATE PROCEDURE GetStocks (int_stockcode varchar (20)) BEGIN SELE C' в строке 1 на sun.reflect.GeneratedConstructorAccessor71 .newInstance (Неизвестный источник) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl. java: 45) в java .lang. refle.Constructor.newInstance (Конструктор. java: 423) в com. mysql .jdb c .Util.handleNewInstance (Util. java: 425) в com. mysql .jdb c. Util.getInstance (Util. java: 408) в com. mysql .jdb c .SQLError.createSQLException (SQLError. java: 943) в com. mysql .jdb c .MysqlIO. checkErrorPacket (MysqlIO. java: 3973) в com. mysql .jdb c .MysqlIO.checkErrorPacket (MysqlIO. java: 3909) в com. mysql .jdb c .MysqlIO.sendCommand ( MysqlIO. java: 2527) в com. mysql .jdb c .MysqlIO.sqlQueryDirect (MysqlIO. java: 2680) в com. mysql .jdb c .ConnectionImpl.exe c SQL (ConnectionImpl. java: 2486) на com. mysql .jdb c .ConnectionImpl.exe cSQL (ConnectionImpl. java: 2444) на com. mysql .jdb c .StatementImpl.executeInternal (StatementImpl. java: 845) в com. mysql .jdb c .StatementImpl.execute (StatementImpl. java: 745) в sun.reflect.GeneratedMethodAccessor27.invoke (неизвестно) Источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl. java: 43) в java .lang.reflect.Method.invoke (Метод. java: 498) в орг. apache .tomcat.jdb c .pool.StatementFacade $ StatementProxy.invoke (StatementFacade. java: 114) в com.sun.proxy. $ Proxy106.execute (Неизвестный источник) по адресу org.springframework.jdb c .datasource.init.ScriptUtils.executeSqlScript (ScriptUtils. java: 470) ... 90 общих кадров опущено

1 Ответ

2 голосов
/ 12 января 2020

Для загрузки и создания объектов базы данных лучше придерживаться жидкостной базы или пролетного пути. Используя следующий код, можно загрузить хранимую процедуру.

Использовал контроллер для загрузки хранимой процедуры, но это может быть простой класс или его можно настроить через прослушиватель событий.

@RestController
public class SqlLoaderController {

    @Autowired
    DataSource dataSource;

    @GetMapping("/load")
    public void loadScript() throws Exception
    {

        ResourceDatabasePopulator resourceDatabasePopulator=new ResourceDatabasePopulator();
        resourceDatabasePopulator.setSeparator("DELIMITER");
        InputStream is= new ClassPathResource("sql.txt").getInputStream();
        resourceDatabasePopulator.addScript(new InputStreamResource(is));
        resourceDatabasePopulator.execute(dataSource);

    }
}

DELIMITER используется для различения guish между началом и концом двух объектов хранимой процедуры или базы данных. Файл sql .txt

CREATE PROCEDURE GetStocks(int_stockcode varchar(20))
BEGIN
  DECLARE stock_name VARCHAR(100);
  SELECT 1 FROM dual;
END;

DELIMITER

CREATE PROCEDURE GetStocks1(int_stockcode varchar(20))
BEGIN
  DECLARE stock_name VARCHAR(100);
  SELECT 1 FROM dual;
END;
DELIMITER
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...