У меня есть сценарий, в котором я получаю запрос SQL и аргументы SQL (чтобы избежать внедрения SQL) в качестве входных данных.
И я запускаю этот SQL, используя хранимую процедуру VoltDB AdHoc
, используя приведенный ниже код.
private static final String voltdbServer = "localhost";
private static final int voltdbPort = 21212;
public ClientResponse runAdHoc(String sql, Object... sqlArgs) throws IOException, ProcCallException
{
ClientConfig clientConfig = new ClientConfig();
Client voltdbClient = ClientFactory.createClient(clientConfig);
voltdbClient.createConnection(voltdbServer, voltdbPort);
return voltdbClient.callProcedure("@AdHoc", sql, sqlArgs);
}
Но я получаю ошибку org.voltdb.client.ProcCallException: SQL error while compiling query: Incorrect number of parameters passed: expected 2, passed 1
Для runAdHoc("select * from table where column1 = ? and column2 = ?", "column1", "column2")
, когда есть два или более параметров.
И я получаю ошибку org.voltdb.client.ProcCallException: Unable to execute adhoc sql statement(s): Array / Scalar parameter mismatch ([Ljava.lang.String; to java.lang.String)
Для runAdHoc("select * from table where column1 = ?", "column1");
, когда есть только один параметр.
Но я не сталкиваюсь с этой проблемой, когда звоню напрямую voltdbClient.callProcedure("@AdHoc", "select * from table where column1 = ? and column2 = ?", "column1", "column2")
Я думаю, что VoltDb не может обрабатывать sqlArgs
как отдельные параметры, он обрабатывает их как один массив.
Одним из способов решения этой проблемы является сам анализ строки SQL, а затем ее передача, но я публикую это, чтобы узнать эффективный способ решения этой проблемы.
Примечание: - Использованный SQL - это просто тестовый SQL