|
我有一个使用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
";encoding=UTF-8;ignore_first=false;fs=\\n\\r");在语义上可能并不完全正确,但是从语法上讲应该可以使用,并且由于错误早于此,因此不应导致此错误。当我在没有该行的情况下运行该应用程序时,会发生相同的错误。, 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解决方案: |
|