powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему производится попытка повторной вставки последней строки курсора?
6 сообщений из 6, страница 1 из 1
Почему производится попытка повторной вставки последней строки курсора?
    #39120549
Здравствуйте!

Есть такой кусок кода внутри хранимой процедуры:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
	DECLARE done INTEGER DEFAULT 0;
	DECLARE products CURSOR FOR 
		SELECT 
			p.virtuemart_product_id
		FROM ytgb1_virtuemart_products p
		WHERE
			p.created_on >= check_date

	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

	OPEN products;

	WHILE done = 0 DO 
		FETCH products 
		INTO vvirtuemart_product_id, v_sku, v_name;
		INSERT INTO bng347_product_ids VALUE(vvirtuemart_product_id);
	END WHILE;
	CLOSE products;


запуск этой процедуры говорит, что в таблицу bng347_product_ids через vvirtuemart_product_id производится попытка вставки не уникального значения, которое добывается из последней строки, выдаваемой вышеприведённым курсором. При этом сам селект курсора возвращает только уникальные virtuemart_product_id. И то, что пытается вставиться дважды, происходит из последней строки, возвращаемой курсором.
Что заставляет последнее значение virtuemart_product_id из курсора записываться дважды в таблицу bng347_product_ids, как это избежать не прибегая к IF NOT(EXISTS(...))?
...
Рейтинг: 0 / 0
Почему производится попытка повторной вставки последней строки курсора?
    #39120628
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркун,

Последний FETCH вместо выборки занимается только тем, что делает done=1.
Но цикл-то прерывается только при следующем заходе, при проверке done = 0.
...
Рейтинг: 0 / 0
Почему производится попытка повторной вставки последней строки курсора?
    #39120634
miksoftПоследний FETCH вместо выборки занимается только тем, что делает done=1.
Спасибо. Есть ли более красивый выход нежели использовать
IF NOT(EXISTS(SELECT virtuemart_product_id FROM bng347_product_ids WHERE virtuemart_product_id = vvirtuemart_product_id)) THEN
INSERT INTO bng347_product_ids VALUE(vvirtuemart_product_id);
END IF;
?
...
Рейтинг: 0 / 0
Почему производится попытка повторной вставки последней строки курсора?
    #39120669
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис ГаркунЕсть ли более красивый выход нежели использовать
Да.

Код: sql
1.
2.
3.
4.
5.
6.
7.
OPEN products;
FETCH products 	INTO vvirtuemart_product_id, v_sku, v_name;

WHILE done = 0 DO 
	INSERT INTO bng347_product_ids VALUE(vvirtuemart_product_id);
	FETCH products INTO vvirtuemart_product_id, v_sku, v_name;
END WHILE;
...
Рейтинг: 0 / 0
Почему производится попытка повторной вставки последней строки курсора?
    #39120675
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не нравится два фетча - делайте на LOOP .. LEAVE LOOP .. END LOOP.
...
Рейтинг: 0 / 0
Почему производится попытка повторной вставки последней строки курсора?
    #39120698
AkinaДа.
Спасибо!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему производится попытка повторной вставки последней строки курсора?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]