|
我有一个使用HSQLDB的JAVAFX项目。尝试设置表的源时,我想我理解了一个异常,但是由于无法修复它,所以我想我不理解它。我的SQL是:- V# {9 [- y) p' i+ E* H1 Q
DROP TABLE temp IF EXISTS;
6 `& b& T7 i: ~2 y0 |. ]8 YCREATE TEXT TABLE temp(text_data LONGVARCHAR(10000));
; n }4 G- q0 zSET TABLE temp SOURCE ?;
+ [/ z0 t7 w' W! X! E+ f+ |INSERT INTO log(typ, json) SELECT SUBSTRING(text_data, 3, LOCATE('"', text_data, 3)-3),text_data FROM temp WHERE text_data '';# E' { f# F: @. _6 A! Z4 Q9 k
DROP TABLE temp IF EXISTS;2 t" L1 ?3 ]' M) s Q. [5 o
Mutliple语句在某种程度上对我不起作用,现在这应该不成问题。我将上面的sql拆分为Strings的ArrayList,每一行都是一个元素。所以我得到了这个Java代码:6 p* U$ H: D3 m& m4 Y$ O9 v* j4 Z
s = c.createStatement();( O% Z- k# X4 O* N- D0 e+ S8 f$ L
for (String sql : sqls) {
+ X: }( ^8 T$ U9 W2 Q2 L System.out.println("sql: " + sql);* k+ }/ Q6 s" M9 z* P5 V0 ]- {. q
if (sql.contains("?")) {7 k4 {; B+ i0 l' Q
System.out.println("in ? part");7 [& V7 T1 ~# |6 x; ~% Q# z2 B
PreparedStatement ps = c.prepareStatement(sql);
$ t2 ]8 O$ {+ t9 E; S8 e ps.setString(1, path.toUri().toString() + ";encoding=UTF-8;ignore_first=false;fs=\\n\\r");. Q: J1 \; q1 \: ?5 b
System.out.println("ps prepared" + ps.toString());
6 o, \6 F, ^4 r ps.execute();
! Q$ g6 v N4 Y4 ^8 m4 F0 [ } else {: h0 I; J& C, r# k8 J
s.execute(sql);2 A) a/ T @) e. }' B
}# Z' V+ H Z+ O1 _$ d" |3 m
}' Y& F9 t& m! V- a+ W. ]2 w+ V
我的应用程序由于PreparedStatement ps = c.prepareStatement(sql);以下异常而失败:
9 r" ` V1 k# `5 S! S& |0 qjava.sql.SQLSyntaxErrorException: unexpected token: ? in statement [SET TABLE temp SOURCE ?;]; B/ t0 j/ h. r7 E, Q" S. p8 `$ s$ Y
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)8 ~, q# z7 q D- _5 O! p) F. K! c' k
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source). E# X2 `) ?5 `5 V" v: p* G
at org.hsqldb.jdbc.JDBCPreparedStatement.<i>(Unknown Source); k6 W! v) h7 |% X
at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
# I- ~/ F) F4 Y+ Z, s at myfile in the line I pointed out above
4 j& U3 M2 J* k# b at anotherofmyfiles
0 t* t( S7 K* R6 X) g) } at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
) v4 |; l* c0 }% ? at java.util.concurrent.FutureTask.run(FutureTask.java:266)
+ t' k" W1 N) h- W1 _! z7 r& w at java.lang.Thread.run(Thread.java:745)
. ]& Q- V9 e! cCaused by: org.hsqldb.HsqlException: unexpected token: ?" Z' Z+ m8 r6 p% _& X6 i
at org.hsqldb.error.Error.parseError(Unknown Source)
9 L x, |! G3 ?6 Z& W at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)/ E- d) r) p( v' d; h6 |7 ^1 s, Z' P
at org.hsqldb.ParserBase.checkIsValue(Unknown Source)
6 N9 ^1 W- }' V7 ] at org.hsqldb.ParserBase.readQuotedString(Unknown Source)
% n2 q, q9 e0 c" ^6 J+ C at org.hsqldb.ParserCommand.compileTableSource(Unknown Source)
) L7 @) _' S; L4 s i$ t, n at org.hsqldb.ParserCommand.compileSetTable(Unknown Source)! q' ]2 @+ ^' C7 Q
at org.hsqldb.ParserCommand.compileSet(Unknown Source)
3 Q3 g0 y3 I- I; |; q& \ at org.hsqldb.ParserCommand.compilePart(Unknown Source)1 N; `2 \8 w, n4 F: N
at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
r& _# E; X: q k at org.hsqldb.Session.compileStatement(Unknown Source)
5 ~& v6 g2 P& U. _* t! q% O at org.hsqldb.StatementManager.compile(Unknown Source)
5 g1 d* _* o7 d4 j) L at org.hsqldb.Session.execute(Unknown Source)5 f/ N) n$ y! A9 x' K- Z* n, B
... 7 more
" |: R6 @# \" e! b2 }+ `在此输出之前:" `/ B1 A5 u5 o0 D* z$ J
sql: DROP TABLE temp IF EXISTS;- n" T2 N. j+ R
sql: CREATE TEXT TABLE temp(text_data LONGVARCHAR(10000));8 @7 S# ]1 M0 B2 g! i
sql: SET TABLE temp SOURCE ?;
@5 f( S& c. I8 f- @, C! a* uin ? part
+ d9 i& E" {! ?6 R% O我知道这ps.setString(1, path.toUri().toString() +
+ a& ?+ } n/ D9 b. O8 e" g' c/ X";encoding=UTF-8;ignore_first=false;fs=\\n\\r");在语义上可能并不完全正确,但是从语法上讲应该可以使用,并且由于错误早于此,因此不应导致此错误。当我在没有该行的情况下运行该应用程序时,会发生相同的错误。
4 d% \! z- T" X, u0 y. {6 k& l所以我的问题是:怎么了SET TABLE temp SOURCE; r6 f) t$ m/ @8 [6 Y* x. y
?;?为什么我不能将其用作Java中的PreparedStatement?当我从理解文档的语法是SET TABLE [table] SOURCE
. c* Q" I- Q8 x' C这里是一个字符串。难道我用Java准备了吗?
, T3 c& o; d1 g! c
) w# V1 C) a+ U J% J5 p' ~解决方案: |
|