1

我有一个非常简单的 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 工具之一(如 DatabaseManagerSwing)运行此 SQL,它可以正常工作。
  2. 我可以使用完全相同的命令(选择、插入、删除等)执行其他 SQL 语句,但不能执行 CREATE PROCEDURE
  3. 我的 script.sql 文件只包含 6 行,但错误提到了第 7 行,这对我来说毫无意义
  4. 在文件中的 SQL 末尾添加分号没有区别
  5. 我在 Windows 和 Linux 上都试过了,结果完全相同
  6. 我试图通过标准输入将文件传递给 SQL 工具,并使用具有完全相同结果的内联 SQL
  7. 我尝试将存储过程主体更改为其他内容,但没有任何区别

在这一点上,我没有想法。有没有人遇到过这个错误?有什么可以做的吗?

4

3 回答 3

2

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

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

于 2012-08-23T17:48:03.597 回答
0

在使用包含 SQL 转义单引号的 HSQLDB 执行 SQL 语句时,我偶然发现了这个错误,如下所示:

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

上面的语法似乎不正确(至少对于 MySQL,例如,请参见此处)并且不应该遇到它。作为参考,正确的转义语法是:

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

所以用''而不是\'. 然而,传递给我的一些 SQL 转储确实包含这种转义语法,我不得不处理它。

于 2020-11-17T15:18:07.687 回答
0

我也在把头发拉出来。这些示例实际上并没有解决问题,但稍加修修补补让我到了那里。要处理嵌入的分号,您需要在“原始模式”中“分块”输入。进入原始模式输入命令 \.(是的,斜线点)然后你的代码,在新的一行

.;

如果你只是把.;END 之后,它不会被看到(.;我猜它本身就是一个命令)。

于 2019-03-31T15:41:16.753 回答