尝试使用带有HSQLDB 2.2.8的SQL工具创建存储过程的未终止输入错误

时间:2012-08-23 16:01:50

标签: sql stored-procedures hsqldb

我有一个非常简单的HSQLDB CREATE PROCEDURE语句:

CREATE PROCEDURE test_procedure()
CONTAINS SQL
BEGIN
DECLARE test_variable INTEGER;
SET test_variable = 0;
END

当我尝试使用SQLTool执行此SQL时,它会因“未终止输入”错误而失败。我正在使用的命令是:

java -jar -cp $HSQLDB_HOME/lib/sqltool.jar:$HSQLDB_HOME/lib/hsqldb.jar $HSQLDB_HOME/lib/sqltool.jar db script.sql

我得到的确切错误是:

SEVERE  Error at 'script.sql' line 7:
"? CREATE PROCEDURE test_procedure()
CONTAINS SQL
BEGIN ATOMIC
DECLARE test_variable INTEGER;
SET test_variable = 0;
END"
Unterminated input:  "CREATE PROCEDURE test_procedure()
CONTAINS SQL
BEGIN ATOMIC
DECLARE test_variable INTEGER;
SET test_variable = 0;
END"
org.hsqldb.cmdline.SqlTool$SqlToolException

到目前为止,我已经弄清楚了这一点:

  1. 如果我使用HSQLDB提供的GUI工具之一运行此SQL(如DatabaseManagerSwing),它可以正常工作。
  2. 我可以使用完全相同的命令(选择,插入,删除等)执行其他SQL语句,但不能执行CREATE PROCEDURE
  3. 我的script.sql文件只包含6行,但错误提及第7行,这对我没有意义
  4. 在文件的SQL末尾添加分号没有区别
  5. 我在Windows和Linux上都尝试过这种方法,结果完全相同
  6. 我试图通过stdin将文件传递给SQL工具,并使用具有完全相同结果的内联SQL
  7. 我尝试将存储过程主体更改为其他内容,但它没有什么区别
  8. 此时我没有想法。有没有人遇到过这个错误?有什么可以做的吗?

3 个答案:

答案 0 :(得分:1)

您可以按照指南中的示例操作,并将示例文件用作模板:

http://hsqldb.org/doc/2.0/util-guide/sqltool-chapt.html#sqltool_embedded-langs-sect

答案 1 :(得分:0)

我也正为此扯头发。这些示例实际上并不能解决问题,但是有些修改使我到了那里。要处理嵌入式分号,您需要在“原始模式”下“分块”输入。要进入原始模式,请输入命令 \.(是,斜杠) 然后输入您的代码,在线上

.;

如果仅将.;放在END之后,它将不会被看到(我猜.;本身就是一个命令)。

答案 2 :(得分:0)

当我使用包含SQL转义的单引号的HSQLDB执行SQL语句时,偶然发现了此错误:

INSERT INTO my_table ('Joe\'s string value');

上述语法似乎不正确(至少对于MySQL,例如,参见here),并且不应碰到它。作为参考,正确的转义语法是:

INSERT INTO my_table ('Joe''s string value');

因此使用''而不是\'。但是,传递给我的某些SQL转储确实包含这种转义语法,因此我不得不对其进行处理。