es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Desencadenador PL/SQL ANTES DE INSERTAR basado en los valores de la tabla en cambio.

Tengo este problema.

Quiero evitar agregar nuevos carritos si el cliente ya tiene al menos un carrito de compras no pagado utilizando un disparador antes de la inserción en cada fila (en caso de que se inserten más de un carrito nuevo).

Captura de pantalla del modelo de tablas

Logré resolver este problema bastante fácilmente en T-SQL contando los registros que contienen NULL en la columna paidTime en la tabla modificada.

sql<br>
CREATE TRIGGER one_unpaid_cart_per_client ON Cart<br>
FOR INSERT<br>
AS<br>
BEGIN<br>
SET NOCOUNT ON;<br>
DECLARE newCart_cursor CURSOR FOR SELECT IdClient, IdCart, isPaid FROM inserted;<br>
<br>
DECLARE @IdClient int;<br>
DECLARE @IdCart int;<br>
DECLARE @isPaid datetime;<br>
<br>
OPEN newCart_cursor;<br>
FETCH NEXT FROM newCart_cursor INTO @IdClient, @IdCart, @isPaid;<br>
<br>
WHILE @@FETCH_STATUS = 0<br>
BEGIN<br>
IF @isPaid is null<br>
BEGIN<br>
if 1 < (SELECT COUNT(1) FROM Cart WHERE IdClient = @IdClient AND isPaid is Null)<br>
BEGIN<br>
PRINT 'Ya existe un carrito no pagado para el cliente con id: ' + Cast(@IdClient as Varchar);<br>
DELETE FROM Cart WHERE IdCart = @IdCart;<br>
Raiserror('El nuevo carrito no se ha agregado', 1, 1);<br>
END;<br>
END;<br>
FETCH NEXT FROM newCart_cursor INTO @IdClient, @IdCart, @isPaid;<br>
END;<br>
<br>
CLOSE newCart_cursor;<br>
DEALLOCATE newCart_cursor;<br>
SET NOCOUNT OFF;<br>
<br>
END;<br>

Sin embargo, en PL/SQL, según lo que sé, no se puede consultar la tabla cambiante, por lo que no puedo verificar cuántos carritos impagos hay.

¿Hay algo que pueda hacer para lograr esto utilizando un disparador en PL/SQL?

¡Gracias por cualquier ayuda!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Evitar agregar nuevos carritos si el cliente ya tiene un carrito de compras sin pagar

    Para evitar agregar un nuevo carrito si el cliente ya tiene al menos un carrito de compras sin pagar usando un disparador antes de la inserción en cada fila, se puede utilizar el siguiente disparador PL/SQL:

    CREATE OR REPLACE TRIGGER one_unpaid_cart_per_client
    BEFORE INSERT ON Cart
    FOR EACH ROW
    DECLARE
        cart_count INTEGER;
    BEGIN
        SELECT COUNT(*) INTO cart_count
        FROM Cart
        WHERE IdClient = :new.IdClient AND isPaid IS NULL;
    
        IF cart_count > 0 THEN
            RAISE_APPLICATION_ERROR(-20001, 'El cliente ya tiene un carrito sin pagar');
        END IF;
    END;
    

    Este disparador evitará que se inserten nuevas filas en la tabla Cart para un cliente en particular si ese cliente ya tiene al menos un carrito sin pagar. Funciona contando el número de filas en la tabla Cart para un cliente dado donde la columna isPaid es NULL. Si el recuento es mayor que cero, se genera un error, evitando que se inserte la nueva fila.

    Nota que este disparador utiliza la sintaxis :new para hacer referencia a los valores de la nueva fila que se está insertando.

Comments are closed.