【问题标题】:MySql PREPARE stmt FROM [function argument] and CURSORsMySql PREPARE stmt FROM [function argument] 和 CURSORs
【发布时间】:2013-01-04 14:37:03
【问题描述】:

我有一个 MySql 函数,它接受 3 个参数。最后一个参数是一个查询本身,我可以使用 PREPARE(?) 执行它,至少在它没有多个结果的情况下是这样。我想遍历 PREPARED 语句返回的所有结果。

我该怎么做?我在想一个 CURSOR,但我只能发现不可能在 PREPARED 变量语句上使用 CURSOR。

我想要实现的目标如下: 1. 我在我的申请中查看了结果。结果是分页的。 2. 我想搜索一个特定的行,找到它所属的页面,并把它放到视图中。 3. 结果视图可以通过多种方式进行过滤和排序,因此MySql函数的第三个参数是填充结果视图的查询。

希望我说清楚了,否则请告诉我。

到目前为止,我有以下内容: DELIMITER $$ # 否则不能使用分号结束一行

/*
The bar graph (clsBarGraph) shows cows in pages.
If you wish to search for a page with a certain Cow ID you need to do alot of things.
Therefore this function is created, to do the heavy lifting all in the database engine.accessible
@param LongCowID The long cow ID of the cow you wish to get the page for
@param ItemsPerPage To determine on what page a cow comes, it is necessary to known how many cows will fit into a page
@param SelectQuery The query that was used to view the data in the BarGraph. This determines ordering, which cows to have in the resultset to limit on, etc.
        This should be without the limit
@return The page number to set the view to, or -1 if the cow does not exist.
*/
CREATE FUNCTION `GetPageForCowID`(LongCowID INT, ItemsPerPage INT, SelectQuery VARCHAR(255))
RETURNS INT
BEGIN
DECLARE `page` INT;

/* Prepares queries to execute */
PREPARE stmt_CheckIfCowExists FROM 'SELECT COUNT(`Long_Cow_ID`) as `rows` FROM `cow_data` INTO @NumberOfRows';
EXECUTE stmt_CheckIfCowExists;
IF @NumberOfRows = 1 THEN 
    /* The cow does nto exist */
    SET `page` = -1;
ELSE
    /* The cow does exist */
    /* Get all the cows used in the view of the data, without a limit and put it into a variable */
    SET @SelectQuery = CONCAT(@SelectQuery, ' INTO @CowsForDataView');
    PREPARE stmt_SelectDataForView FROM @SelectQuery;
    EXECUTE stmt_SelectDataForView;
    SELECT COUNT(*) FROM stmt_SelectDataForView;

    DEALLOCATE PREPARE stmt_SelectDataForView;
END if;

/* Clean Up */
deallocate PREPARE stmt_CheckIfCowExists;
return `page`;
END

提前致谢。

【问题讨论】:

    标签: mysql loops cursor prepare


    【解决方案1】:

    将结果放入临时表中:

    SET @sql := CONCAT('CREATE TEMPORARY TABLE tmp_GetPageForCowID ', SelectQuery);
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    然后可以在临时表的内容上迭代游标。

    【讨论】:

    • 这似乎不太难,谢谢!
    • @MikedeKlerk:也就是说,如果不能以一种比在所有结果上迭代光标更简单/更好/更高效/更安全的方式识别奶牛的页面,我会感到惊讶。
    • 是的,这确实是可能的,对结果进行排名更容易。一天结束了,我想我已经累得无法直截了当,把我的头深入到 MySql 函数中,而不是朝着我的目标前进....
    猜你喜欢
    • 1970-01-01
    • 2020-10-15
    • 2018-08-21
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2022-08-12
    • 2021-03-02
    • 2018-03-19
    相关资源
    最近更新 更多