Jump to content

Consultas sobre ORACLE


HanShunSho

Recommended Posts

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

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 by RigoPerdido
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...