Hola amigos.
En un sistema de ventas he diseñado un procedimiento almacenado que actualiza las ventas y ademas intenta capturar un error de lock_conflict o cualquier otro a traves de la variable flag.
Esta es la rutina:
Código SQL
[-]
SET TERM ^;
CREATE PROCEDURE ACTUALIZA_VALESDETALLE(
VID_VALE VARCHAR(12),
VID_PRODUCTO VARCHAR(12),
VCANTIDAD DECIMAL(7,2),
VDESCRIPCION VARCHAR(40),
VVALORUNITARIO NUMERIC,
VTOTAL NUMERIC)
RETURNS (
FLAG SMALLINT)
AS
DECLARE VARIABLE V_STOCK DECIMAL(7,2);
BEGIN
INSERT INTO VALESDETALLE
(
ID_VALE,
ID_PRODUCTO,
CANTIDAD,
DESCRIPCION,
VALORUNITARIO,
TOTAL
)
VALUES
(
:VID_VALE,
:VID_PRODUCTO,
:VCANTIDAD,
:VDESCRIPCION,
:VVALORUNITARIO,
:VTOTAL
);
SELECT EXISTENCIA FROM STOCKMAESTRO WHERE ID_PRODUCTO = :VID_PRODUCTO
INTO :V_STOCK;
IF (:V_STOCK >= :VCANTIDAD) THEN
BEGIN
UPDATE STOCKMAESTRO
SET EXISTENCIA = :V_STOCK - :VCANTIDAD
WHERE ID_PRODUCTO = :VID_PRODUCTO;
FLAG = 0;
WHEN GDSCODE lock_conflict DO
FLAG = 2;
WHEN ANY DO
FLAG = 3;
END
ELSE
FLAG = 1;
END ^
SET TERM; ^
He creado un lock_conflict y al ejecutar el programa me da un mensaje de error "Lock conflict on no wait transaction" en circunstancias que debiera ejecutar la rutina que corresponde al flag = 2.
La linea:
Código SQL
[-]
WHEN GDSCODE lock_conflict DO
la he reemplado por:
Código SQL
[-]
WHEN SQLCODE lock_conflict DO
y tambien por:
y no obtengo el resultado esperado.
Tambien he colocado las instrucciones "WHEN..." despues de:
Espero que puedan ayudarme en esto.
Gracias.