MySQL存储过程与INTO OUTFILE

5
我有一个MySQL存储过程,我想要做两件事情: 1. 查询一个表并将结果返回为普通结果集。 2. 遍历结果集并从存储过程本身创建一个格式化的文本文件。
我查看了INTO OUTFILE,但它似乎会将结果原样写入指定的文件中,而且如果我们使用INTO OUTFILE,则结果集将为空。似乎我们不能同时拥有两者。
这是我的示例存储过程。
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `getdeals`()
BEGIN

select * INTO OUTFILE '/Users/tuser/sql/out.txt' from deals;

END

有什么想法吗? 谢谢 Prem

1
请看我的回答:http://stackoverflow.com/a/21909024/792290 - Abdul Manaf
2个回答

7
假设(举例说明),您的“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要求文件必须重新创建。如果您将文件保留在输出目录中,则在后续的过程调用中,您将收到以下错误:

文件“/path/to/deals.txt”已存在

一种解决方法是,在过程本身内部添加时间戳作为文件名,或通过参数传递值来解决此问题。

我已经得出结论,这个方法是可行的。虽然一开始考虑了重复的 SQL 调用开销,但最终还是决定采用这种方式 :) 谢谢 - Prem Nair

0
DELIMITER $$

SqlCeConnection connection = new SqlCeConnection(conSTR);

string sql = "SELECT * INTO OUTFILE '/Users/tuser/sql/out.txt' FROM deals";
connection.Open();
SqlCeCommand cmd = new SqlCeCommand(sql, connection);
SqlCeDataAdapter da = new SqlCeDataAdapter(cmd);
DataSet ds=new DataSet();
da.Fill(ds);
//datagridview1 is name of datagridview in form:
datagridview1.DataSource=ds.Tables[0];
connection.Close();

这对你可行吗?


我不确定这是否有效。在我的场景中,我正在从Java调用该过程,并且我想在Java中获取结果集并从过程中将结果保存到文件中。基本上,将结果返回到Java层并从存储过程中保存结果到文件。你有什么想法吗? - Prem Nair
那是我最好的建议,抱歉...我已经投了赞成票,希望你能得到更多的建议。 - user3223048
不用客气!谢谢尝试! - Prem Nair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接