sql-maven-plugin 为 H2 存储过程定义抛出 SQL 语法错误
Posted
技术标签:
【中文标题】sql-maven-plugin 为 H2 存储过程定义抛出 SQL 语法错误【英文标题】:sql-maven-plugin throws SQL syntax error for H2 stored procedure definition 【发布时间】:2013-08-07 10:04:08 【问题描述】:我尝试使用 sql-maven-plugin 1.5 版在 h2 数据库 (v. 1.3.170) 中安装存储过程。
有问题的 SQL 语句如下所示:
CREATE ALIAS GET_DATA AS $$
ResultSet getData(Connection conn, String id)
return null;
$$;
本文改编自 H2 网站的 User-Defined Functions and Stored Procedures。
我得到的 Maven 错误是这样的:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building dummy 0.5.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ X4PAAsql ---
[INFO] Deleting D:\Data\Git\x4paa\SQL\target
[INFO]
[INFO] --- sql-maven-plugin:1.5:execute (createTables) @ X4PAAsql ---
[INFO] Executing file: C:\Users\THOMAS~1\AppData\Local\Temp\prepareDB.331774647sql
[INFO] Executing file: C:\Users\THOMAS~1\AppData\Local\Temp\storedProc.2069356353sql
[ERROR] Failed to execute: CREATE ALIAS GET_DATA AS $$
@CODE
static ResultSet getData(Connection conn, String id)
return null
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.717s
[INFO] Finished at: Wed Aug 07 11:16:40 CEST 2013
[INFO] Final Memory: 4M/122M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:sql-maven-plugin:1.5:execute (createTables) on project X4PAAsql: Syntax
Fehler in SQL Befehl " CREATE ALIAS GET_DATA AS [*]$$
[ERROR] @CODE
[ERROR] static ResultSet getData(Connection conn, String id)
[ERROR] return null"
[ERROR] Syntax error in SQL statement " CREATE ALIAS GET_DATA AS [*]$$
[ERROR] @CODE
[ERROR] static ResultSet getData(Connection conn, String id)
[ERROR] return null" [42000-170]
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
我使用以下pom内容来配置sql-maven-plugin。
<properties>
<h2db.version>1.3.170</h2db.version>
<sql-maven-plugin.version>1.5</sql-maven-plugin.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<version>$sql-maven-plugin.version</version>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>$h2db.version</version>
</dependency>
</dependencies>
<configuration>
<driver>org.h2.Driver</driver>
<url>jdbc:h2:SQL/target/H2DB/x4</url>
<username>sa</username>
<password>sa</password>
</configuration>
<executions>
<execution>
<id>createTables</id>
<phase>compile</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<forceMojoExecution>true</forceMojoExecution>
<srcFiles>
<srcFile>scripts/h2/prepareDB.sql</srcFile>
<srcFile>scripts/h2/storedProc.sql</srcFile>
</srcFiles>
</configuration>
</execution>
</executions>
</plugin>
有没有办法解决“$$”的语法问题?
更新:我尝试在 SQuirrel 中运行查询并得到相同的错误。所以问题可能与 sql-maven-plugin 无关,而是与插件或 SQuirrel 使用 jdbc 驱动程序的方式有关?
【问题讨论】:
【参考方案1】:sql-maven-plugin 在“;”处拆分 SQL 语句。原来的说法是
CREATE ALIAS GET_DATA AS $$
ResultSet getData(Connection conn, String id)
return null;
$$;
但是,数据库的异常信息只显示第一部分,直到“;”:
CREATE ALIAS GET_DATA AS [*]$$
@CODE
static ResultSet getData(Connection conn, String id)
return null
($$
前面的标记[*]
是解析失败的位置,因为解析器看不到结束标记$$
。)
“好的”解决方案是更改 sql-maven-plugin 以支持引用数据,但我想这并不容易。作为一种解决方法,您可以尝试将语句更改为:
CREATE ALIAS GET_DATA AS $$
ResultSet getData(Connection conn, String id)
return null; $$;
【讨论】:
托马斯,非常感谢。做到了。我按照建议更改了语句,maven 构建成功。 :-)以上是关于sql-maven-plugin 为 H2 存储过程定义抛出 SQL 语法错误的主要内容,如果未能解决你的问题,请参考以下文章
sql-maven-plugin 中的 PL/SQL 脚本抛出无效的 SQL 语句
通过使用 MySQL 的 DataJpaTest 存储库测试,Hibernate 不会在 H2 DB 中将用户设置为自动增量