miércoles, 11 de enero de 2012

Clase 11/01/2012 Triggers

eca : Evento, condicion, Accion

El Evento que dispara la regla especificada, en Oracle puede ser:
Una instrucción INSERT, UPDATE, DELETE
Una instrucción CREATE, ALTER o DROP
Un arranque de la BD o detención de la instancia
Un inicio o fin de sesión por parte del usuario
Un mensaje de Error


Un trigger es un procedimiento. (pero especial)
- a diferencia que no resibe un parametro
- se ejecuta solo

propbando un triger

---primero creamos 2 tablas t4 y t5
CREATE TABLE T4 (a INTEGER, b CHAR(10));
CREATE TABLE T5 (c CHAR(10), d INTEGER);

---Creamos el trigger
CREATE TRIGGER trig1
AFTER INSERT ON T4
REFERENCING NEW AS newRow
FOR EACH ROW
WHEN (newRow.a <= 10)
BEGIN
INSERT INTO T5 VALUES(:newRow.b, :newRow.a);
END trig1;


---luego agregamos valores a la tabla t4
insert into t4 values(7,'asd')

Ahora segun las condiciones del triger revisamos la tabla t5 y revisamos que se agregaron los mismos valores

viernes, 6 de enero de 2012

clase viernes 06 de enero del 2012

TRABAJAMOS CREANDO PROCEDIMIENTO Y FUNCIONES

para aquellos empleados que tengan mas de 5 propiedades se le agrega un bono segun el parametro.
pare eso creamos lo sig.




-- creamos el procedimiento
create or replace procedure bono2012 (pNumempleado in empleado.NUMEMPLEADO%type, pBono numeric:= 0.01)

is
-- declaramos las variables a ocupar
vSalario empleado.salario%type;
vTotprop numeric;

begin

select salario into vSalario --selecionamos el salario y lo guardamos en vsalrio
from empleado
where numempleado = pNumempleado;

select count(*) into vTotprop -- contamos las propiedades de los empleados y lo guardamos en vTotprop
from propiedad
where numempleado = pNumempleado;

if vTotprop >= 5 then -- vemos si vtotpro es mayor o igual a 5
update empleado
set salario = salario + salario*pBono

where numempleado =pNumempleado; --- aca terminamos de actualizar los valores de los empleados segun el bono

dbms_output.put_line ('empleado'||pnumempleado||'bono'||pBono||'aumento'||vSalario*pBono); -- imprimimos el resultado

else
dbms_output.put_line ('empleado'||pNumempleado||'no aplico bono'); -- imprimimos si no hay resultados

end if;

end bono2012; -- cerramos procedimiento


APLICAMOS BONO A EMPLEADO SL21
begin
bono2012('SL21',pBono => 0.05);

end;





CREAMOS FUNCION CUENTA PROPIEDADES
create or replace function cuentapropiedades (pNumepleado empleado.numempleado%type)

return number
is
vTotprop numeric; -- declaramos variable VTotprop

begin
select count(*) into vTotprop
from propiedad
where numepleado = pNumempleado;
return vTotprop;


exception
when no_data_found then
return 0;
when others then
return 0;

end



LLAMAMOS A LA FUNCION

SELECT cuantapropiedades('SL21') FROM dual




--- CREAMOS FUNCION DONDE AL INGRESAR UN NUMERO ENTREGA LA SUMA DE LOS RESTOS
create or replace function sumadijito(pNumero in number)
return number
is

num_aux number;
suma number;

begin
num_aux :=pNumero;
suma := 0;
while num_aux > 0 loop
suma :=suma + mod(num_aux,10);
num_aux := trunc (num_aux/10);
end loop;
return suma;
end;

LLAMAMOS A LA FUNCION
select sumadijito(125) from dual -- ingresamos el numero 125 entregando como resultado 8

procedimiento 2 parametros entradas pbono y empleado

create or replace procedure bono2012 (pnumempleado IN empleado.NUMEMPLEADO%type, pbono numeric:= 0.01)
is
 vsalario empleado.salario%type;
 vtotprop numeric;
begin
select salario into vsalario
from empleado
where numempleado = pnumempleado;
select count (*) into vtotprop
from propiedad
where numempleado = pnumempleado;
if vtotprop >= 5 then
update empleado
set salario = salario + salario * pbono
where numempleado = pnumempleado;
dbms_output.put_line ('empleado '|| pnumempleado || 'bono' || pbono || 'aumento' || vsalario * pbono);
else 
dbms_output.put_line ('empleado' || pnumempleado || 'no aplico bono');
end if;
end;

miércoles, 28 de diciembre de 2011

28/12/2011 clase

DIAPOSITIVA 16 DE CLASE 4

---->Entrega fecha actual
select sysdate from dual

----> Agregar un mes a la fecha actual
select add_months (sysdate,1) from dual

----> Muestra dia actual
select to_char (sysdate, 'DAY') from dual

----> Saber que dia de la semana sera en un mes mas
select to_char (add_months (sysdate,1), 'day') from dual

----> Saber si el año 2012 el mes de feberero tiene 29 dias ocupando comando last_day
select to_char (last_day (to_date('01-02-2012','dd-mm-yyyy'))) from dual

---->diferencia de fechas en meses(tiempo)
select months_between (sysdate, (to_date('01-10-2012','dd-mm-yyyy'))) from dual

----> fecha del proximo dia por ejemplo el lunes
select next_day (sysdate,'Lunes') from dual

----> caracter de un numero (accii)
select chr(64) from dual

concatenando mensaje con pait
select ('Hola'||' '||'Mundo') from dual

INITCAP = conbierte la primera letra en mayuscula

---> comando lpad, rellenando con signos mas hasta 20 caracteres por el lado izquierdo
select lpad('hola',20,'+') from dual

---> comando rpad, rellenando con signos mas hasta 20 caracteres por el lado derecho
select rpad('hola',20,'+') from dual

-*---> reemplaza una lñetra del string
select replace ('hola mundo denuevo','v','b') from dual

--->substr , saca dentro de un caracter
select substr('el galeon español',4,6) from dual

----> translate reeemplaza un valor (en el ejemplo reemplaxza el * por la donde encuentra or en la frase)
select translate('corporate floor','or','**') from dual


---->ceil = entero proximo de un numero
select ceil(3.48) from dual

----> floor = entrega el numero entero anterios
select floor(3.48) from dual

----> power = potencia entre 2 numeros
select power(2,5) from dual

--->round = redeondea un valo
select round(2,99,9) from dual

---->Trunca números para que tengan una cierta cantidad de dígitos de precisión
select trunc(2,99.9) from dual

comando decode (en sexo que decia f lo dejamos en mujer)
select sexo, decode (sexo,'F','Mujer','M','Hombre', 'Ambiguo') from empleado

---> CAMBIAMOS EL SEXO A UNJ EMPLEADO CONUN UPDATE
update empleado
set sexo ='A'
where numempleado = 'SL65'

---> comando case dimos explesiona un sueldo segun su valor
select salario, case
when salario <100000 then 'reguleque' when salario >300000 then 'super sueldo'

else 'ta correcto'
end
from empleado


---> creamos funcion parimpar
create or replace function parimpar (pnumero int)
return varchar2
is
vtexto varchar2(5);
begin

if mod(pnumero,2) = 0 then
vtexto := 'par';
else
vtexto := 'impar';

end if;

return vtexto;
end parimpar;


----> provamos la anterios funcion
select parimpar (2) from dual

clase 28/12/11 por bady

select sysdate from dual;--
/*
suma un mes
*/
select
 -- verifica si es bicierto
select
 -- muestra entre fechas
select
 -- saber que dia es el proximo dia
select
 -- muestar asscii
select
 -- concat es penxca mejor el ||
select
 -- llena por derecha e izquierda

select
select
lpad ('hola',30,'p') from dual; rpad ('hola',30,'p') from dual;-- remplaza
select replace ('el profe es vacan', 'v', 'b') from dual;-- busca el cuarto espacio del largo seis
select substr ('el galeon español',4,6) from dual;-- corporate floor
select
 select
 select
 select
 select nvl(null,0) from dual;select nvl(trim,('')0) from dual; -- mala select power (2,5) from dual; select round (2.27,1) from dual; --redondea numeroselect trunc (2.27,1) from dual --corta el numerooselect
 select numempleado,sexo, decode(sexo,'F','Mujer','M','Hombre','ambiguo') from empleado;update empleadoset sexo = 'A'where numempleado = 'SL65';select salario, casewhen salario < 100000 then 'reguleke'when salario > 300000 then 'super bkn'
else 'ta bien' end
 
create or replace FUNCTION parimpar (pnumero int )RETURN varchar2
vtext
is varchar2 (5);
begin
vtext
if mod(pnumero,2)==0 then = 'par';elsevtext = 'impar';end if
return vtext;
 -- de esta forma se llama a la funcion par impar poniendole un parametro -- las funciones se crean con rallito arriba y se corre
select parimpar(5) from dual


end parimpar
from empleado
* from empleado;
mod(7,2) from dual; -- devuelve el resto de la divisuioon
floor (3.52) from dual; --redonde hacia abajo
ceil (3.52) from dual; -- redondea hacia arriba
translate ('corporate floor','or','tt') from dual;
'hola'||'mundo' from dual;
chr(64) from dual;
next_day (sysdate, 'Lunes') from dual;
MONTHS_BETWEEN (sysdate,(to_date('01-02-2012', 'dd-mm-yyyy'))) from dual;
to_char(last_day(to_date('01-02-2012', 'dd-mm-yyyy'))) from dual;
add_months (sysdate,1) from dual;

miércoles, 21 de diciembre de 2011

clases 21/12/2011

seleccionamos todas las tablas
pero en especial la con nuestro nombre (160311290)

select owner, table_name
from all_tables
where owner = '160311290'


funciones to_date y to_char
aplicamos para obtener el dia en que nacimos

select to_char (to_date('27-04-1985','dd-mm-yyyy' ), 'day') from dual

REPASAR %TIPE


USASNDO RECORD
SELECT a,b into vr

type mitiporecord is record
va varchar2(2)
vb int
);
vr mitiporecord

creamos tabla y obtenemos valores al azar
create table tx (x int,y varchar(5));
insert into tx
select rownum, trunc(dbms_random.value(1,99999))
from dual
connect by rownum <= 10;

select * from tx;



select instr ('hola mundo','o',1,2) from dual

descontamos un mes a la fecha actual
select to_char (add_months (sysdate, -1), 'day') from dual

viernes, 16 de diciembre de 2011

Clase repaso para prueba 16.12.1011

el comando DELETE borra contenido
y el comando DROP borra todo


--listar las propiedades que tiene(arrienda) un cliente
(nombre, apellido, numprop, finicio(arriendo))

SELECT C.nombre, C.apellido, A.numpropietario, Afinicio
FROM cliente C, arriendo A
WHERE C.numcliente = A.numcliente
AND C.nombre = 'Juan'
AND C.apellido = 'Perez'

* aca arriba seleccionamos un dato de 2 tablas


----selecionamos numeros de oficinas de valdivia
select numOficina
from oficina
where ciudad = 'valdivia'

-----selecionamos empleados que trabajen en la oficna de valvidia
select numEmpleado, nombre, apellido
from empleado
where numOficina in (select numOficina
from oficina
where ciudad = 'Valdivia')


----salario maximo de las mujeres
select max(salario)
from empleado
where sexo = 'F'

comando TRIM quita los espacios en blanco

-----crear secuencia en tabla t1
create sequence seqt1
start with 10
increment by 10

select seqt1.nextval from dual
insert into t1 values (seqt1.nextval,'22')


----salario promedio de los empleados
select nombre, apellido, salario, (select avg(salario) from empleado) as promedio, salario - (select avg(salario) from empleado) as diferencia)



---agrupar por numero de oficina empleado reanta promedio max y min de empleados.
select numOficina, count(*), avg(salario) as promedio, max(salario) as salario_maximo, min(salario) as salario_minimo
from empleado
group by numOficina


----listar oficina con promedio de salario mas alto
select numOficina, avg(salario)
group by numOficina


having avg(salario) = (select max(salario))
from empleado
group by numoficina

---listar las ciudades que tengan mas de 2 oficinas

select ciudad, count(numoficina) as cantidad_de_oficinas
from Oficina
group by ciudad
having count(numoficina)>2