El procedimiento no contiene errores sintácticos; lo que sí puede contener son errores de lógica o de comparaciones lógicas.
El SELECT que devuelve cantidades debe considerar que pueda devolver un NULL, y el NULL no es un dato, por lo que los operadores lógicos no funcionan con él. ISNUL() tampoco es funcional en este caso porque como sólo estás buscando un dato no devolverá registros en caso de ser NULL, por lo que no tendrás ningún campo con que usarlo.
Este tipo de dilema se resuelve simplemente con el IS NULL o IS NOT NULL.
Por las dudas, he incluido un IF más con dos condiciones, para cubrir la lógica que pareces querer aplicar:
Código MySQL:
Ver original-- --------------------------------------------------------------------------------
-- Routine DDL
-- --------------------------------------------------------------------------------
DELIMITER $$
OPEN cur1;
UPDATE detalle_tienda_producto
SET cantidad
=cantidad
WHERE producto_id
=b
; INSERT INTO detalle_tienda_producto
(cantidad
,producto_id
,tienda_id
) VALUES (a
,b
,tienda
); INSERT INTO detalle_tienda_producto
(cantidad
,producto_id
,tienda_id
) VALUES (a
,b
,tienda
);
CLOSE cur1;