2012-02-24 125 views
1

我有一個名爲的存儲過程Evaluate(something1,something2); 評估將採取一些參數,在數據庫中搜索它們並將結果插入結果表中。MySQL如何循環存儲過程?

現在我想創建一些類型的存儲過程,它將不斷調用Evaluate遍歷整個逗號分隔文件。這可能嗎?

僞代碼

assessEntireFile() 
{ 
    loop file 
    Evaluate(single line from file) 
    end loop 
} 



**The work flow of assessEntireFile() will be as followed:** 
1. call assessEntireFile() 
    --assessEntireFile will load and iterate over an input file (line-by-line) 
2. each iteration will call Evaluate() on that line 
    --evualte() will produce results in a table 
3. complete 
+0

使用while循環遍歷表就夠了嗎?您可以在...之前將'LOAD DATA'文件... – 2012-02-24 17:47:32

回答

1
DELIMITER $$ 

CREATE PROCEDURE assessEntireTable() 
    READS SQL DATA 
BEGIN 

-- Declare variables according to your table/file structure 
    DECLARE field1 int DEFAULT 0; 
    DECLARE field2 VARCHAR(250) CHARACTER SET utf8; 
-- /Declare variables according to your table/file structure 

    DECLARE done int DEFAULT 0; 
    DECLARE currentrow CURSOR FOR SELECT * FROM assessEntireFileTmp; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; 

    OPEN currentrow; 
-- Adapt next line according to your table/file structure 
    FETCH currentrow INTO field1,field2, ... ; 
    WHILE done=0 DO 
-- Adapt next 2 lines according to your table/file structure 
    CALL Evaluate(field1, field2, ...); 
    FETCH currentrow INTO field1,field2, ... ; 
    END WHILE; 
END $$ 

CREATE PROCEDURE assessEntireFile() 
BEGIN 
    DROP TABLE IF EXISTS assessEntireFileTmp; 
    CREATE TABLE assessEntireFileTmp (

-- Your needed structure here 

); 
    LOAD DATA INFILE '<file_name>' 
    INTO TABLE assessEntireFileTmp 
-- More needed parameters here 
    ; 

    CALL assessEntireTable(); 

    DROP TABLE assessEntireFileTmp; 
END $$ 

DELIMITER ; 
+0

這就是我一直在尋找的東西。謝謝。儘管此腳本需要多次調用。如果我在這個遊標中聲明瞭assessmentEntireFile,那麼下一次我希望使用這個權利時,我需要刪除它嗎? – stackoverflow 2012-02-24 18:07:00

+0

您調用第二個過程'assessEntireFile()',它將負責創建和刪除臨時表並根據需要調用「assessEntireTable()」。所以只要這不同時運行,你就很安全。 – 2012-02-24 18:10:37