Buenas, estaba repasando para un parcial que rindo mañana y me quede trabado en una parte de la práctica...
La consigna es esta:
Cita: PAQUETE LIBRERIA
Crear un paquete LIBRERIA para generar ventas de libros en la librería.
En todos los procedimientos considerar todos los errores posibles.
El paquete contendrá:
1. Una tabla en memoria T_Libros con todos los libros que hay en stock que debe cargarse en un bloque One Time_Only. Usar como índice de la tabla el Isbn del libro y como datos el título del libro y la cantidad en stock disponible. Si no hay stock disponible poner 0 ó Null en cantidad. Solo considerar el stock existente actual (Estado=1).
2. Función privada VALIDA_CLI que recibe nombre y apellido de un cliente y devuelve el Id .
* Si el cliente no existe cancelar la función enviando un código de error que deberá ser capturado desde los procedimientos que la invoquen.
3. Función privada VALIDA_LIBRO que recibe el título del libro y devuelve su Isbn usando la tabla T_Libros.
* Si el título no corresponde a un libro cancelar enviando un código de error que deberá ser capturado desde los procedimientos que la invoquen.
* Si no hay stock disponible para el libro cancelar enviando otro código de error.
4. Procedimiento público ALTA_VENTA para insertar filas en la tabla Venta_Libros.
* Ingresar por parámetro nombre y apellido del cliente, el título o Isbn del libro, la fecha de venta y el tipo de pago
* La fecha de venta debe ser menor o igual a la fecha del día (para cargar ventas pendientes) pero si no se informa poner la fecha del día
* Validar que el tipo de pago sea correcto. Si no se informa asumir efectivo (1). Defina que sería lo más adecuado para validar el tipo de pago.
* Validar que el cliente exista usando la función VALIDA_CLI
* Validar que el libro corresponda a un libro de la librería usando T-Libros o VALIDA_LIBRO según corresponda.
* Si no hay stock disponible desplegar un mensaje informativo
* Si los datos son correctos insertar una fila en la tabla Venta_Libros y actualizar el stock disponible en la tabla Inventario mediante TRIGGER. Además actualizar el stock en la tabla en memoria T_Libros.
* Asentar los cambios en la Base de Datos (Commit) y desplegar un mensaje informativo
La duda surge en el punto 4
Declaración del paquete:
Código:
create or replace
PACKAGE "LIBRERIA"
IS
TYPE I_L_TYPE IS RECORD
(TITULO LIBROS.TITULO%TYPE,
STOCK INVENTARIO.CANTIDAD%TYPE);
TYPE T_TYPE IS TABLE OF I_L_TYPE
INDEX BY BINARY_INTEGER;
T_LIBROS T_TYPE;
PROCEDURE ALTA_VENTA
(NOMB CLIENTES.NOMBRE%TYPE,
APEL CLIENTES.APELLIDO%TYPE,
TITU LIBROS.TITULO%TYPE,
FEVE VENTA_LIBROS.FECHA_VENTA%TYPE,
TIPA VENTA_LIBROS.TIPO_PAGO%TYPE);
END;
Cuerpo del paquete:
Código:
CREATE OR REPLACE PACKAGE BODY "LIBRERIA" AS C_IDF CLIENTES.ID_CLIENTE%TYPE;
L_ISBNF LIBROS.ISBN%TYPE;
CURSOR C IS
SELECT ISBN,L.TITULO,I.CANTIDAD,I.ESTADO
FROM LIBROS L NATURAL JOIN INVENTARIO I;
FUNCTION VALIDA_CLI
(NOM CLIENTES.NOMBRE%TYPE,
APE CLIENTES.APELLIDO%TYPE)
RETURN CLIENTES.ID_CLIENTE%TYPE
IS
BEGIN SELECT ID_CLIENTE
INTO C_IDF FROM CLIENTES WHERE NOMBRE=NOM AND APELLIDO=APE;
IF C_IDF IS NULL THEN
RAISE_APPLICATION_ERROR(-20121,'EL CLIENTE NO EXISTE');
END IF;
RETURN C_IDF;
END;
FUNCTION VALIDA_LIBRO
(TIT LIBROS.TITULO%TYPE)
RETURN LIBROS.ISBN%TYPE
IS
BEGIN SELECT ISBN
INTO L_ISBNF FROM LIBROS WHERE TITULO=TIT;
IF L_ISBNF IS NULL THEN
RAISE_APPLICATION_ERROR(-20122,'EL LIBRO NO EXISTE');
END IF;
IF T_LIBROS(L_ISBNF).STOCK=0 THEN
RAISE_APPLICATION_ERROR(-20123,'EL LIBRO NO TIENE STOCK DISPONIBLE');
END IF;
RETURN L_ISBNF;
END;
BEGIN FOR REG_C IN C
LOOP
T_LIBROS(REG_C.ISBN).TITULO:=REG_C.TITULO;
IF REG_C.ESTADO=1 THEN
T_LIBROS(REG_C.ISBN).STOCK:=REG_C.CANTIDAD;
ELSE
T_LIBROS(REG_C.ISBN).STOCK:=0;
END IF;
END LOOP;
END;
PROCEDURE ALTA_VENTA
(NOMB CLIENTES.NOMBRE%TYPE,
APEL CLIENTES.APELLIDO%TYPE,
TITU LIBROS.TITULO%TYPE,
FEVE VENTA_LIBROS.FECHA_VENTA%TYPE,
TIPA VENTA_LIBROS.TIPO_PAGO%TYPE)
IS
AV_IDC CLIENTES.ID_CLIENTE%TYPE;
AV_ISBN LIBROS.ISBN%TYPE;
AV_STOCK INVENTARIO.CANTIDAD%TYPE;
BEGIN IF(FEVE>SYSDATE) THEN
RAISE_APPLICATION_ERROR(-20124,'LA FECHA NO PUEDE SER POSTERIOR A LA FECHA DE HOY.');
ELSIF FEVE IS NULL THEN
FEVE:=SYSDATE;
END IF;
IF TIPA NOT IN(1,2,3,4) THEN
RAISE_APPLICATION_ERROR(-20125,'EL TIPO DE PAGO NO ES VÁLIDO.');
END IF;
AV_IDC:=VALIDA_CLI(NOMB,APEL);
AV_ISBN:=VALIDA_LIBRO(TITU);
INSERT INTO VENTA_LIBROS VALUES(AV_IDC,AV_ISBN,FEVE,TIPA);
SELECT CANTIDAD
INTO AV_STOCK FROM INVENTARIO WHERE ISBN=AV_ISBN;
T_LIBROS(AV_ISBN).STOCK:=AV_STOCK;
COMMIT;
DBMS_OUTPUT.PUT_LINE('FILA INSERTADA');
END;
END;
El compilador de SQL Developer me tira dos errores:
Error(51,1): PLS-00103: Se ha encontrado el símbolo "Procedure"
Error(82,1): PLS-00103: Se ha encontrado el símbolo "END" cuando se esperaba uno de los siguientes: begin function pragma procedure form
¿Alguna idea?