回答

收藏

HSQLDB意外令牌:?

技术问答 技术问答 298 人阅读 | 0 人回复 | 2023-09-12

我有一个使用HSQLDB的JAVAFX项目。尝试设置表的源时,我想我理解了一个异常,但是由于无法修复它,所以我想我不理解它。我的SQL是:- R$ S+ h- O" q; w6 A9 ]4 J
DROP TABLE temp IF EXISTS;
6 @5 d: e0 g- M9 uCREATE TEXT TABLE temp(text_data LONGVARCHAR(10000));
  M' r  a/ _6 H* B  kSET TABLE temp SOURCE ?;5 B9 g5 s! |# m& E0 X
INSERT INTO log(typ, json) SELECT SUBSTRING(text_data, 3, LOCATE('"', text_data, 3)-3),text_data FROM temp WHERE text_data  '';
/ I* D% e8 F1 CDROP TABLE temp IF EXISTS;6 {  W5 I  q, Y# j& Z0 B
Mutliple语句在某种程度上对我不起作用,现在这应该不成问题。我将上面的sql拆分为Strings的ArrayList,每一行都是一个元素。所以我得到了这个Java代码:3 ]$ l+ \' u, P& }0 N% h" }
s = c.createStatement();, Y" F0 s* {& U
for (String sql : sqls) {
; T3 S" V8 p! B7 B" Z  System.out.println("sql: " + sql);
( ~( I+ V6 V" W0 h  if (sql.contains("?")) {  j+ a9 j  U3 g0 ]- i: g6 M  `3 n3 `
    System.out.println("in ? part");
: c: T# G: o  l8 h# W& x    PreparedStatement ps = c.prepareStatement(sql);9 l  O8 @: B% ?# d6 c
    ps.setString(1, path.toUri().toString() + ";encoding=UTF-8;ignore_first=false;fs=\\n\\r");4 Y3 V8 I0 e, R" y8 `+ c( X: N
    System.out.println("ps prepared" + ps.toString());
1 C" Q4 t" ~* P5 l6 A& e    ps.execute();( E/ t+ y. o: N+ T
  } else {' u7 H( C7 q5 c6 t( b5 x0 a
    s.execute(sql);2 u: T' @$ N3 M3 i
  }
, `( j$ {) Q" L: [, m- l/ T}
5 }/ r/ {! y" L* l# p( w$ Y$ U我的应用程序由于PreparedStatement ps = c.prepareStatement(sql);以下异常而失败:
! s) S& `" R6 V. }% g& zjava.sql.SQLSyntaxErrorException: unexpected token: ? in statement [SET TABLE temp SOURCE ?;]) s5 u$ |; M7 i/ @6 g
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
* n# w) ?( r, ]; C0 C    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
# L  Q0 {) l# [; C  k    at org.hsqldb.jdbc.JDBCPreparedStatement.<i>(Unknown Source)
9 m0 y5 n$ G6 {6 a9 O    at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)1 W, P/ c2 ]5 l
    at myfile in the line I pointed out above; a; T5 U* I( z: h! ~
    at anotherofmyfiles
" @. k- V+ z- s' R. b+ t) y    at javafx.concurrent.Task$TaskCallable.call(Task.java:1423); z! a/ E+ ?0 f
    at java.util.concurrent.FutureTask.run(FutureTask.java:266). C: W! _. Z9 k: ]2 a3 x
    at java.lang.Thread.run(Thread.java:745)9 o+ _: @$ p- g( q$ {
Caused by: org.hsqldb.HsqlException: unexpected token: ?
, k1 a- [) w) o2 [    at org.hsqldb.error.Error.parseError(Unknown Source)
. Y( s8 e/ a5 ]8 \6 R2 M& F/ `5 x7 y/ n4 ^    at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)
2 s2 m, D' [6 C* N" D    at org.hsqldb.ParserBase.checkIsValue(Unknown Source)" J/ }8 v/ T: S
    at org.hsqldb.ParserBase.readQuotedString(Unknown Source)+ J+ d/ F8 R+ ^- a% V
    at org.hsqldb.ParserCommand.compileTableSource(Unknown Source)3 K  y% A) A9 N0 e0 U, e. x
    at org.hsqldb.ParserCommand.compileSetTable(Unknown Source)
! u7 Y  a. X/ r/ D! |$ q/ N; O    at org.hsqldb.ParserCommand.compileSet(Unknown Source)
0 t7 {- W7 V& X, f( r/ }  j* {    at org.hsqldb.ParserCommand.compilePart(Unknown Source)
4 H' d. \7 P' F9 P+ H    at org.hsqldb.ParserCommand.compileStatement(Unknown Source)0 n+ E( W9 P, F" h& B2 b! O5 j# v
    at org.hsqldb.Session.compileStatement(Unknown Source)
. p# X" r) _3 i  {1 B0 W    at org.hsqldb.StatementManager.compile(Unknown Source)
) D7 O' w3 W* O* H) ^) f, T    at org.hsqldb.Session.execute(Unknown Source)
; o( \6 T: u; B! U    ... 7 more% I* s5 Z' Z3 h1 X2 f4 q3 v) Q( ]
在此输出之前:
+ b% r. u8 C4 h* M1 H. ~- dsql: DROP TABLE temp IF EXISTS;
  `. h% d) N7 E0 G4 v' esql: CREATE TEXT TABLE temp(text_data LONGVARCHAR(10000));
3 ^9 J$ i$ x) u; Psql: SET TABLE temp SOURCE ?;& O4 k! }  ^0 U4 s( z" `$ C
in ? part
% g+ x- Y$ z- X4 k( `我知道这ps.setString(1, path.toUri().toString() +) I+ I& O7 C5 n+ y' X( p/ v/ M
&quot;;encoding=UTF-8;ignore_first=false;fs=\\n\\r&quot;);在语义上可能并不完全正确,但是从语法上讲应该可以使用,并且由于错误早于此,因此不应导致此错误。当我在没有该行的情况下运行该应用程序时,会发生相同的错误。, u# Y  F8 W6 Y6 f9 l
所以我的问题是:怎么了SET TABLE temp SOURCE* ~( Z; a) V  z; V. |+ V
?;?为什么我不能将其用作Java中的PreparedStatement?当我从理解文档的语法是SET TABLE [table] SOURCE
& p8 g( n( ^6 Z. U$ v0 e这里是一个字符串。难道我用Java准备了吗?  c3 `. b( r1 }7 p5 R$ J7 b
               
6 a5 z* H% @! s' Q$ y解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则