Oracle UPDATE 不起作用



我正在开发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)

相关内容

最新更新