Mysql 如何将查询作为参数传递给使用它进行查询的bash函数?

Mysql 如何将查询作为参数传递给使用它进行查询的bash函数?,mysql,bash,function,parameters,Mysql,Bash,Function,Parameters,我需要更新一组数据库中的一些值,因为我必须多次连接这个解决方案。 其思想是将外部sql文件处理为变量,并将它们传递给建立连接并获得结果的函数。 还有一些硬编码的sql脚本,它们通过相同的函数收集一些数据。 所有这些只是为最终查询(consulta2.sql)做准备,该查询必须根据查询的限制更改某些状态 consulta1=$(<consulta1.sql); consulta2=$(<consulta2.sql); #INSIDE LOOP---------------------

我需要更新一组数据库中的一些值,因为我必须多次连接这个解决方案。 其思想是将外部sql文件处理为变量,并将它们传递给建立连接并获得结果的函数。 还有一些硬编码的sql脚本,它们通过相同的函数收集一些数据。 所有这些只是为最终查询(consulta2.sql)做准备,该查询必须根据查询的限制更改某些状态

consulta1=$(<consulta1.sql);
consulta2=$(<consulta2.sql);

#INSIDE LOOP------------------------------------

sqlconnection () {
        local q="$*"
        local result=$(mysql -NB -u"user" -p"pass" -h"${domain}"  -D"${sala}" -P${port_db} -e\"${q}\")
        echo "${result}"
    }

qs1="SELECT numero FROM configuracion WHERE clave LIKE 'cantidad_tarjeta_servicio'"
    sqlconnection "$qs1"
    max_service_cards=$*
echo "    - Cantidad Tarjetas Servicio Maxima = ${max_service_cards}." | tee -a ${output}

qs2="SELECT count(*) FROM tarjeta WHERE id_tipo_tarjeta IN (3,4)"
    actual_service_cards=$(sqlconnection "$qs2")
    echo "    - Cantidad Tarjetas Servicio Presentes = ${actual_service_cards}." | tee -a ${output}
这就是我得到的:


posadas1:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"DELETE m FROM movimiento AS m INNER JOIN tarjeta AS t ON m.nro_tarjeta = t.nro_' at line 1

Limpieza de Movimientos [0 = OK]: 0.
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"SELECT numero FROM configuracion WHERE clave='cantidad_tarjeta_servicio'"' at line 1

    - Cantidad Tarjetas Servicio Maxima = 0.
这也是我采用的另一种方法(完整代码):


错误消息还不够清楚吗

>mysql -uitsme -e '"SELECT 1"'
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"select 1"' at line 1

>mysql -uitsme -e"select 1"
+---+
| 1 |
+---+
| 1 |
+---+

您的错误与您提供的代码不匹配。。1) 没有delete语句。。2)我在代码中看到了一个
,其中clave喜欢'cantidad_tarjeta_servicio'
,但没有
clave='cantidad_tarjeta_servicio'
,对不起,忘了放sql脚本的内容,编辑我很抱歉,但我没有理解你的意思。我试图将从两个文件中提取并硬编码为参数的查询传递给连接函数。然后取结果(它总是一个值或无)。我需要这些值来“动态化”这个脚本的主要查询“consulta2”的限制。
#!/bin/bash
config="limpiador_local.conf";
consulta1=$(<consulta1.sql);
consulta2=$(<consulta2.sql);
consulta_procesada="consulta2_test.sql";
current_datetime="$(date +%Y%m%d-%H%M)";
output="output.log";

echo "Programa ejecutado con configuracion: $config  timestamp: ${current_datetime}" | tee -a ${output}

while read A ; do
    sala=$(echo "$A" | awk -F" " '{print $1}');
    domain=$(echo "$A" | awk -F" " '{print $2}');
    port_db=$(echo "$A" | awk -F" " '{print $3}');

    sqlconnection () {
        local q="$*"
        echo ${q}
        local result=$(mysql -NB -u"user" -p"pass" -h"${domain}"  -D"${sala}" -P${port_db} -e "${q}")
        echo "${result}"
    }
    #conexion=$(mysql --host="${domain}" --user="crucijuegos" --password="cruci00" --database="${sala}" --port=${port_db});
    #conexion=$(mysql -u "crucijuegos" -pcruci00 -D"${sala}");

    echo
    echo "${sala}:" | tee -a ${output}

    sqlconnection ${consulta1}
    echo "Limpieza de Movimientos [0 = OK]: $?."

    qs1="SELECT numero FROM configuracion WHERE clave='cantidad_tarjeta_servicio'"
    max_service_cards=$(sqlconnection $qs1)
    echo "    - Cantidad Tarjetas Servicio Maxima = ${max_service_cards}." | tee -a ${output}
    exit
    qs2="SELECT count(*) FROM tarjeta WHERE id_tipo_tarjeta IN (3,4)"
    actual_service_cards=$(sqlconnection $qs2)
    echo "    - Cantidad Tarjetas Servicio Presentes = ${actual_service_cards}." | tee -a ${output}

    if [[ ${actual_service_cards} > ${max_service_cards} ]] ; then
        sed -e "s/ N /        LIMIT ${max_service_cards}/" consulta2.sql | tee ${consulta_procesada} | tee -a ${output}
        exit
        echo "    [Atencion] Se anularon tarjetas sobrantes." | tee -a ${output}
    else
        echo "    No se realizaron cambios." | tee -a ${output}
    fi

done < $config;

echo "________terminado________";
Programa ejecutado con configuracion: limpiador_local.conf  timestamp: 20190905-1534

posadas1:
DELETE m FROM movimiento AS m INNER JOIN tarjeta AS t ON m.nro_tarjeta = t.nro_tarjeta WHERE m.tipo_movimiento = 17 AND t.nro_tarjeta IN(3,4);

Limpieza de Movimientos [0 = OK]: 0.
    - Cantidad Tarjetas Servicio Maxima = SELECT numero FROM configuracion WHERE clave='cantidad_tarjeta_servicio'.
>mysql -uitsme -e '"SELECT 1"'
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"select 1"' at line 1

>mysql -uitsme -e"select 1"
+---+
| 1 |
+---+
| 1 |
+---+