Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: странно работает FETCH ... INTO в процедуре
 
 автор: dvorkot   (22.04.2013 в 17:11)   письмо автору
 
 

хочу извлечь записи из одной таблицы и вставить их в другую, однако такое ощущение что при каждой итерации курсор не сдигается и извлекает одну и ту же запись, в результате получаю на выходе таблицу с одинаковыми строками, различающимися только ID

Помогите, пожалуйста, разобраться

UPD: проблема решена, процедура заменена на insert ... on duplicate key update

Код процедуры:


BEGIN

DECLARE vId INT(24);
DECLARE vParentId INT(24);
DECLARE vName VARCHAR(255);
DECLARE vRetail INT(24);
DECLARE vUnit VARCHAR(50);
DECLARE vBalance INT(11);

DECLARE resultCount INT DEFAULT 0;

DECLARE a INT DEFAULT 0;
DECLARE cur_temp CURSOR FOR SELECT `id`, `parent_id`, `name`, `retail`, `unit`, `balance` FROM `catalog_items_temp` WHERE 1;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET a = 1;

UPDATE `catalog_items` SET `is_delete` = 1;

OPEN cur_temp;

WHILE 0 = a DO
    FETCH cur_temp INTO vId, vParentId, vName, vRetail, vUnit, vBalance;
    SELECT COUNT(*) INTO resultCount FROM `catalog_items` WHERE `id` = vId;
    IF 1 = resultCount THEN
        UPDATE `catalog_items` SET `parent_id` = vParentId, `name` = vName, `retail` = vRetail, `unit` = vUnit, `balance` = vBalance WHERE `id` = id;
    ELSE
        INSERT INTO `catalog_items` (`id`, `parent_id`, `name`, `retail`, `unit`, `balance`) VALUES (vId, vParentId, vName, vRetail, vUnit, vBalance);
    END IF;
END WHILE;

CLOSE cur_temp;
END

  Ответить  
 
 автор: cheops   (22.04.2013 в 21:27)   письмо автору
 
   для: dvorkot   (22.04.2013 в 17:11)
 

А не проще воспользоваться оператором INSERT INTO ... SELECT ... ? Все-таки курсоры в SQL это последние средство, когда уже других возможностей не остается, так как это фактически цикл, низкоуровневая операция оперирующая записями, а не множествами.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования