Mysql
 sql >> Database >  >> RDS >> Mysql

mysql stored procedure con INTO OUTFILE

Supponendo (per il bene dell'esempio ) che le tue deals la tabella assomiglia a

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

Ora il codice della tua procedura potrebbe apparire

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 ;

Dopo averlo eseguito:

CALL get_deals();

Sul client otterrai:

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

E il contenuto del file sarà:

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

Nota: quando si utilizza OUTFILE MySQL richiede che il file venga creato nuovo . Se lasci il file nella directory di output, alla chiamata della procedura successiva otterrai il seguente errore

Un modo per aggirare il problema è aggiungere un timestamp al nome del file all'interno della procedura stessa o passando un valore tramite un parametro.