HanShunSho Posted November 30, 2010 Report Share Posted November 30, 2010 Junto con saludar, les tengo varias dudas sobre esto, haber si me echan una manito porfavor. 1.- se puede crear un trigger como de validacion? tengo una tabla venta(id_venta,cod_producto,cantidad,total), lo que quiero es que antes de insertar, verifique si la cantidad a vender se encuentra disponible, es decir, si vendo 10 tomates, verificar si existen 10 tomates o más, y si no, que no se realice el insert. Tengo algo como esto. CREATE OR REPLACE TRIGGER tr_INSERT_Venta BEFORE insert ON Venta AS stockAntiguo NUMBER; BEGIN SELECT SUM(cantidad) INTO stockAntiguo FROM producto WHERE id_producto = :new.id_producto; IF stockAntiguo < :new.cantidad THEN DBMS_OUTPUT.PUT_LINE('Stock no disponible, solo hay : ' || to_char(stockAntiguo) ); --Aquí necesito alguna linea que no permita que se ejecute el insert, ya que este trigger se ejecuta antes del insert END IF; END tr_INSERT_Venta; 2.- No sé si estará bien utilizado el cursor, si alguien me corrige como debería ser, se lo agradecería profundamente. Lo que hace ese procedimiento es que toma un select de una tabla ventaDetalle(id_VentaCabezera,id_producto,cantidad,precio) y los pone en un cursor, luego recorro el cursor y voy acumulando un contador, para luego, hacer un update a la tabla ventaCabezera(id_ventaCabezera, id_cliente,fecha,total) con el total de todos los precios de ventaDetalle. No sé si me expliqué bien. Ahí es lo que tengo echo a partir de un ejemplo que nos dió el docente. CREATE OR REPLACE PROCEDURE totalVenta( in id varchar2(10) ) AS total number; BEGIN CURSOR C.venta IN SELECT precio FROM ventadetalle WHERE id_venta = id; BEGIN FOR F_venta IN C.venta LOOP total := total + C.venta.precio END LOOP; END; UPDATE ventaCabezera SET precio = number WHERE id_venta = id; END; Link to comment Share on other sites More sharing options...
RigoPerdido Posted November 30, 2010 Report Share Posted November 30, 2010 (edited) No pude probar los códigos, pero creo que mas o menos se entenderán: 1. Arrojas una excepcion personalizada con raise_application_error: CREATE OR REPLACE TRIGGER trigger_test BEFORE INSERT ON VENTA FOR EACH ROW DECLARE stockAntiguo number; BEGIN SELECT SUM(cantidad) INTO stockAntiguo FROM producto WHERE cod_producto = :new.cod_producto; IF stockAntiguo < :new.cantidad THEN raise_application_error(-20001, 'Stock insuficiente' ); END IF; END trigger_test; 2. Como lo tienes, quedaría mas o menos: CREATE OR REPLACE PROCEDURE TOTALVENTA( ID IN VARCHAR2 ) AS CURSOR C_CURSOR IS SELECT PRECIO FROM VENTADETALLE WHERE ID_VENTA = ID; V_TOTAL NUMBER; BEGIN FOR(REG IN C_CURSOR)LOOP V_TOTAL:=V_TOTAL+REG.PRECIO; END LOOP; UPDATE VENTACABEZERA SET PRECIO = V_TOTAL WHERE ID_VENTA = ID; END; Aunque, podrías usar un cursor implícito y recuperas la suma total de una sola vez CREATE OR REPLACE PROCEDURE TOTALVENTA( ID IN VARCHAR2 ) AS V_TOTAL NUMBER; BEGIN SELECT SUM(PRECIO) INTO V_TOTAL FROM VENTADETALLE WHERE ID_VENTA = ID; UPDATE VENTACABEZERA SET PRECIO = V_TOTAL WHERE ID_VENTA = ID; END; ;) Edited November 30, 2010 by RigoPerdido Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now