Los parámetros dinámicos permiten parametrizar consultas SQL con marcadores de posición ?, de forma similar a PrepareStatement en bases de datos. El motor sustituye cada marcador de posición por el valor correspondiente al ejecutar la consulta.
La principal ventaja es la eficiencia de la caché: las consultas basadas en la misma plantilla SQL mejoran la tasa de aciertos de caché, sin importar los valores de parámetro proporcionados. Esto significa que las búsquedas repetidas con diferentes entradas aprovechan la caché en lugar de desencadenar una evaluación completa de la consulta cada vez.
Nota: Los parámetros dinámicos solo pueden reemplazar valores . No pueden reemplazar palabras clave ni nombres de campos.
Funcionamiento
Todos los marcadores de posición ? en una sentencia SQL son posicionales. Pase sus valores como un arreglo anidado mediante dynamic_params:
dynamic_params:[[value1, value2, ...]]
El arreglo interno se asigna a los marcadores de posición ? de izquierda a derecha. Dado que ? no incluye información de tipo, utilice CAST(? AS <type>) para especificar el tipo explícitamente.
Ejemplos
Conversión básica de tipos y coincidencia de cadenas
SELECT i1, cast(? as bigint) FROM t1 WHERE (i2 > 5 AND d3 < 10.1) OR s5 = ?
dynamic_params:[[10, "str5"]]
El primer marcador ? recibe 10 (convertido a BIGINT) y el segundo recibe "str5" (una cadena).
Búsqueda geoespacial con coincidencia de texto completo
SELECT
price,
title,
compute(
longitude,
latitude,
city_id,
CAST(? AS double),
CAST(? AS double),
CAST(1 AS bigint)
) AS distance
FROM
store,
unnest(store.sub_table)
WHERE
MATCHINDEX('shop', ?)
AND QUERY(name, ?)
dynamic_params:[[119.98844256998,
36.776817017143,
"excellect",
"fruit OR watermelon"]]
Los cuatro marcadores de posición ? reciben valores en orden: longitud (DOUBLE), latitud (DOUBLE), el término de búsqueda de MATCHINDEX y la expresión de QUERY. CAST(1 AS bigint) es un literal, no un marcador de posición, por lo que no se incluye en dynamic_params.
Limitaciones
Los marcadores de posición
?solo pueden reemplazar valores, no palabras clave SQL ni nombres de campos.Cada marcador
?se asigna por posición.