1

非常に単純なHSQLDBCREATEPROCEDUREステートメントがあります。

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ツールの1つ(DatabaseManagerSwingなど)を使用してこのSQLを実行すると、正常に機能します。
  2. まったく同じコマンド(選択、挿入、削除など)を使用して他のSQLステートメントを実行できますが、CREATEPROCEDUREは実行できません。
  3. 私のscript.sqlファイルには6行しか含まれていませんが、エラーには7行目が記載されています。これは私には意味がありません。
  4. ファイルのSQLの最後にセミコロンを追加しても違いはありません
  5. 私はこれをWindowsとLinuxの両方で試しましたが、まったく同じ結果になりました
  6. stdinを介してインライン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

私もこれの上に髪を引っ張っていました。例は実際には問題を解決しませんでしたが、少しいじくり回して私をそこに導きました。埋め込まれたセミコロンを処理するには、入力を「rawモード」で「チャンク」する必要があります。rawモードに入るには、コマンド \.(yes、スラッシュドット)を入力します。次に、コードを改行します

.;

ENDの後にアフターを付けるだけ.;では表示されません(.;それ自体がコマンドだと思います)。

于 2019-03-31T15:41:16.753 に答える
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 に答える