回答

收藏

HSQLDB意外令牌:?

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

我有一个使用HSQLDB的JAVAFX项目。尝试设置表的源时,我想我理解了一个异常,但是由于无法修复它,所以我想我不理解它。我的SQL是:
6 Y7 A) s- _" JDROP TABLE temp IF EXISTS;: c% Q: a! v. J5 [8 _9 g
CREATE TEXT TABLE temp(text_data LONGVARCHAR(10000));) @0 k) W* |  k: p1 X* |1 G
SET TABLE temp SOURCE ?;
; P& W+ ^! L( u5 U! I7 g. I; ^2 hINSERT INTO log(typ, json) SELECT SUBSTRING(text_data, 3, LOCATE('"', text_data, 3)-3),text_data FROM temp WHERE text_data  '';
) E2 @5 k0 j# s! B' F2 xDROP TABLE temp IF EXISTS;
3 t) ]7 o4 f6 Q0 j- XMutliple语句在某种程度上对我不起作用,现在这应该不成问题。我将上面的sql拆分为Strings的ArrayList,每一行都是一个元素。所以我得到了这个Java代码:
" `% L' M' ^* W4 ns = c.createStatement();
$ y$ r/ l/ D/ k  ]: Mfor (String sql : sqls) {
' x, M( g7 e, ?  System.out.println("sql: " + sql);
, b+ T# e9 q! ?, ?' Q2 W  if (sql.contains("?")) {
5 w$ V* H+ E3 Y    System.out.println("in ? part");2 T3 k* S- D9 p( O1 w! y+ d$ a* `1 r
    PreparedStatement ps = c.prepareStatement(sql);2 T/ ]4 ?& u) e& _
    ps.setString(1, path.toUri().toString() + ";encoding=UTF-8;ignore_first=false;fs=\\n\\r");
6 G: ^; ~" M( ~. U+ f7 r$ b* `9 Z    System.out.println("ps prepared" + ps.toString());" F6 f$ s' C+ m/ s6 o0 ~
    ps.execute();" @2 O: n8 ]. D' Q' b8 v
  } else {
7 K* j6 v6 g6 D& T/ o    s.execute(sql);
7 B% b/ ~) R+ O% q1 R1 v, R  }" D" r* ?; ~+ o
}
' ?+ |$ v1 B' m) x( W3 o我的应用程序由于PreparedStatement ps = c.prepareStatement(sql);以下异常而失败:
/ C: Q4 V8 \6 P' Wjava.sql.SQLSyntaxErrorException: unexpected token: ? in statement [SET TABLE temp SOURCE ?;]* _0 C/ h  M4 `, ~9 b
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)- M: F, K# I* A" s
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
, c5 o: i9 U/ j& Q2 o    at org.hsqldb.jdbc.JDBCPreparedStatement.<i>(Unknown Source)
3 e9 n6 T5 G+ L2 F% ~0 w6 ^    at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
' m' ~# V5 q4 X2 b8 N5 T    at myfile in the line I pointed out above
" Z' w$ {, X+ K. O/ p3 X3 D+ _, h5 F    at anotherofmyfiles: u9 N; r( h0 O" \
    at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)* @. M- q- U# `. j
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)9 o( [0 }& V! [$ d  @' }& F
    at java.lang.Thread.run(Thread.java:745)
% Z4 {7 @4 t/ l; zCaused by: org.hsqldb.HsqlException: unexpected token: ?
6 [5 X- }. U4 d7 a0 q; a% n+ J, T    at org.hsqldb.error.Error.parseError(Unknown Source)
: ]; K- T1 X$ K    at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)
6 I2 s6 e( h: `! H% P) b5 j  U    at org.hsqldb.ParserBase.checkIsValue(Unknown Source)
1 S# a# r, b( a$ |. D    at org.hsqldb.ParserBase.readQuotedString(Unknown Source)
+ I" C7 K4 x5 e% i+ s) D    at org.hsqldb.ParserCommand.compileTableSource(Unknown Source)% l' g( e1 a7 h. O
    at org.hsqldb.ParserCommand.compileSetTable(Unknown Source)% B% \+ W$ p9 Z. j' I$ r
    at org.hsqldb.ParserCommand.compileSet(Unknown Source)
( y2 B! w( U  b( |    at org.hsqldb.ParserCommand.compilePart(Unknown Source)  C5 K* y8 s, ?3 G1 z$ M( A. M
    at org.hsqldb.ParserCommand.compileStatement(Unknown Source)+ U" Q& Q2 v8 J+ \( c
    at org.hsqldb.Session.compileStatement(Unknown Source)
% q  \# G7 _3 h3 z: `# B7 O" \9 U    at org.hsqldb.StatementManager.compile(Unknown Source)
' \" m" q# T, S" t  n0 D. R9 R8 z    at org.hsqldb.Session.execute(Unknown Source)# q. j7 A" e9 _0 y& g
    ... 7 more- _2 Q, M9 B% @' Y6 D
在此输出之前:$ B2 r, C, x9 t9 i: D- X' W8 S
sql: DROP TABLE temp IF EXISTS;: G& F5 R- c9 Q* e
sql: CREATE TEXT TABLE temp(text_data LONGVARCHAR(10000));
  H2 P- s( b. y* a$ T9 @sql: SET TABLE temp SOURCE ?;
& n8 t7 J: d2 Tin ? part& V! ?% R) J# z5 A/ g
我知道这ps.setString(1, path.toUri().toString() +
- Q1 ?" G7 J1 F: y9 y&quot;;encoding=UTF-8;ignore_first=false;fs=\\n\\r&quot;);在语义上可能并不完全正确,但是从语法上讲应该可以使用,并且由于错误早于此,因此不应导致此错误。当我在没有该行的情况下运行该应用程序时,会发生相同的错误。
! _7 k8 u0 A; F9 V3 G' [所以我的问题是:怎么了SET TABLE temp SOURCE
! U5 N5 B- P$ L+ a4 A" {, z?;?为什么我不能将其用作Java中的PreparedStatement?当我从理解文档的语法是SET TABLE [table] SOURCE9 P3 i$ |' y/ e
这里是一个字符串。难道我用Java准备了吗?
5 W# a% w' ?% o) S               
7 \& h" h& ]# p7 Z/ {: ?% A解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则