2014-02-20 6 views
1

Я пытаюсь преобразовать следующий триггер из PL/SQL в MySQLPL/SQL синтаксис MySQL синтаксис

Особенно я хочу знать, как это сделать:

1. FOR quantity in 1..:new.product_quantity 
2. FOR row IN() 

.

create or replace trigger "TRG_INSERT_BILL_PRODUCTS" 
after insert on Bill_Products 
for each row 
begin 
    FOR quantity in 1..:new.product_quantity 
    LOOP 
     FOR row IN (
      SELECT pa.article_id,pa.consist_quantity 
      FROM product_articles pa 
      WHERE pa.product_id=:new.product_id) 
     LOOP 
      update store 
      set store_quantity=store_quantity-row.consist_quantity 
      where article_id=row.article_id; 
     END LOOP; 
    END LOOP; 
END; 

Объяснения триггера: магазин таблицы store.article_id и store.store_quantity для этой таблицы статьи Product_articles имеет pa.product_id, pa.article_id (статья, которая соответствует в продукте), pa.consist_quantity (статьи)

Итак, после вставки продукта в счет, я хочу найти все его состоящие статьи и опустить store.store_quantity для этого store.article_id, который будет product_quantity (сколько продуктов из них было добавлено в счет) * consist_quantity (этой статьи в продукте)

ответ

2

ДЛЯ количество в 1 ..: new.product_quantity

MySql не имеет цикл.
Вы можете эмулировать его, используя цикл WHILE:

Set quantity = 1 
WHILE quantity <= :new.product_quantity DO 
    ..... 
    statement_list 
    ..... 
    Set quantity = quantity + 1 
END WHILE 



для строки IN (запрос) LOOP ...

MySql не поддерживает этот вид цикл, вы должны объявить курсор и обработать его:

DECLARE cursor_name CURSOR FOR 
    SELECT pa.article_id,pa.consist_quantity 
      FROM product_articles pa 
      WHERE pa.product_id=:new.product_id; 

также объявить обработчик продолжения для этого курсора, затем явно открыть курсор, извлечь строки из него в цикле и закрыть его.
Обратитесь к документации: http://dev.mysql.com/doc/refman/5.6/en/cursors.html
, чтобы узнать, как использовать MySql-курсоры с примерами.

+0

спасибо! – jovanMeshkov

Смежные вопросы