Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试使用带有HSQLDB 2.2.8的SQL工具创建存储过程时出现未终止的输入错误_Sql_Stored Procedures_Hsqldb - Fatal编程技术网

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

尝试使用带有HSQLDB 2.2.8的SQL工具创建存储过程时出现未终止的输入错误,sql,stored-procedures,hsqldb,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时,它失败并出现“Unterminated input”错误。我使用的命令是: java -jar -cp $HSQLDB_HOME/lib/sqltool.jar:

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

CREATE PROCEDURE test_procedure()
CONTAINS SQL
BEGIN
DECLARE test_variable INTEGER;
SET test_variable = 0;
END
当我尝试使用SQLTool执行此SQL时,它失败并出现“Unterminated input”错误。我使用的命令是:

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
到目前为止,我已经了解了很多:

  • 如果我使用HSQLDB提供的一个GUI工具(如DatabaseManagerSwing)运行此SQL,它就可以正常工作
  • 我可以使用完全相同的命令(选择、插入、删除等)执行其他SQL语句,但不能执行CREATE过程
  • 我的script.sql文件只包含6行,但错误提到了第7行,这对我来说毫无意义
  • 在文件中的SQL结尾添加分号没有任何区别
  • 我在Windows和Linux上都试过,结果完全一样
  • 我尝试通过stdin和使用内联SQL将文件传递给SQL工具,结果完全相同
  • 我曾尝试将存储过程主体更改为其他内容,但没有任何效果

  • 我现在没有主意了。有人遇到过这个错误吗?有什么可以做的吗?

    您可以按照指南中的示例,使用示例文件作为模板:


    我也在为这件事发愁。这些例子实际上并没有解决问题,但稍加修改就解决了问题。要处理嵌入的分号,您需要在“原始模式”中“分块”输入。要进入原始模式,请输入命令
    \。
    (是,斜线点) 然后你的代码,然后,在新行上

    .;
    

    如果你只是把
    结束后,它将不会被看到(我猜
    本身就是一个命令)。

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

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

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

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

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

    感谢链接-我在第一个示例中找到了答案。缺少的东西是一个。;在CREATE PROCEDURE语句的末尾