Адаптер IBM Mobilefirst SQL с параметрами для оператора select IN

У меня возникла проблема с вызовом адаптера MobileFirst SQL для получения результата из инструкции Oracle Select-where-IN.

Моя среда MobileFirst v7.0

Определение адаптера:

sqlGetResultsStatement = WL.Server.createSQLStatement ("select * from table where field IN (?)");

function getResults(param) {
    return WL.Server.invokeSQLStatement({
        preparedStatement : sqlGetResultsStatement,
        parameters : [param]
    });
}

Если я вызываю адаптер с одним значением параметра (например, '0001'), все работает нормально, и я получаю результаты. Но если я вызываю адаптер с этим типом параметра: "'0001','0002','0003'" я получаю ответ с пустым набором результатов (без ошибок), подобный этому

{
   "isSuccessful": true,
   "resultSet": [
   ]
}

Что-то не так в звонке?


person DigitalBlu    schedule 17.06.2015    source источник
comment
Как вы вызываете адаптер для нескольких параметров? то есть: getResults('0001','0002','0003') или getResults('0001','0002','0003')   -  person Yoel Nunez    schedule 17.06.2015


Ответы (1)


Вы не можете передать набор значений одному параметру подготовленного оператора. Одной из ключевых особенностей подготовленных операторов является то, что они помогают предотвратить атаки SQL-инъекций, и поэтому имеет смысл, когда внутри оператора есть один параметр, он считается одним значением, поэтому он заключает переданное вами значение в кавычки. "'0001','0002','0003'". Кроме того, MobileFirst не позволяет создавать подготовленные операторы внутри функций if в адаптерах JS, и поэтому вы не можете изменять количество параметров при вызове процедуры. С учетом сказанного есть два подхода, которые вы можете использовать для достижения этой цели.

Адаптер JavaScript Определите максимальное количество параметров, которые вы когда-либо будете передавать этой процедуре, и заранее добавьте параметры в подготовленный оператор. Допустим, вы никогда не будете передавать более 10 параметров, тогда я бы использовал что-то вроде:

    var MAX_PARAMS = 10;

    sqlGetResultsStatement = WL.Server.createSQLStatement ("select * from table where field IN (?,?,?,?,?,?,?,?,?,?)");

    function getResults(param) {
        /*
         * (arguments) is an array of parameters passed to the procedure
         */
        return WL.Server.invokeSQLStatement({
            preparedStatement : sqlGetResultsStatement,
            parameters : fillVars(arguments)
        });
    }
    // helper function to fill all the values for the SQL Statement Parameters
    function fillVars(vars) {
        var list = [];

        for(var i = 0; i < MAX_PARAMS; i++) {
            if(vars.length >= i + 1) {
                list.push(vars[i]);
            } else {
                // some value that will not be in your db
                list.push(null);
            }
        }

        return list;
    }

Адаптер Java Другой вариант — использовать адаптер Java и напрямую подключаться к вашей БД и писать собственные запросы/подготовленные операторы. К вашему сведению: этот вариант даст вам больше гибкости, но вам придется включить файлы jar драйвера БД и написать всю логику подключения/запроса к БД и т. д.

person Yoel Nunez    schedule 18.06.2015