La consigna es esta:
Cita:
La duda surge en el punto 4PAQUETE 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
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
Declaración del paquete:
Código:
Cuerpo del paquete: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;
Código:
El compilador de SQL Developer me tira dos errores: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;
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?