Mostrando entradas con la etiqueta Modelamiento de Bases de datos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Modelamiento de Bases de datos. Mostrar todas las entradas

Declarar Cursores

Declarar Cursores
declare cursor cpaises
is
select codpa,nompa,conpa from paises;
copa number(3);
nopa varchar2(20);
contpa varchar2(10);
begin
  open cpaises;
  loop
   fetch cpaises into copa,nopa,contpa;
   exit when cpaises%notfound;
   dbms_output.put_line(cpaises%rowcount||' pais '||nopa);
  end loop;
  close cpaises;
end;

Taller De Cursores Resuelto

Taller De Cursores Resuelto
E J E R C I C I O S
CURSOR...IS...
1.- Ejemplos de creación de procedimientos con cursores.
1) Desarrollar un procedimiento que visualice los nombres de los países y cuantos registros fueron procesados.
create or replace procedure p_muestra_paises
as
cursor c_muestrap is select nompa from paises order by nompa;
nopa varchar2(20);
BEGIN
OPEN c_muestrap;
LOOP
   FETCH c_muestrap into nopa;
   dbms_output.put_line('Pais '||nopa);
   EXIT WHEN c_muestrap%NOTFOUND;
END LOOP;
dbms_output.put_line('Numero de registros procesados '||c_muestrap%ROWCOUNT);
CLOSE c_muestrap;
END p_muestra_paises;
set serveroutput on;
exec p_muestra_paises;
2) Adicione la columna Poblacion a la tabla PAISES. Codificar un procedimiento que muestre el nombre de cada país, población y el total de la población.

CREATE OR REPLACE PROCEDURE ver_emple_depart
AS
CURSOR c_emple IS
SELECT dnombre, COUNT(emp_no)
FROM emple e, depart d
WHERE d.dept_no = e.dept_no(+)
GROUP BY dnombre;
v_dnombre depart.dnombre%TYPE;
v_num_emple BINARY_INTEGER;
BEGIN
OPEN c_emple;
FETCH c_emple into v_dnombre, v_num_emple;
WHILE c_emple%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_dnombre||' * '||v_num_emple);
FETCH c_emple into v_dnombre,v_num_emple;
END LOOP;
CLOSE c_emple;
END ver_emple_depart;
3) Escribir un procedimiento que reciba una cadena y visualice el país que contenga esa cadena.
CREATE OR REPLACE PROCEDURE ver_emple_apell(
cadena VARCHAR2)
AS
cad VARCHAR2(10);
CURSOR c_emple IS
SELECT apellido, emp_no FROM emple
WHERE apellido LIKE cad;
vr_emple c_emple%ROWTYPE;
BEGIN
cad :='%'||cadena||'%';
OPEN c_emple;
FETCH c_emple INTO vr_emple;
WHILE (c_emple%FOUND) LOOP
DBMS_OUTPUT.PUT_LINE(vr_emple.emp_no||' * '
||vr_emple.apellido);
FETCH c_emple INTO vr_emple;
END LOOP;
DBMS_OUTPUT.PUT_LINE('NUMERO DE EMPLEADOS: '
|| c_emple%ROWCOUNT);
CLOSE c_emple;
END ver_emple_apell;
4) Escribir un programa que visualice el apellido y el salario de los cinco empleados que tienen el salario más alto.
CREATE OR REPLACE PROCEDURE emp_5maxsal
AS
CURSOR c_emp IS
SELECT apellido, salario FROM emple
ORDER BY salario DESC;
vr_emp c_emp%ROWTYPE;
i NUMBER;
BEGIN
i:=1;
OPEN c_emp;
FETCH c_emp INTO vr_emp;
WHILE c_emp%FOUND AND i<=5 LOOP
DBMS_OUTPUT.PUT_LINE(vr_emp.apellido ||
' * '|| vr_emp.salario);
FETCH c_emp INTO vr_emp;
i:=I+1;
END LOOP;
CLOSE c_emp;
END emp_5maxsal;

OPEN...FETCH...
2 .- Ejemplos de como como recorrer un cursor.
5) Codificar un programa que visualice los dos empleados que ganan menos de cada oficio.
CREATE OR REPLACE PROCEDURE emp_2minsal
AS
CURSOR c_emp IS
SELECT apellido, oficio, salario FROM emple
ORDER BY oficio, salario;
vr_emp c_emp%ROWTYPE;
oficio_ant EMPLE.OFICIO%TYPE;
i NUMBER;
BEGIN
OPEN c_emp;
oficio_ant:='*';
FETCH c_emp INTO vr_emp;
WHILE c_emp%FOUND LOOP
IF oficio_ant <> vr_emp.oficio THEN
oficio_ant := vr_emp.oficio;
i := 1;
END IF;
IF i <= 2 THEN
DBMS_OUTPUT.PUT_LINE(vr_emp.oficio||' * '
||vr_emp.apellido||' * '
||vr_emp.salario);
END IF;
FETCH c_emp INTO vr_emp;
i:=I+1;
END LOOP;
CLOSE c_emp;
END emp_2minsal;

6) Escribir un programa que muestre, en formato similar a las rupturas de control o secuencia vistas en SQL*plus los siguientes datos:
- Para cada empleado: apellido y salario.
- Para cada departamento: Número de empleados y suma de los salarios del departamento.
- Al final del listado: Número total de empleados y suma de todos los salarios.
CREATE OR REPLACE PROCEDURE listar_emple
AS
CURSOR c1 IS
SELECT apellido, salario, dept_no FROM emple
ORDER BY dept_no, apellido;
vr_emp c1%ROWTYPE;
dep_ant EMPLE.DEPT_NO%TYPE;
cont_emple NUMBER(4) DEFAULT 0;
sum_sal NUMBER(9) DEFAULT 0;
tot_emple NUMBER(4) DEFAULT 0;
tot_sal NUMBER(10) DEFAULT 0;
BEGIN
OPEN c1;
FETCH c1 INTO vr_emp;
IF c1%FOUND THEN
dep_ant := vr_emp.dept_no;
END IF;
WHILE c1%FOUND LOOP
/* Comprobación nuevo departamento y resumen */
IF dep_ant <> vr_emp.dept_no THEN
DBMS_OUTPUT.PUT_LINE('*** DEPTO: ' || dep_ant ||
' NUM. EMPLEADOS: '||cont_emple ||
' SUM. SALARIOS: '||sum_sal);
dep_ant := vr_emp.dept_no;
tot_emple := tot_emple + cont_emple;
tot_sal:= tot_sal + sum_sal;
cont_emple:=0;
sum_sal:=0;
END IF;
/* Líneas de detalle */
DBMS_OUTPUT.PUT_LINE(RPAD(vr_emp.apellido,10)|| ' * '
||LPAD(TO_CHAR(vr_emp.salario,'9,999,999'),12));

/* Incrementar y acumular */
cont_emple := cont_emple + 1;
sum_sal:=sum_sal + vr_emp.salario;
FETCH c1 INTO vr_emp;
END LOOP;
CLOSE c1;
IF cont_emple > 0 THEN
/* Escribir datos del último departamento */
DBMS_OUTPUT.PUT_LINE('*** DEPTO: ' || dep_ant ||
' NUM EMPLEADOS: '|| cont_emple ||
' SUM. SALARIOS: '||sum_sal);
dep_ant := vr_emp.dept_no;
tot_emple := tot_emple + cont_emple;
tot_sal:= tot_sal + sum_sal;
cont_emple:=0;
sum_sal:=0;
/* Escribir totales informe */
DBMS_OUTPUT.PUT_LINE(' ****** NUMERO TOTAL EMPLEADOS: '
||tot_emple ||
' TOTAL SALARIOS: '|| tot_sal);
END IF;
END listar_emple;
/* Nota: este procedimiento puede escribirse de forma que la visualización de los resultados resulte mas clara incluyendo líneas de separación, cabeceras de columnas, etcétera. Por razones didácticas no se han incluido estos elementos ya que pueden distraer y dificultar la comprensión del código. */
7) Desarrollar un procedimiento que permita insertar nuevos departamentos según las siguientes especificaciones:
Se pasará al procedimiento el nombre del departamento y la localidad.
El procedimiento insertará la fila nueva asignando como número de departamento la decena siguiente al número mayor de la tabla.
Se incluirá gestión de posibles errores.
CREATE OR REPLACE PROCEDURE insertar_depart(
nombre_dep VARCHAR2,
loc VARCHAR2)
AS
CURSOR c_dep IS SELECT dnombre
FROM depart WHERE dnombre = nombre_dep;
v_dummy DEPART.DNOMBRE%TYPE DEFAULT NULL;
v_ulti_num DEPART.DEPT_NO%TYPE;
nombre_duplicado EXCEPTION;
BEGIN
/* Comprobación de que el departamento no está duplicado */
OPEN c_dep;
FETCH c_dep INTO v_dummy;
CLOSE c_dep;
IF v_dummy IS NOT NULL THEN
RAISE nombre_duplicado;
END IF;
/* Captura del último número y cálculo del siguiente */
SELECT MAX(dept_no) INTO v_ulti_num FROM depart;

/* Inserción de la nueva fila */
INSERT INTO depart VALUES ((TRUNC(v_ulti_num, -1)+10)
, nombre_dep, loc);
EXCEPTION
WHEN nombre_duplicado THEN
DBMS_OUTPUT.PUT_LINE('Err. departamento duplicado');
RAISE;
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20005,
'Err. Operación cancelada’);
END insertar_depart;

8) Escribir un procedimiento que reciba todos los datos de un nuevo empleado procese la transacción de alta, gestionando posibles errores.
CREATE OR REPLACE PROCEDURE alta_emp(
num emple.emp_no%TYPE,
ape emple.apellido%TYPE,
ofi emple.oficio%TYPE,
jef emple.dir%TYPE,
fec emple.fecha_alt%TYPE,
sal emple.salario%TYPE,
com emple.comision%TYPE DEFAULT NULL,
dep emple.dept_no%TYPE)
AS
v_dummy_jef EMPLE.DIR%TYPE DEFAULT NULL;
v_dummy_dep DEPART.DEPT_NO%TYPE DEFAULT NULL;
BEGIN
/* Comprobación de que existe el departamento */
SELECT dept_no INTO v_dummy_dep
FROM depart WHERE dept_no = dep;
/* Comprobación de que existe el jefe del empleado */
SELECT emp_no INTO v_dummy_jef
FROM emple WHERE emp_no = jef;
/* Inserción de la fila */
INSERT INTO EMPLE VALUES
(num, ape, ofi, jef, fec, sal, com, dep);
EXCEPTION
WHEN NO_DATA_FOUND THEN
IF v_dummy_dep IS NULL THEN
RAISE_APPLICATION_ERROR(-20005,
'Err. Departamento inexistente');
ELSIF v_dummy_jef IS NULL THEN
RAISE_APPLICATION_ERROR(-20005,
'Err. No existe el jefe');
ELSE
RAISE_APPLICATION_ERROR(-20005,
'Err. Datos no encontrados(*)');
END IF;
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE
('Err.numero de empleado duplicado');
RAISE;
END alta_emp;

WHILE...FOUND...LOOP...
3 .- Ejemplos como procedimientos con cursores y parámetros de entrada.
9) Codificar un procedimiento reciba como parámetros un numero de departamento, un importe y un porcentaje; y suba el salario a todos los empleados del departamento indicado en la llamada. La subida será el porcentaje o el importe indicado en la llamada (el que sea más beneficioso para el empleado en cada caso empleado).
CREATE OR REPLACE PROCEDURE subida_sal1(
num_depar emple.dept_no%TYPE,
importe NUMBER,
porcentaje NUMBER)
AS
CURSOR c_sal IS SELECT salario,ROWID
FROM emple WHERE dept_no = num_depar;
vr_sal c_sal%ROWTYPE;
v_imp_pct NUMBER(10);
BEGIN
OPEN c_sal;
FETCH c_sal INTO vr_sal;
WHILE c_sal%FOUND LOOP
/* Guardar en v_imp_pct el importe mayor */
v_imp_pct :=
GREATEST((vr_sal.salario/100)*porcentaje,
v_imp_pct);
/* Actualizar */
UPDATE EMPLE SET SALARIO=SALARIO + v_imp_pct
WHERE ROWID = vr_sal.rowid;

FETCH c_sal INTO vr_sal;
END LOOP;
CLOSE c_sal;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Err. ninguna fila actualizada');
END subida_sal1;

10) Escribir un procedimiento que suba el sueldo de todos los empleados que ganen menos que el salario medio de su oficio. La subida será de el 50% de la diferencia entre el salario del empleado y la media de su oficio. Se deberá asegurar que la transacción no se quede a medias, y se gestionarán los posibles errores.
CREATE OR REPLACE PROCEDURE subida_50pct
AS
CURSOR c_ofi_sal IS
SELECT oficio, AVG(salario) salario FROM emple
GROUP BY oficio;
CURSOR c_emp_sal IS
SELECT oficio, salario FROM emple E1
WHERE salario <
(SELECT AVG(salario) FROM emple E2
WHERE E2.oficio = E1.oficio)
ORDER BY oficio, salario FOR UPDATE OF salario;

vr_ofi_sal c_ofi_sal%ROWTYPE;
vr_emp_sal c_emp_sal%ROWTYPE;
v_incremento emple.salario%TYPE;

BEGIN
COMMIT;
OPEN c_emp_sal;
FETCH c_emp_sal INTO vr_emp_sal;
OPEN c_ofi_sal;
FETCH c_ofi_sal INTO vr_ofi_sal;
WHILE c_ofi_sal%FOUND AND c_emp_sal%FOUND LOOP
/* calcular incremento */
v_incremento :=
(vr_ofi_sal.salario - vr_emp_sal.salario) / 2;
/* actualizar */
UPDATE emple SET salario = salario + v_incremento
WHERE CURRENT OF c_emp_sal;
/* siguiente empleado */
FETCH c_emp_sal INTO vr_emp_sal;
/* comprobar si es otro oficio */
IF c_ofi_sal%FOUND and
vr_ofi_sal.oficio <> vr_emp_sal.oficio THEN
FETCH c_ofi_sal INTO vr_ofi_sal;
END IF;
END LOOP;
CLOSE c_emp_sal;
CLOSE c_ofi_sal;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK WORK;
RAISE;
END subida_50pct;

11) Diseñar una aplicación que simule un listado de liquidación de los empleados según las siguientes especificaciones:
- El listado tendrá el siguiente formato para cada empleado:
**********************************************************************
Liquidación del empleado:...................(1) Dpto:.................(2) Oficio:...........(3)
Salario : ............(4)
Trienios :.............(5)
Comp. Responsabil :.............(6)
Comisión :.............(7)
------------
Total :.............(8)
**********************************************************************
- Donde:
1 ,2, 3 y 4 Corresponden al apellido, departamento, oficio y salario del empleado.
5 Es el importe en concepto de trienios. Cada trienio son tres años completos desde la fecha de alta hasta la de emisión y supone 5000 Ptas.
6 Es el complemento por responsabilidad. Será de 10000Ptas por cada empleado que se encuentre directamente a cargo del empleado en cuestión.
7 Es la comisión. Los valores nulos serán sustituidos por ceros.
8 Suma de todos los conceptos anteriores.
– El listado irá ordenado por Apellido.
CREATE OR REPLACE PROCEDURE liquidar
AS
CURSOR c_emp IS
SELECT apellido, emp_no, oficio, salario,
NVL(comision,0) comision, dept_no, fecha_alt
FROM emple
ORDER BY apellido;
vr_emp c_emp%ROWTYPE;
v_trien NUMBER(9) DEFAULT 0;
v_comp_r NUMBER(9);
v_total NUMBER(10);
BEGIN
FOR vr_emp in c_emp LOOP
/* Calcular trienios. Llama a la función trienios
creada en el ejercicio 11.8 */
v_trien := trienios(vr_emp.fecha_alt,SYSDATE)*5000;

/* Calcular complemento de responsabilidad.
Se
encierra en un bloque pues levantará NO_DATA_FOUND*/
BEGIN
SELECT COUNT(*) INTO v_comp_r
FROM EMPLE WHERE DIR = vr_emp.emp_no;
v_comp_r := v_comp_r *10000;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_comp_r:=0;
END;
/* Calcular el total del empleado */
v_total := vr_emp.salario + vr_emp. comision +
v_trien + v_comp_r;
/* Visualizar datos del empleado */
DBMS_OUTPUT.PUT_LINE('*************************************');
DBMS_OUTPUT.PUT_LINE(' Liquidacion de : '|| vr_emp.apellido
||' Dpto: ' || vr_emp.dept_no
|| ' Oficio: ' || vr_emp.oficio);
DBMS_OUTPUT.PUT_LINE(RPAD('Salario:',16)
||LPAD(TO_CHAR(vr_emp.salario,'9,999,999'),12));
DBMS_OUTPUT.PUT_LINE(RPAD('Trienios: ',16)
|| LPAD(TO_CHAR(v_trien,'9,999,999'),12));
DBMS_OUTPUT.PUT_LINE('Comp.
Respons: '
||LPAD(TO_CHAR(v_comp_r,'9,999,999'),12));
DBMS_OUTPUT.PUT_LINE(RPAD('Comision: ' ,16)
||LPAD(TO_CHAR(vr_emp.comision,'9,999,999'),12));
DBMS_OUTPUT.PUT_LINE('------------------');
DBMS_OUTPUT.PUT_LINE(RPAD(' Total : ',16)
||LPAD(TO_CHAR(v_total,'9,999,999') ,12));
DBMS_OUTPUT.PUT_LINE('**************************************');
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No se ha encontrado ninguna fila');
END liquidar;
/* Nota: También se puede utilizar una cláusula SELECT más compleja:
CURSOR c_emp IS
SELECT APELLIDO, EMP_NO, OFICIO,
(EMP_CARGO * 10000) COM_RESPONSABILIDAD,
SALARIO, NVL(COMISION, 0) COMISION, DEPT_NO,
TRIENIOS(FECHA_ALT, SYSDATE) * 5000 TOT_TRIENIOS
FROM EMPLE,(SELECT DIR,COUNT(*) EMP_CARGO FROM EMPLE
GROUP BY DIR) DIREC
WHERE EMPLE.EMP_NO = DIREC.DIR(+)
ORDER BY APELLIDO;
de esta forma se simplifica el programa y se evita la utilización de variables de trabajo. */

12) Crear la tabla T_liquidacion con las columnas apellido, departamento, oficio, salario, trienios, comp_responsabilidad, comisión y total; y modificar la aplicación anterior para que en lugar de realizar el listado directamente en pantalla, guarde los datos en la tabla. Se controlarán todas las posibles incidencias que puedan ocurrir durante el proceso.
CREATE TABLE t_liquidacion (
APELLIDO VARCHAR2(10),
DEPARTAMENTO NUMBER(2),
OFICIO VARCHAR2(10),
SALARIO NUMBER(10),
TRIENIOS NUMBER(10),
COMP_RESPONSABILIDAD NUMBER(10),
COMISION NUMBER(10),
TOTAL NUMBER(10)
);
CREATE OR REPLACE PROCEDURE liquidar2
AS
CURSOR c_emp IS
SELECT apellido, emp_no, oficio, salario,
NVL(comision,0) comision, dept_no, fecha_alt
FROM emple
ORDER BY apellido;
vr_emp c_emp%ROWTYPE;
v_trien NUMBER(9) DEFAULT 0;
v_comp_r NUMBER(9);
v_total NUMBER(10);
BEGIN
COMMIT WORK;
FOR vr_emp in c_emp LOOP
/* Calcular trienios. Llama a la función trienios
creada en el ejercicio 11.8 */
v_trien := trienios(vr_emp.fecha_alt,SYSDATE)*5000;

/* Calcular complemento de responsabilidad.
Se
encierra en un bloque pues levantará NO_DATA_FOUND*/
BEGIN
SELECT COUNT(*) INTO v_comp_r
FROM EMPLE WHERE DIR = vr_emp.emp_no;
v_comp_r := v_comp_r *10000;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_comp_r:=0;
END;
/* Calcular el total del empleado */
v_total := vr_emp.salario + vr_emp. comision +
v_trien + v_comp_r;
/* Insertar los datos en la tabla T_liquidacion */
INSERT INTO t_liquidacion
(APELLIDO, OFICIO, SALARIO, TRIENIOS,
COMP_RESPONSABILIDAD, COMISION, TOTAL)
VALUES
(vr_emp.apellido, vr_emp.oficio, vr_emp.salario,
v_trien, v_comp_r, vr_emp.comision, v_total);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK WORK;
END liquidar2;

CURSORES (PROMEDIO)

CURSORES (PROMEDIO)
create table estudiantes
(codest number(4) primary key,
nomest varchar2(25),
apeest varchar2(25),
not1 number(2,1),
not2 number(2,1),
not3 number(2,1));

insert into estudiantes values (10,'camilo','rodriguez',4.6,2.9,3.5);
insert into estudiantes values (20,'jorge','cano',4.8,4.1,4.7);
insert into estudiantes values (30,'juan','gomez',2.5,2.1,1.5);
insert into estudiantes values (40,'haider','cotta',3.3,4.6,4.5);
insert into estudiantes values (50,'maicol','garcia',3.8,2.4,2.9);

select * from estudiantes;

set serveroutput on;
declare cursor notasest
is
select codest,nomest,not1,not2,not3
from estudiantes;
codest number (4);
nomest varchar2(25);
nt1 number(2,1);
nt2 number(2,1);
nt3 number(2,1);
nota1 number(3,2):= 0;
begin
  open notasest;
  loop
  fetch  notasest into codest,nomest , nt1,nt2,nt3;
  exit when  notasest%notfound;
  nota1 :=  (nt1 + nt2+nt3)/3;
  dbms_output.put_line(notasest%rowcount||'notaest:' || nota1);
  end loop;
  close  notasest;
  end;

SALARIO BAJO O ALTO SQL - FUNCION

SALARIO BAJO O ALTO SQL  - FUNCION
 CREAR TABLA TRABAJADORES (cambiar nombre)


create or replace function f_salario (avalor number)
  return varchar
 is
  TIPODESALARIO varchar(20);
 begin
    TIPODESALARIO:='';
   if avalor<=900000 then
    TIPODESALARIO:='bajo salario';
   else TIPODESALARIO:='alto salario';
   end if;
   return TIPODESALARIO;
 end;

  select NOMBRETRABAJADOR,f_salario(TIPODESALARIO) from TRABAJADORES;

TRIGGER - SQL

TRIGGER - SQL
create table estudiantes(codest number(3) not null primary key,nomest varchar2(20));

create table control(usuario varchar2(5),  fecha date);


create or replace trigger t_control
before insert on estudiantes
begin
  insert into control values(user,sysdate);
  end t_control;
 
 
  insert into estudiantes values
  (10,'picoro');
  insert into estudiantes values
  (20,'Bulma');
  insert into estudiantes values
  (30,'Mroshi');
 
  SELECT * FROM ESTUDIANTES;
  select*FROM CONTROL;

SQL CALCULAR PROMEDIOS

SQL CALCULAR PROMEDIOS
CREATE TABLE ESTUDIANTES
(
CODE NUMBER (3) NOT NULL ,
NOMBRE VARCHAR2 (20) ,
CARRERA VARCHAR2 (30)
) ;
ALTER TABLE ESTUDIANTES ADD CONSTRAINT ESTUDIANTES_PK PRIMARY KEY ( CODE ) ;


CREATE TABLE MATERIAS
( CODM NUMBER (3) NOT NULL , MATERIA VARCHAR2 (30)
) ;
ALTER TABLE MATERIAS ADD CONSTRAINT MATERIAS_PK PRIMARY KEY ( CODM ) ;

CREATE TABLE NOTAS
(
CODE NUMBER (3) NOT NULL ,
CODM NUMBER (3) NOT NULL ,
N1 FLOAT (2) ,
N2 FLOAT (2) ,
N3 FLOAT (2)
) ;
ALTER TABLE NOTAS ADD CONSTRAINT NOTAS_PK PRIMARY KEY ( CODE, CODM ) ;


ALTER TABLE NOTAS ADD CONSTRAINT FK_ASS_1 FOREIGN KEY ( CODE ) REFERENCES ESTUDIANTES ( CODE ) ;

ALTER TABLE NOTAS ADD CONSTRAINT FK_ASS_2 FOREIGN KEY ( CODM ) REFERENCES MATERIAS ( CODM ) ;


INSERTANDO DATOS A LA TABLA


INSERT INTO ESTUDIANTES VALUES
(1,'GOKU','ARTESMARCIALES');

INSERT INTO ESTUDIANTES VALUES
(2,'KRILIN','TAEKONDO');

INSERT INTO ESTUDIANTES VALUES
(3,'PICOLO','BOTANICA');

INSERT INTO MATERIAS VALUES
(10,'BIOLOGIA');

INSERT INTO MATERIAS VALUES
(20,'DEPORTES');

INSERT INTO MATERIAS VALUES
(30,'QUIMICA');

INSERT INTO NOTAS VALUES
(1,10,3.5,4.5,3.9);
INSERT INTO NOTAS VALUES
(1,30,4,3.5,3.8);
INSERT INTO NOTAS VALUES
(2,10,3.9,4.2,4.1);
INSERT INTO NOTAS VALUES
(2,20,4.3,4,4.3);
INSERT INTO NOTAS VALUES
(3,10,3.5,3.2,4.2);
INSERT INTO NOTAS VALUES
(3,30,3.3,4,3);


FUNCIONES Y RESULTADOS

CREATE OR REPLACE FUNCTION DEFINITIVA (n1 NUMBER,n2 NUMBER,n3 NUMBER)

return NUMBER

is

DEF float;

begin

DEF := (N1*0.3+N2*03+N3*0.4);

return DEF;

end DEFINITIVA;


SELECT E.CODE,E.NOMBRE,M.MATERIA ,N.N1 "PRIMERA NOTA",N.N2 "SEGUNDA NOTA",N.N3 "TERCERANOTA",DEFINITIVA (N1/3,N2/3,N3/3) "PROMEDIO ALUMNO"

FROM NOTAS N

INNER JOIN ESTUDIANTES E ON N.CODE = E.CODE

INNER JOIN MATERIAS M ON M.CODM = N.CODM


Cuadratica en SQL






create or replace procedure p_cuadratica(a number, b number, c number)
is
r1 number(7,2);
r2 number(7,2);
res number(7,2);
pot number(7,2);
rad number(7,2);
begin
   pot:=power(b,2);
   res:=4*a*c;
   rad:=pos-res;
   DBMS_OUTPUT.PUT_LINE('POTENCIA: '||POST);
   DBMS_OUTPUT.PUT_LINE('RADICAL: '||RAD);
   DBMS_OUTPUT.PUT_LINE('RESTA: '||REST);
 
   IF (rad > 0)then
      r1:=-(b-sqrt(pot-res))/2*a;
      r2:=-(b-sqrt(pot-res))/2*a;
      DBMS_OUTPUT.PUT_LINE('RAIZ 1: '||R1);
      DBMS_OUTPUT.PUT_LINE('RAIZ 2: '||R2);
   ELSE
   DBMS_OUTPUT.PUT_LINE('RAIZ NO VAILDA');
   END IF;
   END p_cuadratica;
   

OPERACIONES EN SQL

OPERACIONES EN SQL


CREATE OR REPLACE FUNCTION iva(numero1 NUMBER)
  RETURN NUMBER
IS
 suma NUMBER;
 BEGIN
   suma :=numero1 * 0.19;
   RETURN suma;
 END;

SELECT iva(196330000)
FROM dual;


DIVISION

CREATE OR REPLACE FUNCTION DIVISION(NUMERO1 NUMBER,NUMERO2 NUMBER)
  RETURN NUMBER
IS
 DIVISION NUMBER;
 BEGIN
   DIVISION :=NUMERO1 / NUMERO2;
   RETURN DIVISION;
 END;

SELECT DIVISION(7,2)
FROM dual;

RESTA

CREATE OR REPLACE FUNCTION RESTA(NUMERO1 NUMBER,NUMERO2 NUMBER)
  RETURN NUMBER
IS
 RESTA NUMBER;
 BEGIN
   RESTA :=NUMERO1 - NUMERO2;
   RETURN RESTA;
 END;

SELECT RESTA(7,2)
FROM dual;


DIVIDIR CONDICION

CREATE OR REPLACE FUNCTION DIVID(NUM1 NUMBER, NUM2 NUMBER)
RETURN NUMBER
IS
DIVID NUMBER;
BEGIN
IF NUM2 <> 0 THEN
RETURN NUM1/NUM2;
ELSE
RETURN 0;
END IF;
END;

SELECT DIVID (7,0)
FROM DUAL;

SELECT DIVID (7,0)
FROM DUAL;



create or replace FUNCTION F_DIVISION(N1 NUMBER,N2 NUMBER)
  RETURN NUMBER AS DIVIN NUMBER;
 BEGIN
   DIVIN :=N1/N2;
EXCEPTION
  WHEN zero_divide THEN
       dbms_output.put_line('el valor no puede ser negativo');
       RETURN DIVIN;

END F_DIVISION;


SELECT F_DIVISION(120,0) Division from dual;

PARCIAL 2

PARCIAL 2

CREATE TABLE clientes
  (
    codicliente NUMBER (6) NOT NULL ,
    nombre      VARCHAR2 (6) NOT NULL ,
    telefono    NUMBER (10) NOT NULL
  ) ;
ALTER TABLE clientes ADD CONSTRAINT clientes_PK PRIMARY KEY ( codicliente ) ;


CREATE TABLE productosdeaseo
  (
    codpro      NUMBER (6) NOT NULL ,
    Nomproducto VARCHAR2 (15) NOT NULL ,
    ValorPro    NUMBER (6) NOT NULL
  ) ;
ALTER TABLE productosdeaseo ADD CONSTRAINT productosdeaseo_PK PRIMARY KEY ( codpro ) ;


CREATE TABLE ventas
  (
    clientes_codicliente   NUMBER (6) NOT NULL ,
    productosdeaseo_codpro NUMBER (6) NOT NULL ,
    Fecha                  DATE NOT NULL ,
    cantidadventa          NUMBER NOT NULL ,
    valorunitario          NUMBER (6) NOT NULL ,
    Nomproducto            VARCHAR2 (15) NOT NULL
  ) ;
ALTER TABLE ventas ADD CONSTRAINT ventas_PK PRIMARY KEY ( clientes_codicliente, productosdeaseo_codpro ) ;


ALTER TABLE ventas ADD CONSTRAINT FK_ASS_1 FOREIGN KEY ( clientes_codicliente ) REFERENCES clientes ( codicliente ) ;

ALTER TABLE ventas ADD CONSTRAINT FK_ASS_2 FOREIGN KEY ( productosdeaseo_codpro ) REFERENCES productosdeaseo ( codpro ) ;


CONSULTAS
SELECT NOMBRECLIENTE,NOMPRODUCTO,CANTIDADVENTA,VALORTOTAL FROM "VENTAS";
SELECT SUM (VALORTOTAL) FROM "VENTAS";
select count(*)from "CLIENTES";

Añadir columnas, editar columnas, realizar funciones

Añadir columnas, editar columnas, realizar funciones
Añadir columnas

ALTER TABLE ESTUDIANTES
ADD ciudad VARCHAR2(20);
Editar columnas
ALTER TABLE ESTUDIANTES
MODIFY ID NUMBER(3);
Creación de ID auto-incrementable con secuencias
1. Creamos la tabla
CREATE TABLE ADMINISTRADORA(
  ID NUMBER(5PRIMARY KEY,
  NOMBRE VARCHAR2(20),
  FECHA DATE);
2. Creamos una secuencia
CREATE SEQUENCE SEQ_ADMIN_ID
START WITH 1
INCREMENT BY 1
NOMAXVALUE;
SEQ_ADMIN_ID =  Nombre de secuencia
START WITH = Valor inicial
INCREMENT BY = Tipo de incremento ejem : [1,2,3,4,5,6][2,4,6,8,10][10,20,30,40,50];
NOMAXVALUE = Valor máximo para los id

3. Creamos un disparador que se ejecuta antes de añadir los datos
CREATE TRIGGER TRIG_ADMIN_ID
  BEFORE INSERT ON ADMINISTRADORA
  FOR EACH ROW
  BEGIN
    SELECT SEQ_ADMIN_ID.nextval INTO :new.ID FROM dual;
  END;
TRIG_ADMIN_ID = Nombre de disparador
BEFORE INSERT ON = Ejecución de disparador antes de cada fila
BEGIN = Iniciar disparador
SEQ_ADMIN_ID.nextval = Llama al próximo valor en la secuencia
INTO:new.ID = inserta el nuevo en la fila
END = termina el disparador

4. Insertar datos en la tabla
INSERT INTO ADMINISTRADORA (NOMBRE, FECHA)
VALUES ('nombre2'to_date('10/08/1995''dd/mm/yyyy'));
De esta manera el ID se añadirá automáticamente sin repetirse.

 Creación de funciones para código repetitivo

1. Creamos la tabla
CREATE TABLE viajes(
  id NUMBER(10PRIMARY KEY,
  nombre VARCHAR2(100NOT NULL,
  fecha DATE
);
 2. Creamos la función seteando los parámetros.
CREATE OR REPLACE PROCEDURE agregarViaje (id IN NUMBER, nombre IN VARCHAR2, fecha IN DATE)
agregarViaje = Nombre de la función o procedimiento
(id IN NUMBER, .....) = Los parámetros que va recibir la función
2.2 Iniciamos la función y añadimos el código a ejecutar y finalizamos la función
IS BEGIN
  INSERT INTO viaje (id, nombre, fecha)
    VALUES (id, nombre, fecha);
  COMMIT;
END;
IS BEGIN = Inicia la función
INSERT INTO = Ingresa los datos a la tabla viaje
VALUES = Aquí se pasan  los parámetros configurados al inicio de la función
El código debe terminar así, se ejecuta un sola vez y queda guardado en memoria
CREATE OR REPLACE PROCEDURE agregarViaje (id IN NUMBER, nombre IN VARCHAR2, fecha IN DATE)
  IS BEGIN
  INSERT INTO viaje (id, nombre, fecha)
    VALUES (id, nombre, fecha);
  COMMIT;
END;
2.3 Insertar datos a la tabla con el proceso anteriormente almacenado
CALL agregarViaje(100,'Nombre'current_date);
CALL = Llama la función
agregarViaje = al nombre de la función
(100,....) = Parámetros a insertar en la tabla

De esta manera solo llamamos agregarViaje() para insertar datos en la tabla y prescindir de las repeticiones de código.

3 Plus Id auto incrementable en la función
3.1 Creamos la secuencia
CREATE SEQUENCE VIAJE_SEQUENCE
  MINVALUE 1
  START WITH 1
  INCREMENT BY 1;
3.2 Insertamos la secuencia en la función
CREATE OR REPLACE PROCEDURE agregarViaje (nombre IN VARCHAR2, fecha IN DATE)
  IS BEGIN
  INSERT INTO viaje (id, nombre, ciudad, fecha)
    VALUES (VIAJE_SEQUENCE.nextval, nombre, ciudad, fecha);
  COMMIT;
END;
VIAJE_SEQUENCE.nextval = ID auto incrementable
3.3 Insertamos datos en la tabla

CALL agregarViaje('Nombre'current_date);
De esta manera prescindimos de repeticiones de código y de la inserción del id manual.


SQL PLUS crear tablas desde cmd o SQL plus

SQL PLUS crear tablas desde cmd o SQL plus
Intruccion SQL PLUS

en cmd / sqlplus

sqlplus


SQL> disconn

Desconectar cualquier usuario de la base de datos
SQL> conn

introduzca el nombre de usuario: ejemplo
introduzca la contraseña; B12345

SQL> create table estudiantes 
(codest number(3) not null primary key, nomest varchar2(20) not null,
edad number(2) not null);

create table materias
(codmat number(3) not null primary key, 
nommat varchar 2(20) not null);

create table notas
(codest number(3) not null,
codmat number(3) not null, 
n1 number(3,1), n2 number(3,1));


alter table notas add constraint fk_cod_est
foreign key (codest)
references estudiantes(codest);

desc estudiantes;
desc materias;
desc notas;

insert into estudiantes values
(10,'hugo',54)
insert into estudiantes values
(20,'juan',20)
insert into estudiantes values
(30,'diana',20)
insert into estudiantes values
(40,'diana',19)

select nomest from estudiantes where nomest like '%s';
select nomest NOMBRE, edad from estudiantes where edad in(19,20);

insert into materias values (30,'ingles');
insert into materias values (20,'modelado');
insert into materias values (10,'calculo');



select*from materias;


select nommat from materias where nommat like '___e%';
insert into notas values (10,10,3.5,3.5);
insert into notas values (10,20,4.5,5);
insert into notas values (10,20,3.5,4.6);
insert into notas values (20,10,3.5,4.2);
insert into notas values (20,20,2.5,1);
insert into notas values (20,30,2,3);

select*from notas;

select e.nomest NOMBRE,  m.nommat
from estudiantes e join notas n on e.codest=n.codest
join materias m on m.codmat=n.codmat;



select e.nomest NOMBRE, e.EDADEST, m.NOMMAT FROM ESTUDIANTES e
INNER JOIN NOTAS n
ON e.codest =n.CODEST INNER JOIN MATERIAS m ON n.CODMAT = m.CODMAT
where m.CODMAT = 10;







SELECT e.nomest, m.nommat, (n,N1 +n.N2)/2 Notafinal FROM ESTUDIANTES e JOIN NOTAS n
ON e.codest =n.CODEST INNER JOIN MATERIAS m ON n.CODMAT = m.CODMAT WHERE (n.N1 + n.N2)/2 < 3;

Eliminar y actualizar datos Oracle

Eliminar y actualizar datos Oracle
Instrucción para eliminar todos los datos de una tabla.
en donde Empleados es la tabla

DELETE FROM Empleados;

Actualizar una fila en una tabla
en donde Empleados es la tabla
NombreEmp es el campo a cambiar
Arturo es el nuevo campo
CodEmp es el identificador de la fila a cambiar

UPDATE Empleados
SET  NombreEmp = 'Arturo'
WHERE CodEmp = '100';

PREGUNTAS CAPITULO 2 Procesamiento de Bases de Datos

PREGUNTAS CAPITULO 2 Procesamiento de Bases de Datos
base de datos, que tal si respondemos esas preguntas de final de el capitulo dos? el profesor dijo que respondieramos eso y seria bueno en grupo.

son las siguientes., (es una sugerencia)

2.1 Nombre los componentes principales del sistema de una base de datos y explique brevemente la función de cada uno.

Los datos del usuario:
Los metadatos:  una base de datos se describe por sí misma, lo que
significa que contiene una descripción de su estructura como parte de sí misma. Esta descripción
se llama metadatos

Los índices:es una estructura de datos que mejora la velocidad de las operaciones, por medio de identificador único de cada fila de una tabla, permitiendo un rápido acceso a los registros de una tabla en una base de datos.
Los metadatos de aplicaciones.

2.2 Dé un ejemplo, aparte del ya mencionado en este capítulo, sobre una relación que tienda a presentar problemas cuando se actualiza. Utilice la relación R1 como base, referencia.


2.3 Transforme la relación de su respuesta en la pregunta
2.2 en dos o más relaciones que no tengan problemas de actualización. Utilice las relaciones R2 y R3 como ejemplos.

2.4 Explique las funciones de los metadatos y de las tablas de sistema.


2.5 ¿Cuál es la función de los índices? ¿En qué momento son deseables y cuál es su costo?
2.6 ¿Cuál es la función de los metadatos de aplicación? ¿Cómo difieren de los metadatos?
 2.7 Explique las características y funciones del subsistema de las herramientas de diseño de un DBMS.
2.8 Describa las características y funciones del subsistema run-time de un DBMS. Capítulo dos Introducción al desarrollo de una base de datos 45
2.9 Explique las características y funciones del motor DBMS.
2.10 ¿De qué consta el esquema de una base de datos? Enumere sus componentes.
 2.11 ¿Cómo se representan las relaciones en el diseño de una base de datos relacional? Proporcione un ejemplo sobre dos tablas con una relación 1:N y explique cómo se expresa la relación en los datos. 2.12 ¿Qué es un dominio y por qué es importante?
 2.13 ¿Qué son las reglas del negocio? Dé un ejemplo sobre posibles reglas del negocio para las relaciones en su respuesta a la pregunta
 2.11. 2.14 ¿Qué es una llave externa? ¿Cuáles columnas en su respuesta a la pregunta 2.11 representan una llave externa? 2.15 Explique el propósito de las formas, consultas y menúes. 2.16 Explique la diferencia entre la consulta mediante ejemplo y la consulta por forma (QBF). 2.17 ¿Cuál es la primera tarea importante en el desarrollo de una base de datos y aplicaciones relacionadas? 2.18 ¿Cuál es la función de un prototipo? 2.19 Describa el desarrollo de lo general a lo particular. ¿Cuáles son sus ventajas y desventajas? 2.20 Describa el desarrollo de lo particular a lo general. ¿Cuáles son sus ventajas y desventajas? 2.21 Explique los dos significados diferentes del término modelo de datos


Clase 2 MODELAMIENTO DE BASES DE DATOS

Clase 2 MODELAMIENTO DE BASES DE DATOS
Campo: es igual a un atributo o columna
Atributo: Representa una propiedad de interés de una entidad. Los atributos se describen en la estructura de la base de datos empleando un modelo de datos. Por ejemplo, se podría tener una entidad llamada "Alumno"
Registro: es igual a una fila o una tupla
Tabla: conjunto de registros
Entidad o afinidad: conjunto de campos
Base de Datos:  una base de datos es un conjunto autodescriptivo de registros integrados.
diccionario de datos (o también directorio de datos o metadatos). UNA BASE DE DATOS ES UN MODELO DE UN MODELO

DOMINIOS. Un dominio es un conjunto de valores que puede tener una columna
Tabla:  Se refiere al tipo de modelado de datos, donde se guardan los datos recogidos por un programa

Las tablas se componen de dos estructuras:

Registro
Campo




Metadatos:  Es una descripción de su estructura como parte de sí misma

DBMS (Data Base Management System). Son las siglas en inglés para los Sistemas de Gestión de Bases de Datos (SGBD)

Base de datos relacional: La ventaja del modelo relacional es que los datos se almacenan de tal forma que minimizan la duplicación y se eliminan ciertos tipos de errores de procesamiento que pueden ocurrir cuando se almacenan datos de otras maneras.


JERARQUIA DE LOS DATOS: los bits se agrupan en bytes o caracteres;
los caracteres se agrupan en campos; los campos integran registros, y los registros
se agrupan en archivos

 Indices: se utilizan para representar las relaciones entre los datos. Mejora el funcionamiento y el acceso a la base de datos. Estos datos, a los que a veces se les llama datos significativos, constan principalmente
de índices, aunque algunas veces se utilizan otros tipos de estructuras de datos,
tales como las listas vinculadas (véase el Apéndice A para un análisis de índices y
de las listas vinculadas).


sistemas de procesamiento de archivos, .

Bits > Bytes o caracteres > campos > registros > archivos

Sistemas de base de datos

Bits > Bytes o caracteres > campos > registros > Archivos >  Metadatos / Índices / Metadatos de aplicación






Elementos principales de la bases de datos:  los datos del usuario, los metadatos, los índices y los metadatos de aplicaciones.

Metadatos de aplicación: se utilizan para almacenar la estructura y el formato de formas del usuario, reportes, consultas y otros componentes de aplicación

 El SQL Server, el cual es un producto independiente de Microsoft, se utiliza para
grandes bases de datos departamentales y organizacionales de tamaños pequeño a mediano

SUBSISTEMA DEL RUN-TIME (TIEMPO DE EJECUCIÓN)

El subsistema run-time1 procesa los componentes de aplicación que se desarrollan al

utilizar las herramientas de diseño


EL SUBSISTEMA DE HERRAMIENTAS DE DISEÑO

El subsistema de herramientas de diseño consta de un conjunto de implementos que facilitan
el diseño y la creación de la base de datos y de sus aplicaciones

EL MOTOR DBMS:  es el intermediario entre las herramientas de diseño y los subsistemas run-time y los datos.

El motor DBMS también está involucrado en el manejo de transacciones, bloqueo,
respaldo y recuperación

REPORTES

Un reporte es una representación con formato de la información que se encuentra en
una base de datos

MENÚES

Los menúes se utilizan para organizar componentes de la aplicación, de tal manera
que sean más accesibles para el usuario final y proporcionen control sobre las actividades
de éste


RELACIONES BINARIAS

EMPLEADO 1:1 AUTOMÓVIL (Relación uno a uno)

PROFESOR 1: N ESTUDIANTES (Relación  uno a muchos)

ESTUDIANTE N:M MATERIAS (Relación muchos a muchos)

ESTUDIANTE N:1 FACULTAD  (Relación  muchos a uno)

Clase 1

- Descargar software Oracle express 11
- Descargar SQL developer
- Descargar J developer

Buscar  Libro Kroenke David (Trabajo en casa)


- Procesamiento de bases de datos VER EN GOOGLE BOOKS

---------------------------------------------------------------------------------------------------------------------


TRABAJO EN CASA

---------------------------------------------------------------------------------------------------------------------

1. Defina con sus propias palabras cada modelo de base de datos:

Jerárquica, red, relacional, orientada a objetos, semiestructurada.


Modelo de base de datos jerárquica:  Almacena la información en una estructura jerárquica que enlaza los registros en forma de estructura de árbol ( algo parecido a la estructura de un árbol al revés)

La principal ventaja que presenta este tipo de base de datos es la rapidez en las consultas de información ya que la propia estructura piramidal  de datos; encabezado por un elemento padre  que permite un rápido acceso a ella.

Modelo de base de datos red: Es una base de datos conformada por una colección de datos y conjunto de campos mas complejos que el modelo jerarquico. Una base de datos en red puede tener 1 o más elementos padre.  La estructura de árbol se puede considerar como un caso especial de la estructura de modelo de base de datos en red.

Modelo de base de datos relacional: este modelo de base de datos relaciona información con otras bases de datos, por medio de códigos o claves únicas que vinculan de modo simple y dinamico gran cantidad de registros y datos almacenados  (colección de campos)



ventajas: evita duplicidad de registros. al eliminar un registro elimina todo los datos relacionados.
desventajas: no presentan graficos, no multimedia, no informacion gráfica, no se manipulan bloques de texto.

Modelo de base de datos orientada a objetos: 

La base de datos está constituida por objetos, que pueden ser de muy diversos tipos, y sobre los cuales se encuentran definidas unas operaciones. Las bases de datos orientadas a objetos pueden manejar información binaria (como objetos multimedia) de una forma eficiente.

Modelo de base de datos semiestructurada:

Son datos sin esquema o auto-descriptibles, la información sobre la estructura esta junto con los  datos.

Un ejemplo puede ser el proceso de selección de personal de una empresa  puede utilizar una “red de inteligencia” que clasifique las habilidades, experiencias y conocimientos de cada candidato y las relacione entre si, o clasifique a los candidatos en función de una serie de variables. Oswaldo Perez Gomez.
Alejandra Cruz Bañuelos.
Aimee Cuadros Zazueta.
Michelle Espinoza Avila.
Leslie Vejar Armenta.