sql >> データベース >  >> RDS >> Mysql

INTOOUTFILEを使用したmysqlストアドプロシージャ

    仮定(例のために )あなたのdeals テーブルは次のようになります

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

    これで、プロシージャコードは次のようになります

    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 ;
    

    実行後:

    CALL get_deals();
    

    クライアントでは次のようになります:

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

    そして、ファイルの内容は次のようになります:

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

    注: OUTFILEを使用する場合 MySQLでは、ファイルを新たに作成する必要があります 。ファイルを出力ディレクトリに残しておくと、後続のプロシージャ呼び出しで次のエラーが発生します

    これを回避する1つの方法は、プロシージャ自体の内部でファイル名にタイムスタンプを追加するか、パラメータを介して値を渡すことです。



    1. MySQL外部キー制約、カスケード削除

    2. Spring + Hibernate:クエリプランのキャッシュメモリ使用量

    3. MySQL接続はnull参照をスローします

    4. MySQLの日付比較機能