我正在开发Sql Developper,我在包中创建了以下过程:
PROCEDURE VALIDER(a_session IN NUMBER) AS
i NUMBER;
TYPE type_tab IS TABLE OF PANIER%ROWTYPE;
tabSeances type_tab;
BEGIN
SELECT * BULK COLLECT INTO tabSeances
FROM PANIER
WHERE a_session = sessionweb;
i:=0;
FOR i IN 1 .. tabSeances.count LOOP
-- UPADTE DU NOMBRE DE PLACES LIBRES
BEGIN
UPDATE PROJECTION
SET remaining_seats = (remaining_seats - tabseances(i).nbrplaces)
WHERE num_copy = tabseances(i).num_copy
AND day = tabseances(i).dateseance
AND time_slot = tabseances(i).time_slot
AND movie = tabseances(i).movie;
COMMIT;
--UPDATE ON PANIER
UPDATE PANIER
SET valide = 1
WHERE sessionweb = a_session
AND num_copy = tabseances(i).num_copy
AND dateseance = tabseances(i).dateseance
AND time_slot = tabseances(i).time_slot
AND movie = tabseances(i).movie;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN raise_application_error(-20035, 'Pas de données');
WHEN OTHERS THEN raise_application_error(-20006,'Autres Erreurs');
END;
END LOOP;
END VALIDER;
该过程正常执行,我没有收到错误。
我有一种产品推车:"PANIER"。我为一个人(会话)循环此购物车中的所有条目,以在数据库中验证它们并减少席位总数。
但是第一次更新中的字段"剩余席位"(来自投影)不起作用。该字段不会更新。我已经尝试过其他值,但没有。
我确定该过程已执行td,因为第二次更新仍然有效。它将购物车条目标记为"已确认"。
我在这个字段上没有任何触发器。
我的表包含有效数据 (<>NULL)。
我像这样执行此过程(在 BEGIN END 中;块):
CMDPLACES.VALIDER(1);
感谢您的回复。
第一次更新是day
还是dateseance
?
UPDATE PROJECTION
SET remaining_seats = (remaining_seats - tabseances(i).nbrplaces)
WHERE num_copy = tabseances(i).num_copy
AND dateseance = tabseances(i).dateseance
AND time_slot = tabseances(i).time_slot
AND movie = tabseances(i).movie;
另外,正如@ThorstenKettner所提到的,日期中的时间戳数据在比较时可能会失败,因此我们使用TRUNC()
TRUNCATE
时间戳数据[如果需要]!
如果日期列已编制索引,请注意数据库不会使用该索引。
要处理 UPDATE
中的 NO 数据,您可以检查(SQL%ROWCOUNT > 0)
以确定更新的行数!
您的第一次更新比较天数。这些是什么数据类型?如果您处理 DATETIME,请确保在没有时间部分(如果有)的情况下进行比较。使用 TRUNC 来实现此目的。
AND TRUNC(day) = TRUNC(tabseances(i).dateseance)