$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;
我是存储过程的初学者,有人知道这里可能有什么问题吗?
答案 0 :(得分:0)
我对p_colaborator和p_pages应该是什么数据类型感到困惑 - 你在参数行中将它们声明为INT,但是你将p_colaborator视为一个字符串,p_pages是一个数组(字符串?) ,但它被插入到ID字段中。
MySQL在程序中不支持数组,但有很多解决方法(http://stackoverflow.com/questions/595371/pass-array-into-a-stored-procedure)。
所以,这个程序做了一些假设:
根据这些假设,这个程序应该可以解决问题:
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 ;