过程mysql无法按预期工作

时间:2011-08-23 04:51:28

标签: php mysql function stored-procedures

$j = new DB();
$j->SetSqlCommnd("DELETE FROM cpd_colaborator_access
           WHERE col_cod = ".$_POST["colaborator"]."");
$j->Exec();



for($i = 0; $i < count($_POST["page"]); $i++) 
{        
     $j = new DB();
     $j->SetSqlCommnd("INSERT INTO cpd_colaborator_access (access_id,col_cod)
                VALUES (".$_POST["page"][$i].",".$_POST["colaborator"].")");
     $j->Exec();  
}

我尝试在下面的程序中表示这个php代码,将数组作为参数“p_pages”和id“p_colaborator”传递;

CREATE DEFINER=`root`@`localhost` PROCEDURE `delegar_paginas`(
IN p_colaborator INT,
IN p_pages INT
)
BEGIN
DECLARE A INT(200);
DECLARE I INT(0);
IF (p_colaborator <> '') THEN
  DELETE FROM cpd_colaborator_access
  WHERE col_cod = p_colaborator;
  WHILE (I<@A) DO  
    IF(p_pages(0,I) <> '')THEN
      INSERT INTO cpd_colaborator_acess (acess_id,col_cod)
      VALUES (p_pages(0,I),p_colaborator);  
    ELSE
      SET I = A;
    END IF;
  END WHILE;
END IF;
END;

我是存储过程的初学者,有人知道这里可能有什么问题吗?

1 个答案:

答案 0 :(得分:0)

我对p_colaborator和p_pages应该是什么数据类型感到困惑 - 你在参数行中将它们声明为INT,但是你将p_colaborator视为一个字符串,p_pages是一个数组(字符串?) ,但它被插入到ID字段中。

MySQL在程序中不支持数组,但有很多解决方法(http://stackoverflow.com/questions/595371/pass-array-into-a-stored-procedure)。

所以,这个程序做了一些假设:

  • p_colaborator是一个字符串(varchar(255))。
  • p_pages是以逗号分隔的数字列表(如'1,2,3,4'所示)。

根据这些假设,这个程序应该可以解决问题:

DROP PROCEDURE delegar_paginas;

DELIMITER //

CREATE PROCEDURE delegar_paginas(IN p_colaborator VARCHAR(255), IN p_pages VARCHAR(255))
BEGIN
IF (p_colaborator <> '') THEN
  DELETE FROM cpd_colaborator_access WHERE col_cod = p_colaborator;
  SET @ins = CONCAT('(', REPLACE(p_pages, ',', CONCAT(', "', p_colaborator, '"), (')), ', ', p_colaborator, ')');
  SET @SQL = CONCAT('INSERT INTO cpd_colaborator_acess (acess_id,col_cod) VALUES ', @ins);
  SELECT @SQL;
  PREPARE stmt FROM @SQL;
  EXECUTE stmt;
END IF;
END;
//

DELIMITER ;