Mysql
 sql >> Base de données >  >> RDS >> Mysql

procédure stockée mysql avec INTO OUTFILE

En supposant (pour les besoins de l'exemple ) que votre deals le tableau ressemble

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

Maintenant, votre code de procédure pourrait ressembler

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 ;

Après l'avoir exécuté :

CALL get_deals();

Sur le client, vous obtiendrez :

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

Et le contenu du fichier sera :

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

Remarque : lors de l'utilisation de OUTFILE MySQL exige que le fichier soit créé à nouveau . Si vous laissez le fichier dans le répertoire de sortie, lors de l'appel de procédure suivant, vous obtiendrez l'erreur suivante

Une façon de contourner ce problème consiste à ajouter un horodatage au nom de fichier, soit dans la procédure elle-même, soit en passant une valeur via un paramètre.