Error en la sintaxis SQL SET Syntax, ¿cómo solucionarlo?
Mientras estoy en la función Lambda, intento ejecutar la siguiente consulta, pero arroja un error ERPARSEERROR:
{
"errorType": "Error",
"errorMessage": "ER<em>PARSE</em>ERROR: Tiene un error en la sintaxis de su SQL; verifique el manual que corresponde a su versión de servidor MySQL para conocer la sintaxis correcta para usar cerca de 'SELECT DISTINCT A.j FROM ...' en la línea 1",
"trace": [
const vandium = require('vandium');
var mysql = require('mysql');
var connection = mysql.createConnection({ multipleStatements: true });
exports.handler = vandium.generic()
.handler((event, context, callback) => {
var connection = mysql.createConnection({
host: 'xjxj',
user: 'xjxj',
password: 'xjxj',
database: 'xjxj'
});
var x = connection.escape(event.x);
var y= connection.escape(event.y);
var z = connection.escape(event.z);
connection.query(“SET @” + y + “=2; SELECT DISTINCT A.j FROM A INNER JOIN B, C WHERE A.j = B.j and C.x= ” + x + ” and C.y=”+ y + ” and C.z = ” + z + “”, function (error, results, fields) {
if (error) {
connection.destroy();
throw error;
}
else {
console.log(results);
callback(null, results);
}
});
});
También pensé en algo como:
SET @y=2;…
pero sin éxito.
Estoy intentando implementar algo similar a esto:
SET @y := @k :=79;SELECT DISTINCT A.j FROM A INNER JOIN B, C WHERE A.j = B.j and C.x= “+ x + ” and C.y=” + y + ” and C.z= ” + z + ”
“`
Por supuesto, no hay una variable ‘k’ en el primer bloque de código, pero aquí está la idea aproximada.
¿Qué ha salido mal?
davy.ai
El principal problema con la consulta es que intenta ejecutar dos declaraciones juntas, la declaración SET y la declaración SELECT. La biblioteca
mysql
utilizada en el código solo permite ejecutar una declaración a la vez de forma predeterminada. Esta es una medida de seguridad para evitar ataques de inyección SQL.En el bloque de código funcional, la opción
multipleStatements
se establece en true al crear la conexión, lo que permite ejecutar múltiples declaraciones. Sin embargo, esto generalmente no se recomienda debido a los riesgos de seguridad.Una solución alternativa sería dividir la declaración SET y la declaración SELECT en dos consultas separadas y ejecutarlas de forma secuencial. Esto aseguraría que cada consulta se ejecute por separado y evitaría la aparición de errores de sintaxis como
ER_PARSE_ERROR
.Otro problema en el código es que la variable
connection
se define dos veces, una globalmente y otra dentro de la función del controlador. Esto puede causar comportamientos inesperados y errores. Se recomienda eliminar la variable global y utilizar solo la variable local dentro de la función del controlador.