Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Duda con procedimiento público en un paquete

Estas en el tema de Duda con procedimiento público en un paquete en el foro de Oracle en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 05/06/2007, 13:22
 
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?
  #2 (permalink)  
Antiguo 05/06/2007, 19:45
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 9 meses
Puntos: 7
Re: Duda con procedimiento público en un paquete

falta el end para package body no??

nunca me a gustado usar procedures o funciones a nivel procedure mejor las sacaria a nivel paquete
__________________
Blogzote.com :-) Mi blog
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:00.