¿Crear procedimiento de SQL Developer?
Tengo la siguiente base de datos:
- Cliente (customerNO, customerName, address, city, category, custBalance)
- Producto (productNO, label, price, QStock)
- PedidoCliente (orderNO, orderDate, #customerNO)
- ProductoPedido (#orderNO, #productNO, orderQuantity)
y quiero crear estos programas:
El primero es: una función almacenada llamada productPerOrder
para devolver el número de productos ordenados para cualquier pedido dado como entrada su número.
El segundo es: un disparador llamado changeCustomer_Category
que debería ser invocado antes de cualquier actualización del saldo del cliente en la tabla de clientes. Su tarea es modificar la categoría de un cliente de B2 a B1 y de C2 a C1 cuando el estado de saldo de un cliente cae por debajo de un cierto umbral (-10000).
davy.ai
Solución
Función almacenada
productPerOrder
Para crear una función almacenada llamada
productPerOrder
, necesitamos utilizar la sentencia SELECT para recuperar la cantidad de productos colocados en cualquier pedido cuyo número se proporcione como entrada a la función. Aquí está el código SQL para crear esta función:Esta función toma un parámetro de entrada
in_orderNO
que especifica el número de pedido para el cual se debe recuperar la cantidad de productos. Primero declaramos una variable localv_count
, que contendrá la cantidad de productos para el número de pedido dado. Luego, utilizamos la sentencia SELECT para recuperar la cantidad de la tablaOrderedProduct
y almacenarla env_count
. Finalmente, devolvemos el valor dev_count
como resultado de la función.Disparador
changeCustomer_Category
Para crear un disparador llamado
changeCustomer_Category
, necesitamos utilizar el disparadorBEFORE UPDATE
, que se invocará antes de cualquier actualización del saldo del cliente en la tablaCustomer
. Aquí está el código SQL para crear este disparador:Este disparador se activa solo cuando hay una actualización en el campo
custBalance
de la tablaCustomer
. Especifica la cláusulaBEFORE UPDATE OF custBalance ON Customer
. También especificamos la cláusulaFOR EACH ROW
, lo que significa que el disparador se ejecutará una vez por cada fila afectada por la sentencia de actualización.Dentro del disparador, verificamos si el valor antiguo de
custBalance
es menor que -10000 y la categoría anterior es ‘B2’ o ‘C2’. Si esta condición es verdadera, modificamos el valor de la nueva categoría a ‘B1’ o ‘C1’, según el valor de la categoría anterior. Utilizamos la sentenciaCASE
para verificar el valor de la categoría anterior y asignar el valor de la nueva categoría en consecuencia.Tenga en cuenta que modificamos el campo
:NEW.category
, lo que significa que el valor de la categoría actualizada se almacenará en la tablaCustomer
después de la sentencia de actualización.