Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql从[function argument]和游标准备stmt_Mysql_Loops_Cursor_Prepare - Fatal编程技术网

MySql从[function argument]和游标准备stmt

MySql从[function argument]和游标准备stmt,mysql,loops,cursor,prepare,Mysql,Loops,Cursor,Prepare,我有一个MySql函数,它接受3个参数。最后一个参数是查询本身,我可以使用PREPARE(?)执行它,至少在它没有多个结果的情况下是这样。我想循环检查从准备好的语句返回的所有结果 我该怎么做?我想用游标,但我能找到的是,在准备好的变量语句上使用游标是不可能的 我希望实现以下目标: 1.我在我的申请中有一个结果视图。结果将被分页。 2.我想搜索一个特定的行,找到它所属的页面,然后把它放到视图中。 3.结果视图可以通过多种方式进行过滤和排序,因此MySql函数的第三个参数是结果视图填充的查询 希望我

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

我该怎么做?我想用游标,但我能找到的是,在准备好的变量语句上使用游标是不可能的

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

希望我能说清楚,否则让我知道

到目前为止,我有以下几点: 分隔符$$#否则不能使用分号结束行

/*
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

提前感谢。

将结果放入临时表格:

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

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

这似乎不太难,谢谢@Mikedklerk:也就是说,如果一个人不能用一种比在所有结果上迭代光标更简单/更好/更有效/更安全的方式来识别cow的页面,我会感到惊讶。是的,这当然是可能的,对结果进行排序会更容易。这是一天的结束,我想我已经累得想不清楚了,我把我的头深深地埋在MySql函数中,而不是朝着我的目标。。。。