|
我有一个使用HSQLDB的JAVAFX项目。尝试设置表的源时,我想我理解了一个异常,但是由于无法修复它,所以我想我不理解它。我的SQL是:
. W& O& g5 C: R1 P8 q$ k% e. cDROP TABLE temp IF EXISTS;
/ S2 ^- K; c- N! o5 lCREATE TEXT TABLE temp(text_data LONGVARCHAR(10000));6 k7 b2 G. C6 Z: q1 x) O
SET TABLE temp SOURCE ?;
' V5 c6 ?, v- b! a1 j- _9 u9 \8 GINSERT INTO log(typ, json) SELECT SUBSTRING(text_data, 3, LOCATE('"', text_data, 3)-3),text_data FROM temp WHERE text_data '';3 w8 K2 i' h" s
DROP TABLE temp IF EXISTS;, p% U3 Q: s1 H/ W4 t
Mutliple语句在某种程度上对我不起作用,现在这应该不成问题。我将上面的sql拆分为Strings的ArrayList,每一行都是一个元素。所以我得到了这个Java代码:
G/ Q$ ?8 c2 M% I ys = c.createStatement();
0 B1 z2 J/ Q. u5 t% E! {% Z4 Kfor (String sql : sqls) {! J0 \5 `! m3 D: z1 N
System.out.println("sql: " + sql);* l G, \' M. z( \# s
if (sql.contains("?")) {) H, y7 i$ W, t0 ?3 b6 b) W" i
System.out.println("in ? part");
; U) z+ X/ r% ~- `9 |( D PreparedStatement ps = c.prepareStatement(sql);
# [# M T; m, B ps.setString(1, path.toUri().toString() + ";encoding=UTF-8;ignore_first=false;fs=\\n\\r");' k1 s: H+ j2 B0 U# m$ I5 y2 n
System.out.println("ps prepared" + ps.toString());- y+ [ ?0 s+ x5 q0 {
ps.execute();
& h3 n. F, d4 Z, I/ S: ^1 | } else {
: W: V' j5 r% }3 N5 K$ d s.execute(sql); \0 z4 |% m+ Y: d2 R. @
}
: z4 W0 b4 ~& i, G6 q" I}; J. p3 u `/ W `
我的应用程序由于PreparedStatement ps = c.prepareStatement(sql);以下异常而失败:
& R1 b2 F# s$ M8 u- `% Vjava.sql.SQLSyntaxErrorException: unexpected token: ? in statement [SET TABLE temp SOURCE ?;]
5 C- O. o' e, h! C at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)& ^4 u' y" h5 u5 W: j
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
) [3 i) a0 N$ b G2 } at org.hsqldb.jdbc.JDBCPreparedStatement.<i>(Unknown Source)
; `$ x; o9 A3 v/ V$ ^( N at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)$ j4 K8 r& f0 Q; e
at myfile in the line I pointed out above
/ B9 `2 m( T9 J# B, | at anotherofmyfiles
/ @4 {) n" z. T at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
) p( w) ^: _% w2 N8 p9 Y* o at java.util.concurrent.FutureTask.run(FutureTask.java:266)& n# b) `6 P/ H# j# y2 ?/ H i
at java.lang.Thread.run(Thread.java:745)
8 b7 ` e U8 q @- T9 j- jCaused by: org.hsqldb.HsqlException: unexpected token: ?* R* \" ]& @/ v' J5 @, N
at org.hsqldb.error.Error.parseError(Unknown Source)* {/ U* u$ x! [, t8 n s
at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)$ O$ p3 a1 Z9 {% u
at org.hsqldb.ParserBase.checkIsValue(Unknown Source)
B6 P* ]# V- N( m0 B! Z at org.hsqldb.ParserBase.readQuotedString(Unknown Source)
. M6 D4 S+ ]4 l9 {6 W5 [' F3 E at org.hsqldb.ParserCommand.compileTableSource(Unknown Source)" u6 F4 c4 S/ q$ {
at org.hsqldb.ParserCommand.compileSetTable(Unknown Source)4 O: p5 P9 k* q0 k
at org.hsqldb.ParserCommand.compileSet(Unknown Source)
7 D) K6 V6 J6 B; i7 s at org.hsqldb.ParserCommand.compilePart(Unknown Source)
# h9 A* O. m& ` at org.hsqldb.ParserCommand.compileStatement(Unknown Source)! p$ j6 _- D4 }9 t+ ]
at org.hsqldb.Session.compileStatement(Unknown Source)% [3 N2 S g% W7 }% K% B
at org.hsqldb.StatementManager.compile(Unknown Source)
- ~1 ?) ]+ ]. d! B* o% P' o/ a at org.hsqldb.Session.execute(Unknown Source)
" e5 a1 N$ J. @( x/ o ... 7 more
; [6 s9 ]; t6 |4 \: l0 j/ i在此输出之前:
- M8 t4 q3 \: x- b# Z/ ?( R" e! D* xsql: DROP TABLE temp IF EXISTS;
1 u; r( p9 B9 ]9 O4 J) lsql: CREATE TEXT TABLE temp(text_data LONGVARCHAR(10000));1 U* G# f% F$ t& A( c; J
sql: SET TABLE temp SOURCE ?;3 O5 | q) M: f
in ? part
* E0 ?6 S7 a1 t8 l! Q* d+ C, p我知道这ps.setString(1, path.toUri().toString() +
# e7 I ] B" b0 _$ X";encoding=UTF-8;ignore_first=false;fs=\\n\\r");在语义上可能并不完全正确,但是从语法上讲应该可以使用,并且由于错误早于此,因此不应导致此错误。当我在没有该行的情况下运行该应用程序时,会发生相同的错误。/ d2 N6 d& Q4 C
所以我的问题是:怎么了SET TABLE temp SOURCE. b3 P k% g4 D* r8 e
?;?为什么我不能将其用作Java中的PreparedStatement?当我从理解文档的语法是SET TABLE [table] SOURCE O q$ R3 d! T* }7 D
这里是一个字符串。难道我用Java准备了吗?
8 P+ K- D+ Z: o3 C! o" N
4 t, F: }( o* Y' C解决方案: |
|