No puedes usar PREPARE
para ejecutar LOAD DATA INFILE
.
La lista de instrucciones que puede ejecutar con PREPARE
están documentados en esta página:https:/ /dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html
bajo el subtítulo "Sintaxis SQL permitida en declaraciones preparadas". Tenga en cuenta que esta lista puede ser diferente en versiones anteriores de MySQL.
Porque no puedes usar PREPARE
, no puede hacer el método que está usando configurando una variable y haciendo una instrucción SQL dinámica.
Pero puede ejecutar LOAD DATA INFILE
sin usar PREPARE
. Tiene que interpolar el nombre del archivo en la declaración utilizando la sustitución de variable de shell y luego ejecutarlo como una declaración SQL directa.
Su archivo update.sql podría verse así:
LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
Luego puede sustituir su variable de shell en el archivo y ejecutar el resultado de esta manera:
sed s/%spacename%/$1/ update.sql |
mysql -h "localhost" -u "root" "-pmypassword" "mydb"
Otra forma más sencilla es usar mysqlimport
, excepto que esto requiere que el nombre del archivo de entrada sea el mismo que el nombre de la tabla. Puede cambiar el nombre de su archivo de entrada para que coincida con la tabla en la que desea cargar (a la que llama tmp
), o bien crea un enlace simbólico:
ln -s $1 /tmp/tmp.list
mysqlimport --local -h "localhost" -u "root" "-pmypassword" "mydb" /tmp/tmp.list
rm -f /tmp/tmp.list
mysqlimport ignora la extensión ".list", por lo que puede usar cualquier extensión de archivo o ninguna.