3

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

存储过程只是只读选择符合某些条件的行(我知道模糊,但细节不应该对问题很重要)。

我可以将过程复制到一个函数中并将 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(如果相关)

与往常一样,非常感谢任何帮助。

4

3 回答 3

0

无法从函数返回结果集

SELECT当在过程中完成查询而不存储输出值时,会发生此错误。其他事情:不要忘记使用SQL_CALC_FOUND_ROWSto 指示您的 DBMS 来存储找到的行数。

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

    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

于 2013-05-21T13:17:24.357 回答
0

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

select count(distinct column_name) from table_name

于 2013-05-21T07:51:10.637 回答
0

看来这是不可能的。SELECT INTO为了避免cannot return a result set from a function函数调用期间的错误,选择语句是必需的。如果在过程中使用的语句中这是不可能的或不需要的,SELECT则该函数将不会运行而不会出现错误。

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

于 2013-05-22T11:13:20.820 回答