我正在尝试编写一个函数来返回对存储过程的调用将返回的行数。我正在努力减少代码的重复(为了减少代码维护/调试 - 程序选择很长)。
只读存储过程选择符合特定条件的行(我知道含糊不清,但细节不应该是问题的主要内容)。
我可以将过程复制到一个函数中并将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(如果相关)
一如既往,任何帮助都非常感激。
答案 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 CACHE
或FLUSH QUERY CACHE
没有帮助(无论如何可能是一个坏主意/坏编码)。