| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.server -> Re: Modify trigger - Look
This is the script I want execute:
CREATE OR REPLACE TRIGGER "TRI_NICHOS"
BEFORE DELETE OR INSERT OR UPDATE
ON dbo.nichos
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
num_emp_old VARCHAR (2); cod_alm_old VARCHAR (6); cod_art_old VARCHAR (10); num_emp_new VARCHAR (2); cod_alm_new VARCHAR (6); cod_art_new VARCHAR (10); contador NUMBER; stock NUMBER (11, 2); v_gestiona_nichos_almacen BOOLEAN; v_gestiona_stock BOOLEAN; v_nichos_disponible BOOLEAN;
CURSOR comprueba_gestiona_nichos_cur (p_cod_alm stalmace.cod_alm %TYPE) IS
SELECT 1
FROM stalmace
WHERE NVL (stalmace.gestiona_nichos, 'N') = 'S'
AND stalmace.cod_alm = p_cod_alm;
comprueba_gestiona_nichos_rec comprueba_gestiona_nichos_cur %ROWTYPE; CURSOR comprueba_stock_cur (p_cod_art articulo.cod_art%TYPE) IS
SELECT 1
FROM articulo
WHERE NVL (articulo.tipo_stock, 'N') = 'S'
AND articulo.cod_art = p_cod_art;
comprueba_stock_rec comprueba_stock_cur%ROWTYPE;
CURSOR comprueba_nicho_disponible_cur (
p_num_emp nichos_disponibles.num_emp%TYPE
,p_cod_alm nichos_disponibles.cod_alm%TYPE
,p_cod_nicho nichos_disponibles.cod_nicho%TYPE) IS
SELECT 1
FROM nichos_disponibles
WHERE nichos_disponibles.num_emp = p_num_emp
AND nichos_disponibles.cod_alm = p_cod_alm
AND nichos_disponibles.cod_nicho = p_cod_nicho;
comprueba_nicho_disponible_rec comprueba_nicho_disponible_cur
%ROWTYPE;
BEGIN
IF UPDATING
OR DELETING THEN
OPEN comprueba_stock_cur (:OLD.cod_art);
FETCH comprueba_stock_cur
INTO comprueba_stock_rec;
v_gestiona_stock := comprueba_stock_cur%FOUND;
CLOSE comprueba_stock_cur;
IF v_gestiona_stock THEN
OPEN comprueba_gestiona_nichos_cur (:OLD.cod_alm);
FETCH comprueba_gestiona_nichos_cur
INTO comprueba_gestiona_nichos_rec;
v_gestiona_nichos_almacen := comprueba_gestiona_nichos_cur
%FOUND;
CLOSE comprueba_gestiona_nichos_cur;
IF NOT v_gestiona_nichos_almacen THEN
raise_application_error (-20000
,'El almacén no gestiona
ubicaciones');
END IF;
-- Validamos que la ubicación existe
OPEN comprueba_nicho_disponible_cur (:OLD.num_emp
,:OLD.cod_alm
,:OLD.cod_nicho);
FETCH comprueba_nicho_disponible_cur
INTO comprueba_nicho_disponible_rec;
v_nichos_disponible := comprueba_nicho_disponible_cur%FOUND;
CLOSE comprueba_nicho_disponible_cur;
IF NOT v_nichos_disponible THEN
raise_application_error (-20007
,'La ubicación introducida no
existe');
END IF;
UPDATE st_stocks
SET stock_fisi = NVL (stock_fisi, 0) - :OLD.cantidad_total
WHERE num_emp = :OLD.num_emp
AND cod_alm = :OLD.cod_alm
AND cod_art = :OLD.cod_art;
IF SQL%NOTFOUND THEN
INSERT INTO st_stocks
(num_emp
,cod_alm
,cod_art
,stock_fisi)
VALUES (:OLD.num_emp
,:OLD.cod_alm
,:OLD.cod_art
,-:OLD.cantidad_total);
END IF;
DELETE st_stocks
WHERE num_emp = :OLD.num_emp
AND cod_alm = :OLD.cod_alm
AND cod_art = :OLD.cod_art
AND stock_fisi = 0;
END IF;
OR UPDATING THEN
OPEN comprueba_stock_cur (:NEW.cod_art);
FETCH comprueba_stock_cur
INTO comprueba_stock_rec;
v_gestiona_stock := comprueba_stock_cur%FOUND;
CLOSE comprueba_stock_cur;
IF v_gestiona_stock THEN
OPEN comprueba_gestiona_nichos_cur (:NEW.cod_alm);
FETCH comprueba_gestiona_nichos_cur
INTO comprueba_gestiona_nichos_rec;
v_gestiona_nichos_almacen := comprueba_gestiona_nichos_cur
%FOUND;
CLOSE comprueba_gestiona_nichos_cur;
IF NOT v_gestiona_nichos_almacen THEN
raise_application_error (-20000
,'El almacén no gestiona
ubicaciones');
END IF;
-- Validamos que la ubicación existe
OPEN comprueba_nicho_disponible_cur (:NEW.num_emp
,:NEW.cod_alm
,:NEW.cod_nicho);
FETCH comprueba_nicho_disponible_cur
INTO comprueba_nicho_disponible_rec;
v_nichos_disponible := comprueba_nicho_disponible_cur%FOUND;
CLOSE comprueba_nicho_disponible_cur;
IF NOT v_nichos_disponible THEN
raise_application_error (-20007
,'La ubicación introducida no
existe');
END IF;
UPDATE st_stocks
SET stock_fisi = NVL (stock_fisi, 0) + :NEW.cantidad_total
WHERE num_emp = :NEW.num_emp
AND cod_alm = :NEW.cod_alm
AND cod_art = :NEW.cod_art;
IF SQL%NOTFOUND THEN
INSERT INTO st_stocks
(num_emp
,cod_alm
,cod_art
,stock_fisi)
VALUES (:NEW.num_emp
,:NEW.cod_alm
,:NEW.cod_art
,:NEW.cantidad_total);
END IF;
DELETE st_stocks
WHERE num_emp = :NEW.num_emp
AND cod_alm = :NEW.cod_alm
AND cod_art = :NEW.cod_art
AND stock_fisi = 0;
END IF;
IF :NEW.cantidad_total < 0 THEN
raise_application_error
(-20001
,'No se permite stock negativos en un
nicho.');
END IF;
![]() |
![]() |