我有一个使用HSQLDB的JAVAFX项目。当我试图设置表的SOURCE时,我得到了一个例外,我想我明白了,但是因为我无法解决它,我想我不理解它。 我的SQL是:
DROP TABLE temp IF EXISTS;
CREATE TEXT TABLE temp(text_data LONGVARCHAR(10000));
SET TABLE temp SOURCE ?;
INSERT INTO log(typ, json) SELECT SUBSTRING(text_data, 3, LOCATE('"', text_data, 3)-3),text_data FROM temp WHERE text_data <> '';
DROP TABLE temp IF EXISTS;
Mutliple声明在某种程度上对我不起作用,现在这应该不是问题。我将上面的sql拆分成字符串的ArrayList,每行是一个元素。所以我得到了这个Java代码:
s = c.createStatement();
for (String sql : sqls) {
System.out.println("sql: " + sql);
if (sql.contains("?")) {
System.out.println("in ? part");
PreparedStatement ps = c.prepareStatement(sql);
ps.setString(1, path.toUri().toString() + ";encoding=UTF-8;ignore_first=false;fs=\\n\\r");
System.out.println("ps prepared" + ps.toString());
ps.execute();
} else {
s.execute(sql);
}
}
我的应用程序在第PreparedStatement ps = c.prepareStatement(sql);
行失败,但有以下异常:
java.sql.SQLSyntaxErrorException: unexpected token: ? in statement [SET TABLE temp SOURCE ?;]
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
at myfile in the line I pointed out above
at anotherofmyfiles
at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.hsqldb.HsqlException: unexpected token: ?
at org.hsqldb.error.Error.parseError(Unknown Source)
at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)
at org.hsqldb.ParserBase.checkIsValue(Unknown Source)
at org.hsqldb.ParserBase.readQuotedString(Unknown Source)
at org.hsqldb.ParserCommand.compileTableSource(Unknown Source)
at org.hsqldb.ParserCommand.compileSetTable(Unknown Source)
at org.hsqldb.ParserCommand.compileSet(Unknown Source)
at org.hsqldb.ParserCommand.compilePart(Unknown Source)
at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
at org.hsqldb.Session.compileStatement(Unknown Source)
at org.hsqldb.StatementManager.compile(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
... 7 more
以前的输出:
sql: DROP TABLE temp IF EXISTS;
sql: CREATE TEXT TABLE temp(text_data LONGVARCHAR(10000));
sql: SET TABLE temp SOURCE ?;
in ? part
我知道ps.setString(1, path.toUri().toString() + ";encoding=UTF-8;ignore_first=false;fs=\\n\\r");
在语义上可能不完全正确,但语法上它应该有效,因为错误在此之前它不应该是导致此错误的原因。当我在没有该行的情况下运行应用程序时,会发生同样的错误。
所以我的问题是:SET TABLE temp SOURCE ?;
出了什么问题?为什么我不能在Java中使用它作为PreparedStatement?据我所知documentation,语法是SET TABLE <tablename> SOURCE <quoted_filename_and_options>
,其中<quoted_filename_and_options>
是一个字符串。我不能用Java编写它吗?
答案 0 :(得分:2)
PreparedStatements被发送到底层SQL引擎进行编译。允许使用参数的位置取决于驱动程序和引擎。通常它们仅在非常特定的地方得到支持,否则无法真正编译语句。
考虑只包含“?”的PreparedStatement,并提供参数:
ps.setString(1, "SELECT * FROM myTable");
这不能编译,因此被拒绝。
因此,大多数SQL数据库仅支持INSERT / UPDATE / SELECTS中通常出现简单值的位置的参数。它们不能用于字段名称,表名等。