HSQL - 意外的令牌:语句中的 PROCEDURE
Posted
技术标签:
【中文标题】HSQL - 意外的令牌:语句中的 PROCEDURE【英文标题】:HSQL - Unexpected token: PROCEDURE in statement 【发布时间】:2014-07-03 14:49:40 【问题描述】:我正在尝试转换存储过程以在 HSQL DB 中使用以进行集成测试。这里的 SQL 已经足够基本了——我们只是返回一组虚拟数据
CREATE PROCEDURE policy_Attribution(p_valDate Date)
MODIFIES SQL DATA
BEGIN ATOMIC
CREATE TABLE #retvals (
Policy_ID INT,
Attribution_Name CHAR(64),
Attribution_Type CHAR(20),
Risk CHAR(20),
Revenue FLOAT,
Claims FLOAT
)
INSERT INTO #retvals VALUES (1, 'name', 'type', 'risk', 1.5, 1.6)
INSERT INTO #retvals VALUES (2, 'name2', 'type2', 'risk2', 0.5, 0.6)
INSERT INTO #retvals VALUES (3, 'name3', 'type3', 'risk3', 2.5, 2.6)
SELECT * FROM #retvals
END
当我运行我的测试时,它失败了,因为数据库是用这个错误初始化的
Caused by: org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement at line 19 of resource class path resource [hsql/attribution-hsqldb.sql]: CREATE PROCEDURE policy_Attribution(p_valDate Date) MODIFIES SQL DATA BEGIN ATOMIC CREATE TABLE #retvals ( Policy_ID INT, Attribution_Name CHAR(64), Attribution_Type CHAR(20), Risk CHAR(20), Revenue FLOAT, Claims FLOAT ) INSERT INTO #retvals VALUES (1, 'name', 'type', 'risk', 1.5, 1.6) INSERT INTO #retvals VALUES (2, 'name2', 'type2', 'risk2', 0.5, 0.6) INSERT INTO #retvals VALUES (3, 'name3', 'type3', 'risk3', 2.5, 2.6) SELECT * FROM #retvals END
at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.executeSqlScript(ResourceDatabasePopulator.java:199)
at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.populate(ResourceDatabasePopulator.java:132)
at org.springframework.jdbc.datasource.init.CompositeDatabasePopulator.populate(CompositeDatabasePopulator.java:55)
at org.springframework.jdbc.datasource.init.DatabasePopulatorUtils.execute(DatabasePopulatorUtils.java:47)
... 41 more
Caused by: java.sql.SQLException: Unexpected token: PROCEDURE in statement [ CREATE PROCEDURE]
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.execute(Unknown Source)
at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.executeSqlScript(ResourceDatabasePopulator.java:184)
... 44 more
hsqldb 抱怨的意外令牌是什么?
【问题讨论】:
【参考方案1】:应使用 DECLARE 关键字创建表。还需要进行其他更改:
CREATE PROCEDURE policy_Attribution(p_valDate Date)
MODIFIES SQL DATA
BEGIN ATOMIC
DECLARE TABLE retvals (
Policy_ID INT,
Attribution_Name CHAR(64),
Attribution_Type CHAR(20),
Risk CHAR(20),
Revenue FLOAT,
Claims FLOAT
);
BEGIN
INSERT INTO retvals VALUES (1, 'name', 'type', 'risk', 1.5, 1.6);
INSERT INTO retvals VALUES (2, 'name2', 'type2', 'risk2', 0.5, 0.6);
INSERT INTO retvals VALUES (3, 'name3', 'type3', 'risk3', 2.5, 2.6);
DECLARE result CURSOR FOR SELECT * FROM retvals;
OPEN result;
END;
END
查看指南:
http://hsqldb.org/doc/2.0/guide/sqlroutines-chapt.html#src_psm_table_vars
【讨论】:
【参考方案2】:也许缺少分号是问题所在。尝试将它们添加到每个 SQL 语句的末尾。
【讨论】:
以上是关于HSQL - 意外的令牌:语句中的 PROCEDURE的主要内容,如果未能解决你的问题,请参考以下文章
调用 TF.exe 的 powershell 脚本中的表达式或语句中出现意外的令牌“工作区”
带有数字通配符的 UCanAccess Select 语句给出了意外的令牌:需要 REGEXP_MATCHES