MySQL存储的Prcedure调试输出

时间:2017-07-23 17:27:50

标签: mysql stored-procedures

所以我编写了一个相当简单的MySQL存储过程来从数据库中检索我正在构建的个人应用程序的值。从我能看到的一切,程序应该工作得很好,但它返回错误的结果。

以下是程序代码:

USE randyrip_kdb;
DROP PROCEDURE IF EXISTS spGetAllTracksSong;
DELIMITER //

CREATE PROCEDURE spGetAllTracksSong(IN startRecord INT, IN rowsReturned INT, IN searchArtist VARCHAR(255), IN searchTitle VARCHAR(244), IN orderBy VARCHAR(20), IN duets TINYINT(1))
BEGIN
    DECLARE spStart INT;
    DECLARE spRows INT;
    DECLARE whereClause VARCHAR(255) DEFAULT '';
    DECLARE whereArtist VARCHAR(255) DEFAULT '';
    DECLARE whereSong VARCHAR(255) DEFAULT '';
    DECLARE outputSQL VARCHAR(1000) DEFAULT '';


    SET spStart=startRecord;
    SET spRows=rowsReturned;
    IF searchArtist!='' THEN SET whereArtist= CONCAT('artist LIKE \'%',searchArtist,'%\' '); END IF;

    IF searchTitle!='' THEN SET whereSong= CONCAT('song_title LIKE \'%',searchTitle,'%\' '); END IF;

    IF whereArtist != '' && whereSong !='' THEN SET whereClause=CONCAT('WHERE ', whereArtist,'AND ',whereSong);
    ELSEIF whereArtist !='' THEN SET whereClause= CONCAT('WHERE',whereArtist);
    ELSE SET whereClause = CONCAT('WHERE',whereSong);
    END IF;

    IF duets=1 && whereClause !='' THEN SET whereClause=CONCAT(whereClause,' AND is_duet=1');
    END IF;

    SET orderBy = IFNULL(orderBy, 'song_title');
    IF orderBy='date' THEN SET orderBy='date_added DESC'; END IF;
    /*select whereClause;
    select orderBy;
    select startRecord;
    select rowsReturned;*/
    SET outputSQL=CONCAT('SELECT song_title, artist, comments, disc_number FROM track ', whereClause,'ORDER BY ' ,orderBy,' LIMIT ' ,spStart,',',spRows);
    SELECT outputSQL;

    SELECT song_title, artist, comments, disc_number FROM track whereClause ORDER BY orderBy LIMIT spStart,spRows;

END//
DELIMITER ;

我用这些参数调用存储过程:

call spGetAllTracksSong(0,20,'elvis costello','peace, love','date',0);

变量outputSQL正确生成我想要的查询,当我运行它时,它按预期返回两行。但是,过程本身返回20行,其中没有一行符合条件。

如果有人对我正在做错的事情有任何想法,那就太好了。从我能看到的一切来看,一切都应该没问题。

1 个答案:

答案 0 :(得分:1)

兰迪, 如果在SQL查询中使用变量(如“FROM track whereClause”),则需要使用EXECUTE执行,否则不会对其进行求值。用这个替换你的最后一个选择:

set @sql = outputSQL;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt; 

或者,您可以尝试不使用动态SQL。