He creado el siguiente procedimiento que el uso de dos diferentes declaraciones preparadas, escribe algunos datos en un archivo de texto con el mismo nombre.
PROCEDIMIENTO
delimiter !!
drop procedure if exists copyIntoFile !!
create procedure copyIntoFile()
begin
declare path varchar(255);
set path = concat("'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/", curdate(), ".txt'");
set @aux1 = concat("select * from movie_modification where modified = true into outfile ", path,
" fields terminated by ';' lines starting by 'Edit: ' terminated by '\n';");
prepare stmt1 from @aux1;
execute stmt1;
deallocate prepare stmt1;
set @aux2 = concat("select * from movie_modification where modified = false into outfile ", path,
" fields terminated by ';' lines starting by 'New: ' terminated by '\n';");
prepare stmt2 from @aux2;
execute stmt2;
deallocate prepare stmt2;
delete from movie_modification;
end !!
delimiter ;
Cuando ejecuta este procedimiento, la declaración aux1
se ejecuta correctamente y crea el archivo de texto y escribe los datos en ella. Pero cuando la ejecución pasa a la segunda declaración ( aux2
), me sale el siguiente error:
Código de error: 1086. El archivo 'C: / Datos de programa / MySQL / MySQL Server / uploads / 2020-04-03.txt 5,7' ya existe
Este error se produce porque el archivo ya se está creando en la declaración aux1
.
¿Cómo puedo modificar entonces la segunda declaración aux2
sabiendo el archivo ya se ha creado?
No creo que se puede pedir a MySQL para anexar al mismo archivo, pero se podía UNIÓN las 2 consultas.
Puede añadir el 'Edit: '
y 'New: '
en la consulta, por lo tanto, lo que permite utilizar un UNION para reducir esto a una consulta.
Puede que tenga que cambiar su consulta para especificar todas las columnas que desea una SELECT 'Edit: ',*
costumbre trabajo, pero aquí hay una sugerencia.
delimiter !!
drop procedure if exists copyIntoFile !!
create procedure copyIntoFile()
begin
declare path varchar(255);
set path = concat("'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/", curdate(), ".txt'");
set @aux = concat("select 'Edit: ', col1,col2 from movie_modification where modified = true
UNION ALL
select 'New: ', col1,col2 from movie_modification where modified = false
into outfile ", path,
" fields terminated by ';' lines terminated by '\n';");
prepare stmt from @aux;
execute stmt;
deallocate prepare stmt;
delete from movie_modification;
end !!
delimiter ;