Bievenido

Bienvenido al Blog de Herman Aguilar!!!

Dedicado a compartir material para los alumnos de UJAT-DAIS

miércoles, 5 de abril de 2017

Muestra del procedimiento abcc y actividad de segundo parcial

Les dejo la muestra del procedimiento:

Noten que cambié el procedimiento a municipios_abcc, que significa municipios altas, bajas, cambios y consultas.

De lo que expliqué en la mañana, en la opción 4, en lugar de varios IF usé CASE, es lo mismo pero más limpio.

Recuerden que la entrega es para este viernes 7 de octubre y es un procedimiento almacenado por cada tabla catálogo. Además de haberlo compilado en la base de datos, lo guardan en su carpeta personal de DropBox (un archivo de texto por cada procedimiento). Con esto cerramos las actividades del segundo parcial.

En breve subiré el proyecto en NetBeans.



create or replace procedure municipios_abcc
(
  p_op in number  --1 insert, 2 update, 3 delete, 4 consultas
, p_valido out number  --1 sí, 2 no válido
, p_error out varchar2 --mensaje de error cuando no es válida la ejecución
, p_municipio_id in out number  --llave primaria, se genera cuando es insert, no se modifica
, p_nombre in out varchar2  --nombre del municipio
, p_estado_id in out number --llave foránea, viene de la tabla estados
, p_consulta out sys_refcursor --resultado de la consulta para la opcion 4
) as
begin
--limpiando y validando

  p_nombre:= upper(trim(p_nombre));

  if p_op=1 then
    p_municipio_id:= sec_municipios.nextval;

    insert into municipios(municipio_id, nombre, estado_id)values
    (p_municipio_id, p_nombre, p_estado_id);
  end if;

  if p_op=2 then--actualizando
    update municipios set
       nombre=p_nombre ,
       estado_id = p_estado_id
    where municipio_id=p_municipio_id;
  end if;

  if p_op=3 then--borrando
    delete from municipios  where municipio_id = p_municipio_id;
  end if;
 
  if p_op = 4 then --consultado
     case
     when p_municipio_id is not null then --si es consulta por PK
        open p_consulta for
        select m.municipio_id, m.nombre, e.nombre estado_nombre, m.estado_id
        from municipios m, estados e
        where m.estado_id  = e.estado_id
        and   m.municipio_id = p_municipio_id
        order by m.nombre;
     when p_nombre is not null then --si es consulta por nombre, buscamos por patrón
        open p_consulta for
        select m.municipio_id, m.nombre, e.nombre estado_nombre, m.estado_id
        from municipios m, estados e
        where m.estado_id  = e.estado_id
        and   m.nombre like '%'||p_nombre||'%'
        order by m.nombre;
     when p_estado_id is not null then --si es por estado buscamos por esta FK
        open p_consulta for
        select m.municipio_id, m.nombre, e.nombre estado_nombre, m.estado_id
        from municipios m, estados e
        where m.estado_id  = e.estado_id
        and   m.estado_id = p_estado_id
        order by m.nombre;
     else        --si no es ninguna de las anteriores, regresamos toda la tabla  
        open p_consulta for
        select m.municipio_id, m.nombre, e.nombre estado_nombre, m.estado_id
        from municipios m, estados e
        where m.estado_id  = e.estado_id
        order by m.nombre;    
     end case;
   
  end if;
 
  p_valido:=1;

  exception
  when others then
    p_valido:=0;
    p_error :='Ocurrió un error '||sqlcode||' '||sqlerrm;
end municipios_abcc;





lunes, 3 de abril de 2017

Ejercicio segundo parcial de Modelado

Para el viernes 7 de abril en su carpeta personal del DropBox deben de colocar:


Por cada tabla de sus modelo, un archivo con el siguiente nombre: nombretabla_iud.txt que debe de contener:

5 puntos de calificación

  • 5 inserts para catálogo, 10 para tablas de producción (ventas, contratos, etc) y 20 para las tablas hijas de las tablas de producción (ventas_productos, etc.)
  •  3 updates
  • 1 delete 

5 puntos de calificación

Además por cada CONSTRAINT se debe escribir una sentencia (insert, update o delelete) que intente alterar el estado de la base de datos, pero que genere error, se debe describir porque se esta generando el error y cual sería la solución o recomendación para el usuario.


Es altamente recomendable que las sentencias sean ejecutas en la base de datos utilizando el sqldeveloper.


Aunque estén trabajando en equipo y tengan el mismo modelo, cada quién debe de realizar sus ejercicios y entregar de forma individual.




lunes, 13 de marzo de 2017

Ejemplo de procedimiento ABC

create or replace PROCEDURE LINEAS_ABC 
(
  P_OP IN NUMBER 
, P_VALIDO OUT NUMBER 
, P_ERROR OUT VARCHAR2 
, P_LINEA_ID IN OUT NUMBER 
, P_NOMBRE IN OUT VARCHAR2 
) AS 
BEGIN
--LIMPIANDO Y validando
  p_nombre:= upper(trim(p_nombre));

  if P_OP=1 then
  
     p_linea_id:= sec_lineas.nextval;
  
     insert into lineas(linea_id,nombre)values
           (p_linea_id,p_nombre);
  end if;
  
   if P_OP=2 then--ACTUALIZANDO
        update lineas set  nombre=p_nombre where linea_id=p_linea_id;
  end if;
  
  if P_OP=3 then--BORRANDO
       delete from lineas  where linea_id=p_linea_id;
  end if;
  
  p_valido:=1;
  
  exception
  
  when others then
    p_valido:=0;
    p_error :='Ocurrió un error '||sqlcode||' '||sqlerrm;
    
  
END LINEAS_ABC;


Los cambios fueron:
1. Todos los parámetros correspondientes a la tabla deben ser de tipo out.
2. Después del begin se agrego la sección de limpieza y validación, un ejemplo de validación:
   if p_precio <0 then
      p_valido:=0;
      p_error:='Precio no válido';
      return;
  end if;
3. Se modificó el update para no cambiar la llave primaria, todos los demás campos si pueden cambiar.
4. En el insert se agrego el uso de una secuencia, en este ejemplo sec_lineas, hay que crear una secuencia por cada tabla.
5.  Se agregó la sección Exception para el manejo de excepciones o errores.