Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql Stored Procedure mit INTO OUTFILE

Angenommen (für das Beispiel ), die Ihre deals Tabelle sieht aus wie

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

Jetzt könnte Ihr Prozedurcode so aussehen

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 ;

Nach der Ausführung:

CALL get_deals();

Auf dem Client erhalten Sie:

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

Und der Dateiinhalt wird sein:

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

Hinweis: bei Verwendung von OUTFILE MySQL verlangt, dass die Datei neu erstellt wird . Wenn Sie die Datei im Ausgabeverzeichnis belassen, erhalten Sie beim nachfolgenden Prozeduraufruf die folgende Fehlermeldung

Eine Möglichkeit, dies zu umgehen, besteht darin, entweder innerhalb der Prozedur selbst einen Zeitstempel an den Dateinamen anzuhängen oder einen Wert über einen Parameter zu übergeben.