Base de datos

652 views
504 views

Published on

Las bases de datos son centros de información de grandes y pequeñas empresas. Por ello es de gran importancia una buena gestión, administración y seguridad ya que contienen información valiosa para cada entidad. Este documento presenta información básica que dará mayor conocer al investigador. Ya que contiene herramientas necesarias para la aplicación en la administración de base de datos.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
652
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
33
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Base de datos

  1. 1. Base de datos II Administración todo tipo de Base de datos SQL Producciones Navegando UniónSoft Alumno: Persy Quiroz Menor Curso: Administración de base de datos II Docente: Joel Pérez Suárez Universidad Peruana Unión – Tarapoto
  2. 2. PRESENTACIÓN Las bases de datos son centros de información de grandes y pequeñas empresas. Por ello es de gran importancia una buena gestión, administración y seguridad ya que contienen información valiosa para cada entidad. Este documento presenta información básica que dará mayor conocer al investigador. Ya que contiene herramientas necesarias para la aplicación en la administración de base de datos. DEDICATORIA Ésta recopilación va dedicados a mis padres Edita y Josué por su apoyo incondicional en mis estudios.
  3. 3. Contenido 1. Creación de Base de datos en Oracle ........................................................................................5 2. Consultas SQL ..............................................................................................................................5 En Oracle ............................................................................................................................................5  Número de cursos por alumno perteneciente al 4to ciclo de sistemas ..........................5  Número de cursos que tiene cada alumno en cada ciclo. ................................................6  Ponderado por curso de cada alumno. ..............................................................................6  Mostar los cursos con su equivales. ....................................................................................7  Mostrar los alumnos que se encuentran con notas mayores al promedio por ciclo y carrera. ............................................................................................................................................7 En PostgreSQL ..................................................................................................................................7   ¿Cuál es el paciente q mayor servicio a recibido y q tipos de servicio? .......................8  Cuál es el sector más vendido .............................................................................................9  Cuáles son sus artículos bandera ........................................................................................9  3. Mostrar diagnóstico, Boucher, glosa y hora de atención. ..............................................7 Muestre su periodo y el tiempo de contrato q tiene cada cliente. ................................10 Triggers ........................................................................................................................................11 En Oracle ..........................................................................................................................................11  Según el criterio de evaluación, sumatoria del peso de las notas no debe pasar el 100%. .............................................................................................................................................11  El siguiente trigger a partir de la nota ingresada nos indica si la nota es aprobatoria o no en el rango entre 0 y 20, en caso contrario nos dice que la nota no es válida. Este evento se da en la tabla EVALU_CRITERIO al momento de registrarlo. ...........................12  El siguiente trigger a partir de la fecha de nacimiento de la persona me dice en qué etapa de su vida se encuentra, ya sea: niño, adolescente, joven, adulto-joven, adulto, anciano y falleció. ........................................................................................................................13  Al registrar un semestre académico, con la fecha el trigger indicará el semestre en que nos encontramos si es de enero a junio será (año-I) en caso contrario (año-II)...........14  Tigger que genera llave principal de una tabla a partir del máximo. ..........................14  Crear la tabla de empleados con las siguientes restricciones: Un empleado no puede supervisar a más de dos empleados. El presupuesto total por departamento no puede ser superior a 1000. ......................................................................................................................15 En PostgreSQL ................................................................................................................................17
  4. 4.  4. Tigger que genera llave principal de una tabla en PostgreSQL a partir del máximo. 17 Funciones PL/SQL ......................................................................................................................18 Desde dónde llamarlas: .................................................................................................................18  Función que evalúa de acuerdo al parámetro ingresado si accede o no al crédito, si es „1‟ evaluará en su propia tabla, sino en la tabla cm_tipo_persona. .................................18   Función que saca la descripción de un producto............................................................19  Función que saca el total de entradas de un producto por mes. ..................................19  5. Función que saca los nombres de un cliente al ingresar su código de identificación. 19 Función que inserta datos a una tabla. .............................................................................20 Procedimientos almacenados ...................................................................................................20  Procedimiento para registrar venta: .................................................................................20  Procedimiento para registrar salida:.................................................................................22  Añadir un nuevo producto a una venta. ..........................................................................23  Procedimiento para anular una salida .............................................................................23  Calcular el total de una venta ............................................................................................24 Cursores............................................................................................................................................24   Eliminar venta......................................................................................................................26  Cargar stock al almacén......................................................................................................27  6. Crear comprobante..............................................................................................................24 Restaurar stock. ...................................................................................................................27 Vistas materializadas .................................................................................................................28  Vista materializada de los datos de la persona ...............................................................28  Vista materializada de los datos de la persona, que se actualiza cada 7 días .............28 7. Secuencias ....................................................................................................................................28 8. Jobs ................................................................................................................................................29   9. 10. Job que ejecuta un procedimiento cada 1 hora (60 minutos). .......................................29 Job que refresca una vista materializada cada 7 días .....................................................30 DB Links ......................................................................................................................................30 Ejecutar función en java ........................................................................................................30
  5. 5. 1. Creación de Base de datos en Oracle CREATEUSER"NOMBRE_BD"IDENTIFIEDBY"CONTRASENA_BD" DEFAULTTABLESPACE USERS TEMPORARYTABLESPACE TEMP PROFILEDEFAULT; GRANTCREATEVIEWTO NOMBRE_BD WITHADMINOPTION; GRANTUNLIMITEDTABLESPACETO NOMBRE_BD; GRANT"CONNECT"TO"NOMBRE_BD"; GRANT"DBA"TO"NOMBRE_BD"; GRANT"RESOURCE"TO"NOMBRE_BD"; ALTERUSER"NOMBRE_BD"DEFAULTROLE"CONNECT","DBA","RESOURCE"; 2. Consultas SQL En Oracle  Número de cursos por alumno perteneciente al 4to ciclo de sistemas select per.PRIMER_NOMBRE||' '||per.PRIMER_APELLIDO||' '||per.SEGUNDO_APELLIDO nombre_alumno, plac.ID_CICLO, count(maac.MATRICULA_CARGA_CURSO_ID) nro_cursos from persona per, alumno al, matricula ma, matricula_alumno_curso maac, carga_curso cc, plan_acad_curso plac, plan_acad pla, esc_acad es where per.PERSONA_ID=al.ALUMNO_ID and al.ALUMNO_ID=ma.ALUMNO_ID and ma.MATRICULA_ID=maac.MATRICULA_ID and cc.CARGA_CURSO_ID=maac.CARGA_CURSO_ID and plac.PLAN_ACAD_CURSO_ID=cc.PLAN_ACAD_CURSO_ID and plac.PLAN_ACAD_ID=pla.PLAN_ACAD_ID and es.ESC_ACAD_ID=pla.ESC_ACAD_ID and plac.ID_CICLO='4'and es.ESC_ACAD_ID='0001' groupby per.PRIMER_NOMBRE,per.PRIMER_APELLIDO,per.SEGUNDO_APELLIDO, plac.ID_CICLO
  6. 6.  Número de cursos que tiene cada alumno en cada ciclo. select per.PRIMER_NOMBRE||' '||per.PRIMER_APELLIDO||' '||per.SEGUNDO_APELLIDO nombre_alumno, alu.COD_UNIVERSITARIO, count(malc.MATRICULA_ID) total_cursos frompersona per, alumno alu, matricula mat, matricula_alumno_curso malc where per.PERSONA_ID=alu.ALUMNO_ID and alu.ALUMNO_ID=mat.ALUMNO_ID and mat.MATRICULA_ID=malc.MATRICULA_ID and mat.semestre='2013-II' groupby per.PRIMER_NOMBRE,per.PRIMER_APELLIDO,per.SEGUNDO_APELLIDO, alu.COD_UNIVERSITARIO;  Ponderado por curso de cada alumno. select per.PRIMER_NOMBRE||' '||per.PRIMER_APELLIDO||' '||per.SEGUNDO_APELLIDO nombre_alumno, cu.NOMBRE nombre_curso, sum((eva.NOTA_CRITERIO*cri.Peso)/100) ponderado frompersona per, alumno al, matricula ma, matricula_alumno_curso maal, carga_curso car, plan_acad_curso plac, curso cu, criterio_eval cri, evalu_criterio eva where per.PERSONA_ID=al.ALUMNO_ID and al.ALUMNO_ID=ma.ALUMNO_ID and ma.MATRICULA_ID=maal.MATRICULA_ID and maal.CARGA_CURSO_ID=car.CARGA_CURSO_ID and car.PLAN_ACAD_CURSO_ID=plac.PLAN_ACAD_CURSO_ID and plac.CURSO_ID=cu.CURSO_ID and car.CARGA_CURSO_ID=cri.CARGA_CURSO_ID and cri.CRITERIO_EVAL_ID=eva.CRITERIO_EVAL_ID and maal.MATRICULA_CARGA_CURSO_ID=eva.MATRICULA_CARGA_CURSO_ID and ma.SEMESTRE='2013-II' groupby per.PRIMER_NOMBRE,per.PRIMER_APELLIDO, per.SEGUNDO_APELLIDO, cu.NOMBRE;
  7. 7.  Mostar los cursos con su equivales. select cu.NOMBRE curso, cu2.NOMBRE equivalente fromcurso cu, curso cu2, equivalencia eq where cu.CURSO_ID=eq.CURSO_ID and cu2.CURSO_ID =eq.EQUIV_CURSO_ID;  Mostrar los alumnos que se encuentran con notas mayores al promedio por ciclo y carrera. selectdistinct(per.PRIMER_NOMBRE||' '||per.PRIMER_APELLIDO) nombre_alumno, es.NOMBRE escuela, plac.ID_CICLO ciclo_acad frompersona per, alumno al, plan_acad pla, esc_acad es, matricula ma, matricula_alumno_curso maal, carga_curso car, plan_acad_curso plac, EVALUACION_TOTAL ev where per.PERSONA_ID=al.ALUMNO_ID and al.PLAN_ACAD_ID=pla.PLAN_ACAD_ID and pla.ESC_ACAD_ID=es.ESC_ACAD_ID and al.ALUMNO_ID=ma.ALUMNO_ID and ma.MATRICULA_ID=maal.MATRICULA_ID and maal.CARGA_CURSO_ID=car.CARGA_CURSO_ID and car.PLAN_ACAD_CURSO_ID=plac.PLAN_ACAD_CURSO_ID and ma.SEMESTRE='2013-II'and ma.MATRICULA_ID=ev.MATRICULA_ID and ev.PROMEDIO_PONDERADO_CICLO>= (select avg(promedio_ponderado_ciclo)fromevaluacion_total eva,matricula ma where ma.MATRICULA_ID=ev.MATRICULA_ID and ma.SEMESTRE='2013-II') groupby per.PRIMER_NOMBRE,per.PRIMER_APELLIDO,es.NOMBRE, plac.ID_CICLO orderby nombre_alumno; En PostgreSQL  Mostrar diagnóstico, Boucher, glosa y hora de atención.
  8. 8. SELECT diagnostico.nombre, venta.voucher, venta.glosa, venta.horaatencion FROM cendiko.venta, cendiko.diagnostico, cendiko.ventadiag WHERE venta.ventaid = ventadiag.ventaid AND diagnostico.diagnosticoid = ventadiag.diagnosticoid;  ¿Cuál es el paciente q mayor servicio a recibido y q tipos de servicio? SELECT cliente.nombres||' '||cliente.apellidos nombre_cliente, servicio.nombre nombre_servicio FROM cendiko.cliente, cendiko.ventaserv, cendiko.venta, cendiko.servicio WHERE cliente.clienteid = venta.clienteid AND venta.ventaid = ventaserv.ventaid AND servicio.servicioid = ventaserv.servicioid AND cliente.clienteid in(select lista.clienteid from(SELECT cliente.clienteid, cliente.nombres||' '||cliente.apellidos nombre_cliente, count(ventaserv.ventaservid) nro_servicios FROM cendiko.cliente, cendiko.venta, cendiko.ventaserv WHERE cliente.clienteid = venta.clienteid AND venta.ventaid = ventaserv.ventaid groupby cliente.clienteid, cliente.nombres,cliente.apellidos HAVING count(ventaserv.ventaservid)=(select max(lista2.nro_servicios)from(SELECT cliente.clienteid, cliente.nombres||' '||cliente.apellidos nombre_cliente, count(ventaserv.ventaservid) nro_servicios FROM cendiko.cliente, cendiko.venta, cendiko.ventaserv WHERE cliente.clienteid = venta.clienteid AND venta.ventaid = ventaserv.ventaid groupby cliente.clienteid, cliente.nombres,cliente.apellidos) lista2)) lista) orderby cliente.apellidos;
  9. 9.  Cuál es el sector más vendido SELECT sector.nombre nombre_sector, sum(kardexfarm.cantidad) cantidad_productos_sector FROM cendiko.sector, cendiko.articulo, cendiko.kardexfarm WHERE sector.sectorid = articulo.sectorid AND articulo.articuloid = kardexfarm.articuloid groupby sector.nombre HAVING sum(kardexfarm.cantidad)= (select max(lista.cantidad_productos_sector)from(SELECT sector.nombre nombre_sector, sum(kardexfarm.cantidad) cantidad_productos_sector FROM cendiko.sector, cendiko.articulo, cendiko.kardexfarm WHERE sector.sectorid = articulo.sectorid AND articulo.articuloid = kardexfarm.articuloid groupby sector.nombre) lista)  Cuáles son sus artículos bandera SELECT articulo.codigo, articulo.nombre, sum(kardexfarm.cantidad) cantidad_vendida FROM cendiko.articulo, cendiko.kardexfarm WHERE articulo.articuloid = kardexfarm.articuloid groupby articulo.codigo,articulo.nombre HAVING sum(kardexfarm.cantidad)>= (select avg(lista.cantidad_vendida)from(SELECT articulo.codigo, articulo.nombre, sum(kardexfarm.cantidad) cantidad_vendida FROM cendiko.articulo, cendiko.kardexfarm WHERE articulo.articuloid = kardexfarm.articuloid groupby articulo.codigo,articulo.nombre) lista) orderby cantidad_vendida desc;
  10. 10.  Muestre su periodo y el tiempo de contrato q tiene cada cliente. SELECT cliente.nombres||' '||cliente.apellidos nombres, periodo.nombre periodo, to_char(contrato.fecha,'dd/mm/yyyy') fecha, to_char(contrato.vigencia,'dd/mm/yyyy') vigencia, to_date(to_char(contrato.vigencia,'dd/mm/yyyy'),'dd/mm/yyyy')to_date(to_char(contrato.fecha,'dd/mm/yyyy'),'dd/mm/yyyy')as total_dias FROM cendiko.periodo, cendiko.cliente, cendiko.contrato WHERE periodo.periodoid = contrato.periodoid AND cliente.clienteid = contrato.clienteid orderby cliente.nombres, cliente.apellidos;
  11. 11. 3. Triggers Un trigger o disparador es un objeto procedimental asociado a una tabla. Se almacena en la base de datos y Oracle lo ejecuta implícitamente (se dispara) cuando se modifican los datos de la tabla (comandos DML de SQL). Los Triggers tienen múltiples aplicaciones por ej. Forzar reglas de integridad de los datos complejas y que no se pueden definir declarando. Restricciones de Integridad. Realizar cambios en la base de datos de forma transparente al usuario. Generar automáticamente valores de columnas derivadas en base a un valor proporcionado por unasentencia INSERT o UPDATE. Sincronizar el mantenimiento de tablas duplicadas que están localizadas en nodos distintos de unabase de datos distribuida. Generar restricciones de acuerdo a los requerimientos. Los Triggers frente a las restricciones de integridad, no se aplican a los datos almacenados en la base dedatos antes de su definición; sólo se aplican cuando, una vez creados, se ejecutan comandos que manipulanlas tablas sobre las que están definidos. Ejemplos de Triggers En Oracle  Según el criterio de evaluación, sumatoria del peso de las notas no debe pasar el 100%. CREATEORREPLACETRIGGER t_criterio beforeinsertoncriterio_eval foreachrow declare item_id varchar2(10); ptotal_peso numeric(12,2); begin select lpad( to_number(coalesce(max(criterio_eval_id),'0'),'9999')+1,4,'0')into item_id fromcriterio_eval; select NVL(sum(peso),0)into ptotal_peso fromcriterio_evalwhere CARGA_CURSO_ID=:new.CARGA_CURSO_ID; if ptotal_peso+:new.peso<=100then :new.criterio_eval_id:=item_id; endif; if ptotal_peso+:new.peso>100then Raise_application_error(-20201,'EXCEDE EL PESO NORMAL DE 100%'); endif;
  12. 12. end t_criterio;  El siguiente trigger a partir de la nota ingresada nos indica si la nota es aprobatoria o no en el rango entre 0 y 20, en caso contrario nos dice que la nota no es válida. Este evento se da en la tabla EVALU_CRITERIOal momento de registrarlo. CREATEORREPLACETRIGGERmatricula.EVALU_CRITERIObeforeinsertonEVALU_CRITER IO REFERENCINGNEWASNEWOLDASOLD FOREACHROW declare nota numeric(12,2); idd varchar2(10); BEGIN nota:=:new.NOTA_CRITERIO; select lpad( to_number(coalesce(max(EVALU_CRITERIO_ID),'0'),'9999999')+1,7,'0')into idd frommatricula.EVALU_CRITERIO; if nota>20then Raise_application_error(-20201,'Nota no válida'); endif; if nota<0then Raise_application_error(-20201,'Nota no válida'); endif; if nota>12then dbms_output.put_line('nota aprobatoria'); :new.EVALU_CRITERIO_ID:=idd; :new.CONDICION:='Nota aprobatoria'; endif; if nota<13then dbms_output.put_line('nota desaprobatoria'); :new.EVALU_CRITERIO_ID:=idd; :new.CONDICION:='Nota desaprobatoria'; endif; endEVALU_CRITERIO;
  13. 13.  El siguiente trigger a partir de la fecha de nacimiento de la persona me dice en qué etapa de su vida se encuentra, ya sea: niño, adolescente, joven, adultojoven, adulto, anciano y falleció. CREATEORREPLACETRIGGER"MATRICULA".personaid beforeinsertonpersona FOREACHROW declare x varchar2(10); y varchar2(10); z varchar2(10); edad integer; resultado varchar2(40); BEGIN SELECT TO_CHAR(SYSDATE,'YYYY')-TO_CHAR(:new.FECHA_NAC,'YYYY')into edad FROM dual; if edad>0and edad<=12then resultado:='Niño'; endif; if edad>12and edad<=16then resultado:='Adolescente'; endif; if edad>16and edad<=28then resultado:='Joven'; endif; if edad>28and edad<=40then resultado:='Adulto - Joven'; endif; if edad>40and edad<=60then resultado:='Adulto'; endif; if edad>60and edad<=80then resultado:='Anciano'; endif; if edad>80then resultado:='Ya falleció'; endif; x:=:new.PRIMER_NOMBRE; y:=:new.PRIMER_APELLIDO; z:=:new.SEGUNDO_APELLIDO; :NEW.persona_id:=substr(x,0,2)||substr(y,0,2)||substr(z,0,2); :new.condicion_edad:=edad||' - '||resultado; endpersona;
  14. 14.  Al registrar un semestre académico, con la fecha el trigger indicará el semestre en que nos encontramos si es de enero a junio será (año-I) en caso contrario (año-II). CREATEORREPLACETRIGGER"MATRICULA".semestre_acad beforeinsertonmatricula foreachrow declare x varchar2(10); y varchar2(10); begin select to_char(sysdate,'mm')into x from dual; select to_char(sysdate,'yyyy')into y from dual; if x<07then :new.semestre:=y||'-I'; else :new.semestre:=y||'-II'; endif; end;  Tigger que genera llave principal de una tabla a partir del máximo. CREATEORREPLACETRIGGER"UPEU_BAZAR".bc_productoBEFOREINSERTONbc_product o REFERENCINGNEWASNEWOLDASOLD FOREACHROW BEGIN select lpad( to_number (coalesce(max(id_producto),'0'),'9999999999')+1,10,'0')into :new.id_producto frombc_producto; ENDbc_producto;
  15. 15.  Crear la tabla de empleados con las siguientes restricciones: Un empleado no puede supervisar a más de dos empleados. El presupuesto total por departamento no puede ser superior a 1000. CREATETABLE"EMPLEADOS" ("IDEMPLEADO"NUMBER, "EMPLEADO"VARCHAR2(4000), "IDJEFE"NUMBER, "SALARIO"NUMBER(9,2), "DPTO"VARCHAR2(20), CONSTRAINT"EMPLEADOS_PK"PRIMARYKEY("IDEMPLEADO")ENABLE, CONSTRAINT"EMPLEADOS_CON"FOREIGNKEY("IDJEFE") REFERENCES"EMPLEADOS"("IDEMPLEADO")ONDELETECASCADEENABLE) / CREATEORREPLACEPACKAGE"RI_EMP"as NewEmp Empleados%rowtype; end; / CREATEORREPLACETRIGGER"EMPLEADOS_JEFES_AFTER" AFTERdeleteorinsertorupdateon"EMPLEADOS" DECLARE V_Supervisados INTEGER; VMsg VARCHAR(50); begin SELECT count(*)INTO V_Supervisados FROMempleados WHERE IdJefe = RI_Emp.Newemp.IdJefe; IFINSERTINGTHEN VMsg:=CONCAT('Insertando :',RI_Emp.Newemp.IdEmpleado); ELSE IFUPDATINGTHEN VMsg:=CONCAT('Modificando :',RI_Emp.Newemp.IdEmpleado); ELSE VMsg:=CONCAT('Borrando :',RI_Emp.Newemp.IdEmpleado); DBMS_OUTPUT.PUT_LINE(Vmsg); ENDIF; ENDIF; IF V_Supervisados>2THEN RAISE_APPLICATION_ERROR(-20001,VMsg||' Error cuenta supervisados de: ' ||RI_Emp.Newemp.IdJefe); ENDIF; end; / ALTERTRIGGER"EMPLEADOS_JEFES_AFTER"ENABLE / CREATEORREPLACETRIGGER"Empleados_Before" BEFOREdeleteorinsertorupdateon"EMPLEADOS" foreachrow begin
  16. 16. RI_Emp.Newemp.IdEmpleado :=:new.IdEmpleado; RI_Emp.Newemp.IdJefe :=:new.IdJefe; RI_Emp.Newemp.Dpto :=:new.Dpto; RI_Emp.Newemp.Salario :=:new.Salario; end; / ALTERTRIGGER"Empleados_Before"ENABLE / CREATEORREPLACETRIGGER"PRESUPUESTO_DPTOS" AFTERinsertorupdateon"EMPLEADOS" DECLARE Vpresupuesto Empleados.salario%type; Vmsg VARCHAR(50)DEFAULT'Presupuesto excedido para Dpto: '; begin SELECT SUM(salario)INTO VPresupuesto FROMEmpleados WHERE Dpto=RI_Emp.Newemp.Dpto; Vmsg:= CONCAT(Vmsg,RI_Emp.Newemp.Dpto); IF Vpresupuesto >1000THEN RAISE_APPLICATION_ERROR(-20001,Vmsg); ENDIF; end; / ALTERTRIGGER"PRESUPUESTO_DPTOS"ENABLE
  17. 17. En PostgreSQL  Tigger que genera llave principal de una tabla en PostgreSQL a partir del máximo. CREATEORREPLACEFUNCTION comun.persona() RETURNS TRIGGERAS' BEGIN NEW.id_persona :=(select ltrim(lpad(to_char(coalesce(max(to_number(id_persona,''99999999'')),' '0'')+1,''00000000''),9,''0'')) from comun.persona); new.fecha_reg:= to_char(now(),''dd/mm/yyyy HH:MI:SS pm''); new.estado:=''1''; IFNEW.id_persona ISNULL THEN RAISEEXCEPTION''comun cannot be NULLvalue''; ENDIF; RETURNNEW; END;' LANGUAGE'plpgsql'; ALTERFUNCTION comun.persona() OWNER TO postgres; CREATETRIGGER tg_persona BEFOREINSERTON comun.persona FOREACHROWEXECUTEPROCEDURE comun.persona(); CREATEORREPLACEFUNCTION seguridad.modulo() RETURNS TRIGGERAS'BEGIN NEW.id_modulo :=(select ltrim(lpad(to_char(coalesce(max(to_number(id_modulo,''99'')),''0'')+1, ''00''),3,''0''))from seguridad.modulo); new.fecha_reg:= now(); new.hora_reg:= to_char(now(),''HH:MI:SS pm''); IFNEW.id_modulo ISNULL THEN RAISEEXCEPTION''seguridad cannot be NULLvalue''; ENDIF; RETURNNEW; END;' LANGUAGE'plpgsql'; ALTERFUNCTION seguridad.modulo() OWNER TO postgres; CREATETRIGGER tg_modulo BEFOREINSERTON seguridad.modulo FOREACHROWEXECUTEPROCEDURE seguridad.modulo(); CREATEORREPLACEFUNCTION seguridad.opcion() RETURNS TRIGGERAS' BEGIN NEW.id_opcion :=(select ltrim(lpad(to_char(coalesce(max(to_number(id_opcion,''999'')),''0'')+1 ,''000''),4,''0''))from seguridad.opcion); new.fecha_reg:= now();
  18. 18. new.hora_reg:= to_char(now(),''HH:MI:SS pm''); IFNEW.id_opcion ISNULL THEN RAISEEXCEPTION''seguridad cannot be NULLvalue''; ENDIF;RETURNNEW;END;' LANGUAGE'plpgsql'; ALTERFUNCTION seguridad.opcion() OWNER TO postgres; CREATETRIGGER tg_opcion BEFOREINSERTON seguridad.opcion FOREACHROWEXECUTEPROCEDURE seguridad.opcion(); 4. Funciones PL/SQL  Una función es un bloque nombrado PL/SQL que devuelve un valor.  Una función puede estar almacenada en la B.D., como objeto de la B.D., para repetidas ejecuciones.  Una función puede ser llamada como parte de una expresión.  Se usa también en cualquier consulta para sacar datos de otras tablas sin usar sus relaciones, sólo filtrando el dato requerido.  Para ejecutar funciones de consulta solamente se usa como tabla en Oracle a Dual (select nombres(id_persona) from dual). Desde dónde llamarlas:  Como columna de un SELECT.  Condiciones en cláusulas WHERE y HAVING.  Cláusulas ORDER BY y GROUP BY.  Cláusula VALUES de un comando INSERT.  Cláusula SET de un comando UPDATE.  Función que evalúa de acuerdo al parámetro ingresado si accede o no al crédito, si es „1‟ evaluará en su propia tabla, sino en la tabla cm_tipo_persona. CREATEORREPLACEFUNCTION acceso_credito(pid_persona invarchar2)RETURNvarcharIS pcred_tb varchar2(1); pcred varchar2(2); ptipo_persona varchar2(22); BEGIN select cred_tb into pcred_tb fromcm_personawhereid_persona=pid_persona; if pcred_tb='1'then SELECT cred into pcred fromcm_personawhere id_persona=pid_persona; endif; if pcred_tb='2'then select id_tipo_persona into ptipo_persona fromcm_personawhere id_persona=pid_persona; select cred into pcred fromcm_tipo_personawhere
  19. 19. id_tipo_persona=ptipo_persona; endif; RETURN(pcred); END; Nota: ésta función está implementada en la Base de datos de Bazar del Sistema del cafetín de la UPeU Tarapoto Función que saca los nombres de un cliente al ingresar su código de identificación. CREATEORREPLACEFUNCTION nombre_cliente(pid_cliente INVARCHAR2)RETURNVARCHAR2IS pnombre_cliente VARCHAR2(200); BEGIN SELECT Initcap(nombres)||' '||Initcap(apepat)||' '||Initcap(apemat)||' '||Initcap(razon_social)into pnombre_cliente FROMcm_personaWHERE id_persona = pid_cliente; RETURN(pnombre_cliente); END;  Función que saca la descripción de un producto. CREATEORREPLACEFUNCTIONnombre_producto_venta(pid_producto INVARCHAR2)RETURNVARCHAR2IS pnombre_producto_venta VARCHAR2(200); BEGIN select pro.NOMBRE_producto||' '||pro.CONC||' '||uni.NOMBRE_UNIDAD_MEDIDA into pnombre_producto_venta frombc_producto pro,bc_unidad_medida uni where pro.ID_UNIDAD_MEDIDA=uni.ID_UNIDAD_MEDIDA and id_producto=pid_producto; RETURN(pnombre_producto_venta); END;  Función que saca el total de entradas de un producto por mes. CREATEORREPLACEFUNCTIONsuma_ent_prod_tot_mes(pid_local invarchar2, pid_producto invarchar2,pid_mes invarchar2)RETURNnumberIS suma_TOT_entradas number(12,2); BEGIN select decode(sum(det.CANTIDAD_XMAY*det.COSTO),'',0,sum(det.CANTIDAD_XMAY*de t.COSTO))into suma_TOT_entradas frombc_entrada en,bc_entrada_detalle det where en.id_entrada=det.id_entrada and en.id_local=pid_local and det.id_producto=pid_producto and to_char(en.fecha_reg,'mm/yyyy')like'%'||pid_mes||'%'; RETURN(suma_TOT_entradas); END;
  20. 20.  Función que inserta datos a una tabla. CREATEORREPLACEFUNCTION insertar_matricula(pmatricula_id INVARCHAR2, pfecha INDATE, palumno_id INVARCHAR2, pcod_matricula INVARCHAR2, psemestre INVARCHAR2 ) RETURNvarchar2 is BEGIN insertintomatricula(MATRICULA_ID, FECHA, ALUMNO_ID, COD_MATRICULA, SEMESTRE) values(pmatricula_id,to_date(pfecha,'dd/mm/yyyy'),palumno_id,pc od_matricula,psemestre); return pmatricula_id; end insertar_matricula; 5. Procedimientos almacenados Un procedimiento almacenado es un conjunto de instrucciones a las que se les da un nombre, se almacena en la base de datos en la cual trabaja el usuario. Permiten agrupar y organizar tareas repetitivas que ayudan al usuario, en confiabilidad, seguridad, y sobre todo protección de datos cuando trabajamos desde el lado del servidor. Un procedimiento almacenado puede contener cualquier cantidad y tipo de instrucciones DML (para la manipulación de datos, como insert, update, delete), no instrucciones DDL (de definición de datos, como create..., drop... alter...).  Procedimiento para registrar venta: Busca el Boucher vigente a partir de la fecha actual con el código del movimiento. Además verifica si hay stock suficiente de un producto en un local determinado, además genera un código para la venta y le asigna un número correlativo al movimiento diario. CREATEORREPLACEPROCEDUREregistrar_venta (pidcliente INVARCHAR2, pidproducto INVARCHAR2, pcantidad INNUMBER, pid_local INVARCHAR2, pidusuario INVARCHAR2, pid_forma_pago INVARCHAR2, p_precio innumber) IS pidsalida varchar(25); pnro varchar2(10); ptipo_cliente varchar(20);
  21. 21. pid_movimiento varchar(5); pid_movimiento_voucher varchar(15); pstock number; BEGIN select id_movimiento into pid_movimiento frombc_movimiento_voucherwhere id_movimiento='S01'and to_char(fecha,'dd/mm/yyyy')=to_char(sysdate,'dd/mm/yyyy')AND ESTADO='1'; select id_movimiento_voucher into pid_movimiento_voucher frombc_movimiento_voucherwhere id_movimiento='S01'and to_char(fecha,'dd/mm/yyyy')=to_char(sysdate,'dd/mm/yyyy')AND ESTADO='1'; select lpad( to_number (coalesce(max(nro),'0'),'9999')+1,4,'0')into pnro frombc_salidawhere id_movimiento=pid_movimiento and id_movimiento_voucher=pid_movimiento_voucher; select stock into pstock frombc_mostradorwhere id_producto = pidproducto; select id_tipo_persona into ptipo_cliente fromcm_personawhere id_persona = pidcliente; select to_char(sysdate,'YYYYMMDD')||'SAL'||to_char(sysdate,'HHMISSMMPM')into pidsalida FROM DUAL; if pstock >= pcantidad then insertintobc_salidavalues(pidsalida, pnro, sysdate, pidcliente,0,0,0,0, pid_local, pidusuario , pid_movimiento, pid_movimiento_voucher,ptipo_cliente,pid_forma_pago,'',NULL,NULL,'0'); commit; insertintobc_salida_detallevalues(pidsalida, pid_local, pidproducto, pcantidad, p_precio,0); commit; updatebc_mostradorset stock = pstock-pcantidad where id_producto = pidproducto; commit; updatebc_salidaset sub_total = p_precio*pcantidad where id_salida = pidsalida; commit; beginsalida_total(pidsalida);end; commit; endif; if pstock < pcantidad then RAISE_APPLICATION_ERROR(-20010,'No hay sufiecinte sotck. Stock actual:'||pstock||', stock requerido:'||pcantidad); endif; ENDregistrar_venta;
  22. 22.  Procedimiento para registrar salida: Este procedimiento hace el trabajo anterior y es más, saca el costo y precio del producto. También valida el precio de venta de un producto a partir la configuración del tipo de cliente. CREATEORREPLACEPROCEDUREregistrar_venta (pidcliente INVARCHAR2, pidproducto INVARCHAR2, pcantidad INNUMBER, pid_local INVARCHAR2, pidusuario INVARCHAR2, pid_forma_pago INVARCHAR2, p_precio innumber) IS pidsalida varchar(25); pnro varchar2(10); ptipo_cliente varchar(20); pid_movimiento varchar(5); pid_movimiento_voucher varchar(15); pstock number; BEGIN select id_movimiento into pid_movimiento frombc_movimiento_voucherwhere id_movimiento='S01'and to_char(fecha,'dd/mm/yyyy')=to_char(sysdate,'dd/mm/yyyy')AND ESTADO='1'; select id_movimiento_voucher into pid_movimiento_voucher frombc_movimiento_voucherwhere id_movimiento='S01'and to_char(fecha,'dd/mm/yyyy')=to_char(sysdate,'dd/mm/yyyy')AND ESTADO='1'; select lpad( to_number (coalesce(max(nro),'0'),'9999')+1,4,'0')into pnro frombc_salidawhere id_movimiento=pid_movimiento and id_movimiento_voucher=pid_movimiento_voucher; select stock into pstock frombc_mostradorwhere id_producto = pidproducto; select id_tipo_persona into ptipo_cliente fromcm_personawhere id_persona = pidcliente; select to_char(sysdate,'YYYYMMDD')||'SAL'||to_char(sysdate,'HHMISSMMPM')into pidsalida FROM DUAL; if pstock >= pcantidad then insertintobc_salidavalues(pidsalida, pnro, sysdate, pidcliente,0,0,0,0, pid_local, pidusuario , pid_movimiento, pid_movimiento_voucher,ptipo_cliente,pid_forma_pago,'',NULL,NULL,'0'); commit; insertintobc_salida_detallevalues(pidsalida, pid_local, pidproducto, pcantidad, p_precio,0);commit; updatebc_mostradorset stock = pstock-pcantidad where id_producto = pidproducto; commit; updatebc_salidaset sub_total = p_precio*pcantidad where id_salida = pidsalida; commit; beginsalida_total(pidsalida);end;commit; endif; if pstock < pcantidad then RAISE_APPLICATION_ERROR(-20010,'No hay sufiecinte sotck. Stock actual:'||pstock||', stock requerido:'||pcantidad); endif;
  23. 23. ENDregistrar_venta;  Añadir un nuevo producto a una venta. CREATEORREPLACEPROCEDUREregistrar_salida_detalle (pid_salida INVARCHAR2,pid_local INVARCHAR2, pid_producto INVARCHAR2, pcantidad INNUMBER) IS p_precio number; pstock number; BEGIN select stock into pstock frombc_mostradorwhere id_producto = pid_producto; select precio into p_precio frombc_productowhere id_producto = pid_producto; if pstock >= pcantidad then insertintobc_salida_detallevalues(pid_salida, pid_local, pid_producto, pcantidad, p_precio,0); commit; updatebc_mostradorset stock = stock-pcantidad where id_producto = pid_producto; commit; beginsalida_total(pid_salida);end; commit; endif; if pstock < pcantidad then RAISE_APPLICATION_ERROR (-20010, 'No hay sufiecinte sotck. Stock actual:'||pstock||', stock requerido:'||pcantidad); rollback; endif; ENDregistrar_salida_detalle;  Procedimiento para anular una salida Este procedimiento verifica el estado de una salida, si el estado es “1” lo anula y le registra en una nueva tabla. También restaura los stocks de los productos CREATEORREPLACEPROCEDUREregistrar_anular_salida(pid_salida INVARCHAR2, pid_usuario INVARCHAR2, pmotivo inVARCHAR2) is contador integer; ptotal number(12,2); BEGIN select count(*)into contador frombc_salidawhere id_salida=pid_salida and terminada='1'; select total into ptotal frombc_salidawhere id_salida=pid_salida and terminada='1'; if contador=1then insertintobc_salida_anularvalues(pid_salida,pid_usuario,pmotivo,sysdat e, ptotal);commit; updatebc_salidaset terminada='A'where id_salida=pid_salida;commit; updatebcja_movimientoset extornado='1'where nro=pid_salida;
  24. 24. commit; beginrestaurarStockSalida(pid_salida);end;commit; endif; ENDregistrar_anular_salida;  Calcular el total de una venta CREATEORREPLACEPROCEDUREsalida_total(pid_salida INVARCHAR2) is psub_total number; BEGIN select decode(sum(CANTIDAD*PRECIO),'',0,sum(CANTIDAD*PRECIO))into psub_total frombc_salida_detallewhere id_salida=pid_salida; if psub_total=0then updatebc_salidaset sub_total=0, igv=0, total=0where id_salida=pid_salida; COMMIT; endif; if psub_total>0then updatebc_salidaset sub_total=psub_total, total=psub_total+igv where id_salida=pid_salida; COMMIT; endif; ENDsalida_total; Cursores Un cursor es un conjunto de registros devuelto por una instrucción SQL. Técnicamente los cursores son fragmentos de memoria que reservados para procesar los resultados de una consulta SELECT.  Crear comprobante CREATEORREPLACEPROCEDUREREGISTRAR_SALIDA_CONTADO(pidsalida INVARCHAR2, pidusuario INVARCHAR2) IS pidcronograma varchar2(25); pidmovimiento varchar2(25); pid_persona varchar2(20); ptotal number(12,2); pid_local varchar2(10); pid_forma_pago varchar2(10); pid_comprobante_config varchar2(10); pnro_comprobante integer; pid_vou_det integer;pnro_mov_sal integer; pmonto_imprimir number(12,2); pid_producto VARCHAR2(30); pcantidad number; pprecio number; pdescuento number; CURSOR cursorlistasalidaproductos ISselect id_producto,
  25. 25. id_local, cantidad,precio,descuento frombc_salida_detallewhere id_salida=pidsalida; BEGIN select total into ptotal fromBC_SALIDAwhere id_salida = pidsalida and terminada='0'; select monto_imprimir into pmonto_imprimir fromBC_MOVIMIENTO_VOUCHER where id_movimiento=(select id_movimiento frombc_salidawhere id_salida=pidsalida) and id_movimiento_voucher=(select id_movimiento_voucher frombc_salidawhere id_salida=pidsalida); if ptotal>=pmonto_imprimir then select to_char(sysdate,'YYYYMMDD')||'MOV'||to_char(sysdate,'HHMISSMMPM')into pidmovimiento FROM DUAL; select id_local into pid_local fromBC_SALIDAwhere id_salida = pidsalida; select id_cliente into pid_persona fromBC_SALIDAwhere id_salida = pidsalida; select id_forma_pago into pid_forma_pago fromBC_SALIDAwhere id_salida = pidsalida; select max(id_vou_det)into pid_vou_det fromBCJA_VOUCHER_DETALLEwhere ID_VOUCHER='VOU01'and to_char(fecha,'dd/mm/yyyy')=to_char(sysdate,'dd/mm/yyyy'); select decode(max(nro_mov_sal),'',1,max(nro_mov_sal)+1)into pnro_mov_sal fromBCJA_MOVIMIENTOWHERE to_char(fecha_mov,'yyyy')=to_char(sysdate,'yyyy'); insertintobcja_movimientovalues(pidmovimiento,'CEfec', pid_persona,'VENT',pidsalida,ptotal,'Cobro de venta al contado efectivo','',sysdate, pidusuario,pid_local,'0',pid_vou_det,pnro_mov_sal); commit; -- Proceso para crear el comprobante Ticket select C.ID_COMPROBANTE_CONFIG into pid_comprobante_config fromBC_ASIGNAR_CONFIG A,BC_COMPROBANTE_CONFIG C WHERE A.ID_COMPROBANTE_CONFIG=C.ID_COMPROBANTE_CONFIG AND A.ID_USUARIO=pidusuario AND A.ESTADO='1'AND C.ESTADO='1'; select max(CONT_MAX)+1into pnro_comprobante FROMBC_COMPROBANTE_CONFIGWHERE ID_COMPROBANTE_CONFIG=pid_comprobante_config; UPDATEBC_SALIDASET id_comprobante_config=pid_comprobante_config,nro_comprobante=pnro_compr obante,fecha_comprobante=sysdate,TERMINADA='1'where id_salida=pidsalida; updateBC_COMPROBANTE_CONFIGset CONT_MAX=pnro_comprobante WHERE ID_COMPROBANTE_CONFIG=pid_comprobante_config; commit; endif; if ptotal<pmonto_imprimir then select id_cliente into pid_persona fromBC_SALIDAwhere id_salida = pidsalida;
  26. 26. OPEN cursorlistasalidaproductos;FETCH cursorlistasalidaproductos INTO pid_producto, pid_local, pcantidad,pprecio,pdescuento; WHILE cursorlistasalidaproductos%FOUNDLOOP insertintobc_temporalvalues('',pid_local,pid_producto,pcantidad,p precio,pdescuento, sysdate,pid_persona,pidusuario); COMMIT; FETCH cursorlistasalidaproductos INTO pid_producto, pid_local, pcantidad,pprecio,pdescuento; ENDLOOP; CLOSE cursorlistasalidaproductos; COMMIT; deletefrombc_salida_detallewhere id_salida=pidsalida; commit; deletefrombc_salidawhere id_salida=pidsalida; commit; endif; ENDREGISTRAR_SALIDA_CONTADO;  Eliminar venta. Éste procedimiento tiene un cursos que busca los detalles de la venta, seguidamente en un bucle recupera los stock y elimina la venta por si id. CREATEORREPLACEPROCEDURE anularSalida(pid_salida INVARCHAR2) IS pid_producto VARCHAR2(30); pid_local VARCHAR2(30); pcantidad number; CURSOR cursorlistasalidaproductos ISselect id_producto, id_local, cantidad frombc_salida_detallewhere id_salida=pid_salida; BEGIN OPEN cursorlistasalidaproductos; FETCH cursorlistasalidaproductos INTO pid_producto, pid_local, pcantidad; WHILE cursorlistasalidaproductos%FOUNDLOOP updatebc_mostradorset stock=stock+pcantidad where id_local=pid_local and id_producto=pid_producto; COMMIT; FETCH cursorlistasalidaproductos INTO pid_producto, pid_local, pcantidad; ENDLOOP; CLOSE cursorlistasalidaproductos; COMMIT; deletefrombc_salida_detallewhere id_salida=pid_salida; commit; deletefrombc_salidawhere id_salida=pid_salida; commit; END anularSalida;
  27. 27.  Cargar stock al almacén Por medio de este procedimiento sumamos al stock los productos que ingresan. CREATEORREPLACEPROCEDURE cargar_produ_ent_propia(pidentrada INVARCHAR2, pidlocal INVARCHAR2) IS pid_producto VARCHAR2(30); ptotal_unidades number; CURSOR cursorlistaentradaproductos ISselect edt.ID_PRODUCTO, edt.CANTIDAD_XMAY*edt.CANTIDAD_XMEN total_unidades frombc_entrada_detalle edt,bc_mostrador mos,bc_producto pro where edt.ID_PRODUCTO=mos.ID_PRODUCTO and mos.ID_PRODUCTO=pro.ID_PRODUCTO and edt.ID_ENTRADA=pidentrada; BEGIN OPEN cursorlistaentradaproductos; FETCH cursorlistaentradaproductos INTO pid_producto, ptotal_unidades; WHILE cursorlistaentradaproductos%FOUNDLOOP updatebc_mostradorset stock=stock+ptotal_unidades where id_local=pidlocal and id_producto=pid_producto; COMMIT; FETCH cursorlistaentradaproductos INTO pid_producto, ptotal_unidades; ENDLOOP; CLOSE cursorlistaentradaproductos; COMMIT; END cargar_produ_ent_propia;  Restaurar stock. Este procedimiento restaura los stock de los productos por venta con solamente filtrando el id (llave principal) de la venta. CREATEORREPLACEPROCEDURE restaurarStockSalida(pid_salida INVARCHAR2) IS pid_producto VARCHAR2(30); pid_local VARCHAR2(30); pcantidad number; -- Este procedimieno restaura los stock, se utiliza en las anulaciones de los comprobantes CURSOR cursorlistasalidaproductos ISselect id_producto, id_local, cantidad frombc_salida_detallewhere id_salida=pid_salida; BEGIN OPEN cursorlistasalidaproductos; FETCH cursorlistasalidaproductos INTO pid_producto, pid_local, pcantidad; WHILE cursorlistasalidaproductos%FOUNDLOOP updatebc_mostradorset stock=stock+pcantidad where id_local=pid_local and id_producto=pid_producto; COMMIT;
  28. 28. FETCH cursorlistasalidaproductos INTO pid_producto, pid_local, pcantidad; ENDLOOP; CLOSE cursorlistasalidaproductos; COMMIT; END restaurarStockSalida; 6. Vistas materializadas Objeto de base de datos que almacena los resultados de una consulta. Una vista materializada se define como una vista común, pero en lugar de almacenar la definición de la vista, almacena el resultado de la consulta, es decir, la materializa, como un objeto persistente en la base de datos. Evita realizar cálculos que requieren gran tiempo de ejecución en el momento de gran tiempo de ejecución en el momento deejecución de la consulta.  Vista materializada de los datos de la persona creatematerializedviewdatos_personaas select Initcap(p.NOMBRES)||' '||Initcap(p.APEPAT)||' '||Initcap(p.APEMAT) NOMBRES, D.NOMBRE_DISTRITO, TP.NOMBRE_TIPO_PERSONA, decode(acceso_credito(p.id_persona),'1','YES','NOT') acceso_credito fromcm_persona p, cm_distrito d, cm_tipo_persona tp where tp.id_tipo_persona=p.id_tipo_persona and p.ID_DISTRITO=d.ID_DISTRITO orderby p.nombre;  Vista materializada de los datos de la persona, que se actualiza cada 7 días creatematerializedview datos_persona2 REFRESHcompleteNEXT sysdate +7as select Initcap(p.NOMBRES)||' '||Initcap(p.APEPAT)||' '||Initcap(p.APEMAT) NOMBRES, D.NOMBRE_DISTRITO, TP.NOMBRE_TIPO_PERSONA, decode(acceso_credito(p.id_persona),'1','YES','NOT') acceso_credito fromcm_persona p, cm_distrito d, cm_tipo_persona tp where tp.id_tipo_persona=p.id_tipo_persona and p.ID_DISTRITO=d.ID_DISTRITO orderby p.nombres Para llamar a una vista se trata como a una tabla más. select*fromdatos_persona2; 7. Secuencias
  29. 29. Una secuencia (sequence) se emplea para generar valores enteros secuenciales únicos y asignárselos a campos numéricos; se utilizan generalmente para las claves primarias de las tablas garantizando que sus valores no se repitan. Una secuencia es una tabla con un campo numérico en el cual se almacena un valor y cada vez que se consulta, se incrementa tal valor para la próxima consulta. Creación de secuencias CREATESEQUENCE UPEU_BAZAR.SEC_PERSONA STARTWITH0 INCREMENTBY1 MINVALUE0 NOCACHE NOCYCLE NOORDER Uso de la secuencia. insertintoCM_PERSONAvalues (SEC_PERSONA.nextval,'pRIMER REGIS'); 8. Jobs Los Jobs sirven para programar tareas que se ejecuten automáticamente en la base de datos. Para ello se tiene que indicar la fecha y hora de la primera ejecución, qué tareas va a realizar e indicar el tiempo que se va a repetir la tarea. Una de las principales ventajas es que nos ahorran trabajo porque el servidor de base de datos lo hace automáticamente.  Job que ejecuta un procedimiento cada 1 hora (60 minutos). DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job => X ,what =>'BEGIN guardar_saldos_diarios_hoy; END;' ,next_date => to_date('27/11/2013 13:58:46','dd/mm/yyyy hh24:mi:ss') ,interval=>'SYSDATE + 60/1440' ,no_parse =>TRUE ); SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x)); END;
  30. 30.  Job que refresca una vista materializada cada 7 días DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job => X ,what=>'dbms_refresh.refresh(''"UPEU_BAZAR"."DATOS_PERSONA2"'');' ,next_date => to_date('04/12/2013 12:44:00','dd/mm/yyyy hh24:mi:ss') ,interval=>'sysdate + 7 ' ,no_parse =>TRUE ); SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x)); END; 9. DB Links Un Database Link (DBLink) en Oracle es un tipo de objeto que permite realizar una conexión desde una base de datos a otra. Su principal objetivo es ocultar el detalle de los parámetros de conexión necesarios, facilitándonos un sencillo acceso a los recursos disponibles en otras bases de datos, independientemente de que estas se encuentren instaladas en el mismo servidor o no. CREATEPUBLICDATABASELINK UPS_DBLINK CONNECTTO UPEU_SEGURIDAD IDENTIFIEDBY UPEU_SEGURIDAD USING '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST =192.168.60.20)(PORT = 1521)) (CONNECT_DATA = (SID = orcl)))' Para hacer la consulta se hace de ésta forma: SELECT*FROM SG_USUARIO@UPS_DBLINK 10. Ejecutar función en java
  31. 31. public CMdistrito agregarDistrito222(CMdistrito dis) throws SQLException { boolean paso_insert_per = false; String result = ""; try { Class.forName("oracle.jdbc.driver.OracleDriver"); jn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl" , "upeu_bazar", "upeu_bazar"); CallableStatement val = jn.prepareCall("{?=call insertar_distrito(?)}"); // Se indica que el primer interrogante es de salida. val.registerOutParameter(1, Types.VARCHAR); // Se pasa un parámetro en el segundo interrogante. val.setString(2, dis.getNombre_distrito().trim()); // Se hace la llamada a la función. val.execute(); // Se recoge el resultado del primer interrogante. result = val.getString(1); jn.commit(); jn.close(); paso_insert_per = true; CMdistrito di = new CMdistrito(); di.setId_distrito(result); return di; } catch (Exception e) { String MError = e.getMessage(); System.out.println("Error al ejecutar la funcion " + MError); jn.rollback(); jn.close(); paso_insert_per = false; CMdistrito di = new CMdistrito(); di.setId_distrito("Error al ejecutar la funcion " + MError); return di; } } 11. Examen Final
  32. 32. 1. Realizar un trigger que muestre el total de créditos multiplicado por s/ 120 si es adventista y si no por s/ 150, en la tabla matricula_alumno_curso(ojo crear nuevo atributo). CREATEORREPLACETRIGGERMATRICULA_ALUMNO_CURSObeforeinsertonMATRICULA_ALU MNO_CURSO foreachrow declare pid_religion varchar2(20); pcr numeric(12,2); begin SELECT C.CR into pcr FROMCARGA_CURSO CC,PLAN_ACAD_CURSO PA,CURSO C WHERE C.CURSO_ID=PA.CURSO_ID AND PA.PLAN_ACAD_CURSO_ID=CC.PLAN_ACAD_CURSO_ID AND CC.CARGA_CURSO_ID=:new.CARGA_CURSO_ID; SELECT PER.ID_RELIGION into pid_religion FROMPERSONA PER,ALUMNO A,MATRICULA M WHERE PER.PERSONA_ID=A.ALUMNO_ID AND A.ALUMNO_ID=M.ALUMNO_ID AND M.MATRICULA_ID=:new.MATRICULA_ID; if pid_religion='Adve'then :new.TOT_PAGAR:=pcr*120; else :new.TOT_PAGAR:=pcr*150; endif; end t_criterio; 2. Realizar una función que inserte en la tabla criterio_eval si es menor o igual a 100% del peso total de lo contrario un mensaje de error. CREATEORREPLACEFUNCTION proceso_criterio_eval (pcriterio_eval_id invarchar2, pcarga_curso_id invarchar2, pcriterio invarchar2, pdetalle invarchar2, ppeso innumber)RETURNvarchar2 is ptotal_peso numeric(12,2); BEGIN select NVL(sum(peso),0)into ptotal_peso fromcriterio_evalwhere CARGA_CURSO_ID=pcarga_curso_id; if ptotal_peso+ppeso<=100then insertintocriterio_eval(criterio_eval_id, carga_curso_id, criterio, detalle, peso) values(pcriterio_eval_id,pcarga_curso_id,pcriterio,pdetalle,ppes o); return(pcriterio_eval_id); else Raise_application_error(-20201,'EXCEDE EL PESO NORMAL DE
  33. 33. 100%'); endif; end proceso_criterio_eval; 3. Realizar un procedimiento que haga el llamado a la función realizada si la operación ha sido realizado con éxito muestre un mensaje de ok y si no error. CREATEORREPLACEPROCEDURE ejecutar_funcion(pcriterio_eval_id invarchar2, pcarga_curso_id invarchar2, pcriterio invarchar2, pdetalle invarchar2, ppeso innumber) IS presultado varchar2(200); BEGIN presultado:=PROCESO_CRITERIO_EVAL(pcriterio_eval_id,pcarga_curs o_id,pcriterio,pdetalle,ppeso); if presultado!=pcriterio_eval_id then Raise_application_error(-20201,'***Error****'); endif; END ejecutar_funcion; 4. Realizar un cursor que matricule a todos los alumnos en el semestre seleccionado. CREATEORREPLACEPROCEDURE matricular_semestre(psemestre INVARCHAR2) IS palumno_id VARCHAR2(30); CURSOR cursor_lista_alumnos ISselect a.ALUMNO_ID fromalumno a where a.ALUMNO_ID notin(select m.ALUMNO_ID frommatricula m where m.semestre=psemestre); BEGIN OPEN cursor_lista_alumnos; FETCH cursor_lista_alumnos INTO palumno_id; WHILE cursor_lista_alumnos%FOUNDLOOP insertintomatricula(fecha, alumno_id,semestre)values(sysdate,palumno_id, psemestre); COMMIT; FETCH cursor_lista_alumnos INTO palumno_id; ENDLOOP; CLOSE cursor_lista_alumnos; COMMIT; END matricular_semestre; 5. Realizar un procedimiento que inserte, actualicé y elimine en la tabla carga periodo. CREATEORREPLACEPROCEDURE proceso_carga_periodo(pcarga_id invarchar2,
  34. 34. pfecha_ini indate, pfecha_fin indate, psemestre invarchar2, pturno invarchar2, opcion integer) IS contador integer; BEGIN if opcion=1then-- insertar insertintocarga_periodo(carga_id, fecha_ini, fecha_fin, semestre, turno) values(pcarga_id, pfecha_ini, pfecha_fin, psemestre, pturno); commit; endif; if opcion=2then-- actualizar updatecarga_periodoset fecha_ini=pfecha_ini, fecha_fin=pfecha_fin, semestre=psemestre, turno=pturno where carga_id=pcarga_id; commit; endif; if opcion=3then-- eliminar select count(*)into contador fromCARGA_CURSOwhere carga_id=pcarga_id; if contador=0then deletefromcarga_periodowhere carga_id=pcarga_id; commit; else Raise_application_error(-20201,'NO PUEDE ELIMINAR ÉSTA CARGA PERIODO PORQUE SE ESTÁ USANDO'); endif; endif; END proceso_carga_periodo; Centro de Producciones Navegando CPN-TARAPOTO Persy.quiroz@upeu.edu.pe

×