3.3 Привязка параметров
Вместо использования значений непосредственно в строке выражения рекомендуется разделять значения и саму строку выражения. Это делается с помощью параметров в строке выражения и функции bind() для привязки значений к параметрам.
Параметры могут быть заданы следующим образом: анонимные и именованные.
Тип параметра | Синтаксис | Пример | Разрешено в операциях CRUD | Разрешено в строках SQL |
|---|---|---|---|---|
Анонимный | ? | 'age > ?' | нет | да |
Именованный | :<имя> | 'age > :age' | да | нет |
Следующий пример демонстрирует, как использовать функцию bind() перед функцией execute(). Для каждого именованного параметра предоставьте аргумент для bind(), содержащий имя параметра и его значение. Порядок, в котором пары значение-параметр передаются в bind(), не имеет значения. В примере предполагается, что схема test была назначена переменной db, а коллекция my_collection существует.
// Collection.find() function with fixed values
var myColl = db.getCollection('my_collection');
var myRes1 = myColl.find('age = 18').execute();
// Using the .bind() function to bind parameters
var myRes2 = myColl.find('name = :param1 AND age = :param2').bind('param1','Rohit').bind('param2', 18).execute();
// Using named parameters
myColl.modify('name = :param').set('age', 55).
bind('param', 'Nadya').execute();
// Binding works for all CRUD statements except add()
var myRes3 = myColl.find('name like :param').
bind('param', 'R%').execute();
Анонимные заглушки не поддерживаются в X DevAPI. Это ограничение улучшает ясность кода в цепочках команд CRUD с несколькими методами, использующими заглушки. Независимо от используемого варианта синтаксиса bind() всегда существует четкое соответствие между параметрами и заглушками на основе имени параметра.
Все методы цепочки команд CRUD образуют один пространство имен для заглушек. В следующем примере modify() и set() объединены. Оба метода принимают выражение с заглушками. Заглушки относятся к одному объединённому пространству имен. Оба используют одну заглушку под названием :param. Один вызов bind() с одним параметром имени и значения для :param используется для назначения значения заглушки обоим появлениям :param в объединенных методах ..
// one bind() per parameter
var myColl = db.getCollection('relatives');
var juniors = myColl.find('alias = "jr"').execute().fetchAll();
for (var index in juniors){
myColl.modify('name = :param').
set('parent_name',mysqlx.expr(':param')).
bind('param', juniors[index].name).execute();
}
Не допускается использование именованного параметра, имя которого начинается с цифры. Например, :1one и :1 недопустимы.
Подготовка операторов CRUD
Вместо прямой привязки и выполнения операций CRUD с помощью bind() и execute() или execute() также можно сохранить объект операции CRUD в переменной для последующего выполнения.
Преимущество этого заключается в возможности привязки нескольких наборов переменных к параметрам, определённым в строках выражений, и, следовательно, в улучшении производительности при выполнении большого количества аналогичных операций. В примере предполагается, что схема test была назначена переменной db, а коллекция my_collection существует.
var myColl = db.getCollection('my_collection');
// Only prepare a Collection.remove() operation, but do not run it yet
var myRemove = myColl.remove('name = :param1 AND age = :param2');
// Binding parameters to the prepared function and .execute()
myRemove.bind('param1', 'Leon').bind('param2', 39).execute();
myRemove.bind('param1', 'Johannes').bind('param2', 28).execute();
// Binding works for all CRUD statements but add()
var myFind = myColl.find('name like :param1 AND age > :param2');
var myDocs = myFind.bind('param1', 'L%').bind('param2', 20).execute();
var MyOtherDocs = myFind.bind('param1', 'J%').bind('param2', 25).execute();
© 2025 Oracle
Licensed under the GPLv2 License.