Ver Mensaje Individual
  #1 (permalink)  
Antiguo 05/06/2007, 13:22
bostero2
 
Fecha de Ingreso: junio-2007
Mensajes: 1
Antigüedad: 17 años, 6 meses
Puntos: 0
Duda con procedimiento público en un paquete

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?