2013-10-30 173 views
0

我試圖讓它像那樣,但它只返回單行。 第一次選擇後,程序退出。什麼是創建計數的MySQL程序的正確方法?

DROP PROCEDURE IF EXISTS testProc; 
DELIMITER $$ 
    CREATE PROCEDURE testProc(start_stamp INT, end_stamp INT, step INT) 
    BEGIN 
     DECLARE tmpStep INT; 
     SET tmpStep = start_stamp; 
     WHILE tmpStep < end_stamp DO 
      SELECT tmpStep; 
      SET tmpStep = tmpStep + step; 
     END WHILE; 
    END$$ 
DELIMITER ; 

CALL testProc (1,10,1); 

期望的行爲是在這種情況下將數字從1返回到10。

+1

在我的最後工作正常,但你將它們作爲單獨的結果集返回。你如何執行此代碼?從連接器或使用命令行工具? –

+0

@MatsKindahl你是對的,連接器只返回第一個選擇。我如何將所有結果作爲單個結果集返回? –

+0

它在連接器之間有所不同。對於C API,您可以使用'mysql_more_results'和'mysql_next_result'遍歷結果集(http://dev.mysql.com/doc/refman/5.5/en/c-api-multiple-queries.html)。 –

回答

1

要創建一個返回動態生成結果集的過程,必須在內部創建一個臨時表,然後選擇它。下面的代碼應該爲你做的工作:

DROP PROCEDURE IF EXISTS testProc; 
DELIMITER $$ 
CREATE PROCEDURE testProc(start_stamp INT, end_stamp INT, step INT) 
BEGIN 
    DECLARE tmpStep INT; 
    DROP TABLE IF EXISTS `testProc$tmp`; 
    CREATE TEMPORARY TABLE `testProc$tmp` (a INT); 
    SET tmpStep = start_stamp; 
    WHILE tmpStep < end_stamp DO 
     INSERT INTO `testProc$tmp` VALUES(tmpStep); 
     SET tmpStep = tmpStep + step; 
    END WHILE; 
    SELECT * FROM `testProc$tmp`; 
END$$ 
DELIMITER ; 

CALL testProc (1,10,1); 

注意,該代碼將離開臨時表中的函數調用後四處張望,但名字創建的,是「晦澀」,使其不發生衝突一些其他表。

+0

非常感謝您的建議,但是這個過程必須在多用戶環境中同時調用,併爲每個用戶產生有意義的結果,因此共享同一個臨時表不是一種選擇。 –

+0

每個臨時表都是特定於連接的,所以如果您使用不同的連接,則沒有問題。換句話說,一個連接上的臨時表'foo'與另一個連接上的臨時表'foo'不同。 –

相關問題