PDOを使用して、DROP TABLEIFEXISTSで始まるストアドプロシージャを呼び出しています。PDOException'SQLSTATE [42S02]がランダムに発生します:ベーステーブルまたはビューが見つかりません:1146テーブル' historygr.reached'が存在しません'そしてさらに厄介なことに、それを通知することから、テーブルは、同じ接続からのように見えますが、互いに数秒以内にすでに存在しています。
自分でエラーをトリガーすることはできませんが、エラー通知を受け取ります。
エラーの原因となったPHPは次のとおりです。
$dbh = PDODB::getInstance();
$stmt = $dbh->query("CALL ListReached(".$this->item_id.")"); // <-- ERROR
$items = $stmt->fetchAll();
そして、これがMySQLプロシージャの定義です。
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `ListReached`( IN root INT)
BEGIN
DECLARE rows SMALLINT DEFAULT 0;
DROP TABLE IF EXISTS reached;
CREATE TABLE reached(
node_id INT PRIMARY KEY
) ENGINE=HEAP;
INSERT INTO reached VALUES (root);
SET rows = ROW_COUNT();
WHILE rows > 0 DO
INSERT IGNORE INTO reached
SELECT DISTINCT child_id
FROM related_item AS r
INNER JOIN reached AS p ON r.parent_id = p.node_id;
SET rows = ROW_COUNT();
INSERT IGNORE INTO reached
SELECT DISTINCT parent_id
FROM related_item AS r
INNER JOIN reached AS p ON r.child_id = p.node_id;
SET rows = rows + ROW_COUNT();
END WHILE;
DELETE FROM reached WHERE node_id = root;
SELECT * FROM reached;
DROP TABLE reached;
END