2017-02-02 7 views
0

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

drop FUNCTION SP_PROSES_STOCK(noresep bigint, p_post_cd varchar); 
CREATE or replace FUNCTION SP_PROSES_STOCK(noresep bigint, p_post_cd varchar) 
RETURNS void 
LANGUAGE plpgsql 
as $function$ 
DECLARE cursorData refcursor; 
    v_item_cd varchar; 
    v_quantity numeric; 

begin 

open cursorData FOR 
select A.item_cd, A.quantity from trx_medical_resep B 
inner join trx_resep_data A on A.medical_resep_seqno = B.medical_resep_seqno 
where B.medical_resep_seqno = noresep; 
fetch next from cursorData into v_item_cd,v_quantity; 
while (found) 
loop 
    update inv_pos_item set quantity = quantity - v_quantity 
    where item_cd = v_item_cd and pos_cd = p_post_cd; 
end loop; 
close cursorData; 

END 
$function$ 

ответ

0

Я мопсую вашу функцию, чтобы сделать ее короче и использовать FOR. Также я добавляю RAISE NOTICE для отладки. Вы можете попробовать:

CREATE or replace FUNCTION SP_PROSES_STOCK(noresep bigint, p_post_cd varchar) 
RETURNS void 
LANGUAGE plpgsql 
as $function$ 
DECLARE v_cursor record; 

BEGIN 

    FOR v_cursor IN 
     SELECT A.item_cd, 
       A.quantity 
     FROM trx_medical_resep B 
     JOIN trx_resep_data A ON A.medical_resep_seqno = B.medical_resep_seqno 
     WHERE B.medical_resep_seqno = noresep 
    LOOP 
     RAISE NOTICE 'Changes for %', v_curosr; 
     UPDATE inv_pos_item 
      SET quantity = quantity - v_cursor.quantity 
     WHERE item_cd = v_cursor.item_cd 
      AND pos_cd = p_post_cd; 
    END LOOP; 
END 
$function$ 

После отладки вы можете удалить УВЕДОМЛЕНИЕ УВЕДОМЛЕНИЯ.

+0

ок спасибо я постараюсь это – damard

0

Для этого вам не нужна петля. Один оператор UPDATE будет намного быстрее:

CREATE or replace FUNCTION SP_PROSES_STOCK(noresep bigint, p_post_cd varchar) 
    RETURNS void 
as 
$function$ 
begin 

    update inv_pos_item 
    set quantity = quantity - v.quantity 
    from (
    select A.item_cd, A.quantity 
    from trx_medical_resep B 
     join trx_resep_data A on A.medical_resep_seqno = B.medical_resep_seqno 
    where B.medical_resep_seqno = noresep 
) v 
    where item_cd = v.item_cd and pos_cd = p_post_cd; 

END; 
$function$ 
LANGUAGE plpgsql; 
+0

спасибо всем, есть ошибка в данных на моей базе данных, есть добавление строки \ г, я не знаю, как это может случиться, я использую dbeaver для ввода образца данных – damard