sql >> Base de Datos >  >> RDS >> Mysql

procedimiento almacenado mysql con INTO OUTFILE

Suponiendo (por el bien del ejemplo ) que sus deals la mesa parece

---------------------------
| id | deal_date  | deal  |
---------------------------
| 1  | 2014-03-10 | Deal1 |
| 2  | 2014-03-11 | Deal2 |
| 3  | 2014-03-12 | Deal3 |
---------------------------

Ahora su código de procedimiento podría verse

DELIMITER //
CREATE PROCEDURE get_deals()
BEGIN
    -- create a temporary table and fill it with the desired subset of data
    -- Apply WHERE and ORDER BY as needed
    DROP TEMPORARY TABLE IF EXISTS tmp_deals;
    CREATE TEMPORARY TABLE tmp_deals 
    SELECT id, deal_date, deal -- explicitly specify real column names here. Don't use SELECT *. It's a bad practice.
      FROM deals
     ORDER BY id DESC;

    -- write the resultset to the file
    SELECT * 
      INTO OUTFILE '/path/to/deals.txt'
        FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
        LINES TERMINATED BY '\n'
      FROM tmp_deals;

    -- return the resultset to the client
    SELECT * FROM tmp_deals; 
END//
DELIMITER ;

Después de ejecutarlo:

CALL get_deals();

En el cliente obtendrá:

---------------------------
| id | deal_date  | deal  |
---------------------------
| 3  | 2014-03-12 | Deal3 |
| 2  | 2014-03-11 | Deal2 |
| 1  | 2014-03-10 | Deal1 |
---------------------------

Y el contenido del archivo será:

3,"2014-03-12","Deal3"
2,"2014-03-11","Deal2"
1,"2014-03-10","Deal1"

Nota: al usar OUTFILE MySQL requiere que el archivo se cree nuevamente . Si deja el archivo en el directorio de salida, en la siguiente llamada al procedimiento obtendrá el siguiente error

Una forma de solucionarlo es agregar una marca de tiempo al nombre del archivo, ya sea dentro del propio procedimiento o pasando un valor a través de un parámetro.