Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

procedimento armazenado mysql com INTO OUTFILE


Assumindo (por causa do exemplo ) que seus deals mesa parece
---------------------------
| id | deal_date  | deal  |
---------------------------
| 1  | 2014-03-10 | Deal1 |
| 2  | 2014-03-11 | Deal2 |
| 3  | 2014-03-12 | Deal3 |
---------------------------

Agora seu código de procedimento pode parecer
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 ;

Após executá-lo:
CALL get_deals();

No cliente você terá:
---------------------------
| id | deal_date  | deal  |
---------------------------
| 3  | 2014-03-12 | Deal3 |
| 2  | 2014-03-11 | Deal2 |
| 1  | 2014-03-10 | Deal1 |
---------------------------

E o conteúdo do arquivo será:
3,"2014-03-12","Deal3"
2,"2014-03-11","Deal2"
1,"2014-03-10","Deal1"

Observação: ao usar OUTFILE O MySQL requer que o arquivo seja criado novamente . Se você deixar o arquivo no diretório de saída, na chamada de procedimento subsequente, você receberá o seguinte erro

Uma maneira de contornar isso é anexando um carimbo de data/hora ao nome do arquivo dentro do próprio procedimento ou passando um valor por meio de um parâmetro.