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.
tics en la vida cotidiana prepa en linea modulo 1.pptx
Base de datos
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. 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. 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.
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. 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.
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.
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. 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.
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.
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. 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. 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.
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.
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.
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
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. 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. 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.
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. 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.
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. 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. 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. 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. 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.
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. 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. 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.
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. 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. 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. 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. 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