2011-05-29 142 views
3

我試圖重寫我的代碼搜索從PHP到MySQL存儲過程的文本中的關鍵字,因爲PHP的memory_limit太低,我在共享主機,所以我無法更改內存限制。如何將結果添加到MySQL存儲過程的結果集?

我需要的代碼是這樣(AHO-corasick算法):

for every char ch in text do 
    do some transitions 
    if there is a result for a given state add it to the output (output is position of word in text and keyword) 

我不想讓別人寫的程序,但我想知道是否有可能追加結果我用上面的僞代碼寫下來。

注:我閱讀文檔:http://www.peregrinesalon.com/wp-content/uploads/2009/03/mysql-stored-procedures.pdf和週期是易於編程,條件也很簡單,狀態之間的轉換可能是緩慢的,但它似乎還是可以的。

感謝您的回答!

回答

7

在SP中,您可以在臨時表中創建結果集,然後在退出之前對其進行操作。然後調用程序可以從那裏選擇它想要的。一旦MySQL會話關閉,臨時表也將被清除。

(EDIT) http://dev.mysql.com/tech-resources/articles/mysql-storedprocedures.html

CREATE PROCEDURE procedure1 
BEGIN 
-- create 'results' table 
    CREATE TEMPORARY TABLE OUT_TEMP(val0 varchar(20), val1 int); 

    DECLARE done INT DEFAULT 0; 
    DECLARE a CHAR(16); 
    DECLARE b INT; 
    DECLARE cur1 CURSOR FOR SELECT val0, val1 FROM <another table>; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

--open table to read from 
    OPEN cur1; 

    read_loop: LOOP 
    FETCH cur1 INTO a, b; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
    IF <some condition> THEN 
     INSERT INTO OUT_TEMP VALUES (a,b); 
    ELSE 
    -- insert something else 
     INSERT INTO OUT_TEMP VALUES (a,b + 10); 
    END IF; 
END LOOP; 

CLOSE cur1; 

-- output results 
SELECT * FROM OUT_TEMP; 
DROP TEMPORARY TABLE OUT_TEMP; 
END 
+0

謝謝!你可以提供一個鏈接進一步的細節? – 2011-05-29 13:23:41

+0

參見內聯 - 編輯包含(未測試)示例+鏈接 – ethrbunny 2011-05-29 13:51:48

+0

這裏有一個小的觀察。我有用於創建臨時表的語法錯誤。由於臨時表正在declare語句的頂部創建。它說的語法錯誤。有趣的是,我在創建遊標之後放置了create語句,並且它完美地工作。我不知道可能是什麼問題。 – Kiran 2017-09-08 13:03:10