2011-05-29 70 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