Mysql函数从过程调用返回行计数

时间:2013-05-21 07:46:54

标签: mysql function count procedure

我正在尝试编写一个函数来返回对存储过程的调用将返回的行数。我正在努力减少代码的重复(为了减少代码维护/调试 - 程序选择很长)。

只读存储过程选择符合特定条件的行(我知道含糊不清,但细节不应该是问题的主要内容)。

我可以将过程复制到一个函数中并将select更改为count()但由于多个连接很长,我希望编写一个可以调用过程并返回行数的函数。目标不是为了优化运行,而是为了有效的代码维护,减少锅炉板。

我试过这个作为测试:


DELIMITER //

CREATE PROCEDURE IF NOT EXISTS proc_select1()
BEGIN
    SELECT 1;
END //

CREATE FUNCTION IF NOT EXISTS select1_count() RETURNS INT UNSIGNED
BEGIN
    CALL proc_select1();
    RETURN FOUND_ROWS();
END //

DELIMITER ;

然而,当我SELECT select1_count(); - 我希望它将返回1时 - 我得到“无法从函数返回结果集”错误。

我尝试将FOUND_ROWS分配给变量,清除结果集然后返回变量值但无法使其起作用。

是否有人知道某项工作或我是否真的需要复制粘贴程序并转换为SELECT COUNT和函数?

我正在使用MySQL 5.5.16(如果需要可以升级),Windows 7(似乎没有人想升级:)使用HeidiSQLv7.0.0.4053(如果相关)

一如既往,任何帮助都非常感激。

3 个答案:

答案 0 :(得分:0)

首先使用distinct来获取不同的值然后使用count on that..like

select count(distinct column_name) from table_name

答案 1 :(得分:0)

  

无法从函数

返回结果集

如果在过程中完成SELECT查询而未存储输出值,则会发生此错误。 其他事项:不要忘记使用SQL_CALC_FOUND_ROWS来指示您的DBMS存储已找到的行数。

我试图让它在没有任何临时变量的情况下工作(也许存在一个mysql关键字,不能“返回”SELECT查询的集合),但没有成功。这是一段使用临时var。

工作的代码
    CREATE PROCEDURE  proc_select1()
BEGIN
    DECLARE temp INT;
    SELECT SQL_CALC_FOUND_ROWS 1 INTO temp;   
END //

CREATE FUNCTION select1_count() RETURNS INT UNSIGNED
BEGIN
    CALL proc_select1();
    RETURN FOUND_ROWS();
END //

结果是预期的1 :-) cf:SQLFiddle

答案 2 :(得分:0)

看来这是不可能的。 select SELECT INTO需要select语句以避免函数调用期间出现cannot return a result set from a function错误。如果在过程中使用的SELECT语句中不可能或不需要这样做,则该函数将无法正常运行。

在程序调用后使用CLEAR QUERY CACHEFLUSH QUERY CACHE没有帮助(无论如何可能是一个坏主意/坏编码)。