回答

收藏

HSQLDB意外令牌:?

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

我有一个使用HSQLDB的JAVAFX项目。尝试设置表的源时,我想我理解了一个异常,但是由于无法修复它,所以我想我不理解它。我的SQL是:$ G" k! a* f. G: ~
DROP TABLE temp IF EXISTS;
$ ?4 M8 x8 Z0 C% z( jCREATE TEXT TABLE temp(text_data LONGVARCHAR(10000));9 Y0 g% E* b' H
SET TABLE temp SOURCE ?;3 f- j; t3 c: y" u" k/ F) `) s4 Q
INSERT INTO log(typ, json) SELECT SUBSTRING(text_data, 3, LOCATE('"', text_data, 3)-3),text_data FROM temp WHERE text_data  '';
5 O' v' e/ H' `$ X& V4 eDROP TABLE temp IF EXISTS;0 }- ~4 W% Q3 E9 J
Mutliple语句在某种程度上对我不起作用,现在这应该不成问题。我将上面的sql拆分为Strings的ArrayList,每一行都是一个元素。所以我得到了这个Java代码:
% F2 e% Z1 D: \! ys = c.createStatement();
$ t( Z$ }$ D; ]( C# B- zfor (String sql : sqls) {% w9 L* X) P$ Y
  System.out.println("sql: " + sql);+ b. N0 S. _% I/ t  ]$ O" [
  if (sql.contains("?")) {
/ v! k9 N. w" n2 ]) i7 k. O    System.out.println("in ? part");
+ i8 g. _! j5 t/ Z; M; @8 J    PreparedStatement ps = c.prepareStatement(sql);: r6 I1 ]4 |  J' J( J! l1 e
    ps.setString(1, path.toUri().toString() + ";encoding=UTF-8;ignore_first=false;fs=\\n\\r");- a- ^9 [5 }: O
    System.out.println("ps prepared" + ps.toString());* V6 G  t0 M0 w* ?8 l& u, Y- Y
    ps.execute();
: a) X  n) U/ n& ]% M' _: a  } else {/ n& \0 i" ]2 b' \
    s.execute(sql);
" n6 T! T) e0 p* F+ d  }+ m6 R* N& e* v* J; ]/ a& S, L
}. w6 Y( @$ Q5 H* X' B/ `7 D& R
我的应用程序由于PreparedStatement ps = c.prepareStatement(sql);以下异常而失败:
% c3 e. A* X- d+ q( L% Ujava.sql.SQLSyntaxErrorException: unexpected token: ? in statement [SET TABLE temp SOURCE ?;]5 \! T, k: b) n0 z- P
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
( p' T- ~: f3 @4 M' j3 f    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
7 c0 V) A* @4 \5 I  i    at org.hsqldb.jdbc.JDBCPreparedStatement.<i>(Unknown Source)" e/ Q! \9 \2 {2 W; C4 U
    at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
! {5 g& b% H- g/ N! m' D: U    at myfile in the line I pointed out above
% L( ?, F. L( a4 A* y! e    at anotherofmyfiles
/ r; c, T: p, ?6 `    at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
5 O( V7 V6 |; z6 W    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
: \! F& ^; k# A; m    at java.lang.Thread.run(Thread.java:745)  ~( ~0 p+ g8 Z4 n
Caused by: org.hsqldb.HsqlException: unexpected token: ?
# w1 ^' j7 n' m6 S: V0 t; j    at org.hsqldb.error.Error.parseError(Unknown Source), G1 {5 Z- X. N
    at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)0 F- j, z9 A+ J2 e! p6 E5 V
    at org.hsqldb.ParserBase.checkIsValue(Unknown Source)$ T1 |) f4 }. l% @) x2 i$ P
    at org.hsqldb.ParserBase.readQuotedString(Unknown Source)
* w* N/ I; X# P: H4 ~4 ~    at org.hsqldb.ParserCommand.compileTableSource(Unknown Source)
1 b5 @+ m/ T& k3 i) @1 n. k& ~    at org.hsqldb.ParserCommand.compileSetTable(Unknown Source)
* I! O. O; X6 s    at org.hsqldb.ParserCommand.compileSet(Unknown Source)
* ^5 O5 J8 ^# w- V+ X    at org.hsqldb.ParserCommand.compilePart(Unknown Source)7 n' _* ]) G7 p4 K3 n* g
    at org.hsqldb.ParserCommand.compileStatement(Unknown Source)% h1 T9 J6 F3 N8 N* o
    at org.hsqldb.Session.compileStatement(Unknown Source)6 `. ~" X8 |1 U% d
    at org.hsqldb.StatementManager.compile(Unknown Source)
( D9 T8 U$ O2 d; z    at org.hsqldb.Session.execute(Unknown Source)& Q0 D6 i- h8 ]2 Z1 G
    ... 7 more
/ V; I! L* `" H2 p5 i  V在此输出之前:
# H1 c+ C6 ?( O% B$ ~) Xsql: DROP TABLE temp IF EXISTS;7 d3 J9 V+ [: ?; R: {$ L$ C" C5 a6 y
sql: CREATE TEXT TABLE temp(text_data LONGVARCHAR(10000));# P8 {' G* @( W" n% U1 t* n6 r
sql: SET TABLE temp SOURCE ?;
$ D! h, I9 r; E- T1 min ? part
! k2 `' [- Z1 ^8 o  D我知道这ps.setString(1, path.toUri().toString() +8 e4 i8 y; ]- D
&quot;;encoding=UTF-8;ignore_first=false;fs=\\n\\r&quot;);在语义上可能并不完全正确,但是从语法上讲应该可以使用,并且由于错误早于此,因此不应导致此错误。当我在没有该行的情况下运行该应用程序时,会发生相同的错误。
5 r. S& N2 T  I  N所以我的问题是:怎么了SET TABLE temp SOURCE
" ?' |3 B1 x+ O?;?为什么我不能将其用作Java中的PreparedStatement?当我从理解文档的语法是SET TABLE [table] SOURCE
# V1 O" P1 n2 B6 z这里是一个字符串。难道我用Java准备了吗?
1 X% K5 g, \6 R* _3 y                ; k1 ^+ U0 S0 T* J* P
解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则