Pre*_*air 5 mysql stored-procedures
我有一个 mysql 存储过程,我想做两件事 1. 查询表并将结果作为正常结果集返回。2. 遍历结果集并从过程本身创建一个格式化的文本文件。
我查看了 INTO OUTFILE,但似乎 INTO OUTFILE 将结果原始写入指定的文件,而且如果我们使用 INTO OUTFILE 结果集将为空。看来我们不能两者兼得。
这是我的示例 SP
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `getdeals`()
BEGIN
select * INTO OUTFILE '/Users/tuser/sql/out.txt' from deals;
END
Run Code Online (Sandbox Code Playgroud)
有什么想法吗 ?谢谢Prem
假设(为了这个例子)你的deals表看起来像
--------------------------- | 身份证 | 交易日期 | 交易| --------------------------- | 1 | 2014-03-10 | 交易 1 | | 2 | 2014-03-11 | 交易2 | | 3 | 2014-03-12 | 交易3 | ---------------------------
现在你的过程代码可能看起来
--------------------------- | 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 ;
Run Code Online (Sandbox Code Playgroud)
在客户端你会得到:
--------------------------- | 身份证 | 交易日期 | 交易| --------------------------- | 3 | 2014-03-12 | 交易3 | | 2 | 2014-03-11 | 交易2 | | 1 | 2014-03-10 | 交易 1 | ---------------------------
文件内容将是:
3,"2014-03-12","Deal3" 2,"2014-03-11","Deal2" 1,"2014-03-10","交易1"
注意:使用OUTFILEMySQL 时需要重新创建文件。如果将文件保留在输出目录中,则在后续过程调用中,您将收到以下错误
文件“/path/to/deals.txt”已经存在
解决此问题的一种方法是在过程本身内或通过参数传递值将时间戳附加到文件名。
| 归档时间: |
|
| 查看次数: |
16633 次 |
| 最近记录: |