2013-01-21 11 views
0

我有一個MySql函數,它有3個參數。最後一個參數是一個查詢本身,我可以用PREPARE(?)執行,至少如果它沒有多個結果。我想遍歷從PREPARED語句返回的所有結果。MySql PREPARE stmt FROM [函數參數]和遊標

我該怎麼做?我正在考慮一個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 

在此先感謝。

回答

2

把結果放到一個臨時表:

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

然後一個可以遍歷一個光標放在臨時表的內容。

+0

這似乎並不難,謝謝! –

+0

@MikedeKlerk:這就是說,如果人們不能以比所有結果迭代遊標更簡單/更好/更有效/更安全的方式識別牛的頁面,我會感到驚訝。 – eggyal

+0

是的,它確實是可能的,排名結果更容易。這是一天結束時,我想我會累得直搗,並深入MySql函數,而不是朝着我的目標邁進.... –

相關問題