miércoles, 11 de enero de 2012

Clase Miercoles 11-01-2012.


Triggers:

create
table Person (age int); CREATE TRIGGER PersonCheckAgeAFTER INSERT OR UPDATE OF age ON PersonFOR
BEGIN
IF
RAISE_APPLICATION_ERROR(-
END
END;
EACH ROW (:new.age < 0) THEN20000, 'no negative age allowed'); IF;insert

into person values (-20);

viernes, 6 de enero de 2012

Clase Viernes 06-01-2012

Procedimientos

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 aplica bono");
    end if
end

Para llamar al procedimiento:

begin
    bono2012('SL21',0.03);
end

Procedimientos:
formal: es el que usa en la creacion.
real: es el que usa para llamarlo.

Funciones
create or replace function cuentapropiedades(pnumempleado empleado.numempleado%type)
return number;
is
vtotprop numeric;
begin 
    select count(*) into vtotprop
    from propiedad
    where numempleado=pnumempleado
    return vtotprop;
end


select cuenta propiedad ('SL21') from dual;

create or replace function sumadigitos (pnumero integer)
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;

Mini-Guia lenguaje Oracle PL/SQL

Un aporte:
http://foro.powers.cl/viewtopic.php?t=160079

Clase Viernes 6 de Enero

Preparacion para la prueba de mañana
sera prueba escrita y siguiendo el mismo estilo de la anterior, alternativas y desarrollo

Ejercicio 1

create or replace procedure bono2012 (Pnumemepleado in empleado.numempleado%type, pbono numeric)
is
vsalario empleado.salario%type;
vtotprop numeric;

begin
select salario into vsalario
from empleado
where numempleado = Pnumemepleado;
select count(*) into vtotprop
from propiedad
where numempleado = Pnumemepleado;
if vtotprop>=5 then
update empleado set salario = salario+salario*pbono
where numempleado = Pnumemepleado;
dbms_output.put_line('empleado 'Pnumemepleado' bono 'pbono' aumento 'vsalario*pbono);
else
dbms_output.put_line('empleado 'Pnumemepleado' No tiene bono');
end if;
end;

Para ejecutar el procedimiento se usa


begin
bono2012('SL21',0.03);
end;


crear funciones

para crearla se usa:

create or replace function cuentapropiedades (Pnumemepleado in empleado.numempleado%type)
return number
is
vtotprop numeric;

begin
select count(*) into vtotprop
from propiedad
where numempleado = Pnumemepleado;
return vtotprop;
end;


para ejecutar la funcion usamos:

select cuentapropiedades('SG37') from dual;


otra funcion que suma numeros (no entendi exactamente que es lo que hace)

create or replace function sumadigitos (Pnumero IN integer)
return number
is
suma number:=0;
num_aux number;

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

para llamarla se usa:

select sumadigitos(125) from dual;

lunes, 2 de enero de 2012

Fechas Pruebas

Fundamentos de ORACLE ACI-900
 
Erwin Fischer
2 Catedras+1 Examen
60%+40%
 
Catedra I 17-12-2011
Catedra II 06-01-2012
Examen 14-01-2012
 
(20-21-27-28)-01-2012 Profesor no puede hacer clases.
 
Viernes 22:00 (Fin Clase, sin breack).
Los Sabados 10,17,7 Recuperacion de Clases

miércoles, 28 de diciembre de 2011

Recuperativa Miercoles 28 de diciembre

Se revisa las sentiencias de next_day

select next_day(sysdate, 'lunes')from dual

ademas

select chr(12) from dual

Concatenar caracteres

select ('hola''Mundo') from dual

Agregar caracteres a la derecha o a la izquierda con LPAD y RPAD

select lpad('hola',20,'+') from dual
resultado= ++++++++++++++++hola

Replace
select replace('El profe es vacan', 'v', 'b')from dual
Resultado= 'El profe es bacan'

substr
select substr('el galeon español', 4, 6)from dual
resultado= 'galeon'

instr (NO ENTENDI LO QUE HACE)
select instr('corporate floor', 'or', 3, 2)from dual
resultado= 14

Piso y cielo (floor, ceil) aproxima hacia arriba o hacia abajo
select ceil('3,58') from dual
resultado= 4

select floor('3,58') from dual
resultado=3

calcular potencia
select power(2,5)from dual
da el resultado de 2 elevado a 5 osea 32


diferencia entre round y trunc
select round(2.27, 1)from dual
resultado= 2.3

select trunc(2.27, 1)from dual
resultado= 2.2


Funcion case para seleccionar entre alternativas
select salario, case
when salario <100000 then 'Reguleque'
when salario >300000 then 'Super'
else 'Esta bien'
end
from empleado

se crea una funcion para identificar si un numero es par o impar

create FUNCTION paroimpar (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 paroimpar;

miércoles, 21 de diciembre de 2011

Clase miércoles 21/12/2011

CURSORES BIEN EXPLICADO ---> http://www.desarrolloweb.com/articulos/cursores-pl-sql-I.html
--atributos que nos interesan
ALL_TABLES
(owner)
(table_name)
(Tabid)
select owner, table_name
from all_tables
where owner = '154345272'

--atributos que nos interesan
ALL_TAB_COLUMNS
(column_name)
(owner)
(table_name)

Select distinct col.column_name
from all_tab_columns col
Where upper(owner)='154345272'

/*obtener todas las tablas, columnas y nombre owner*/

DECLARE
vPropietario varchar2(40);
vNombreTabla varchar2(40);
vNombreColumna varchar2(100);

/* Primer cursor */
cursor obtieneTablas is
select distinct t.owner, t.table_name
from all_tables t
where t.owner = '154345272';

/* Segundo cursor */
cursor obtieneColumnas is
select distinct c.column_name
from all_tab_columns c
where c.owner = vPropietario
and c.table_name = vNombreTabla;

begin
open obtieneTablas;
dbms_output.put_line('Abriendo Cursor - obtieneTablas');
loop fetch obtieneTablas into vPropietario, vNombreTabla;
exit when obtieneTablas%NOTFOUND;
dbms_output.put_line('Tabla : '||vPropietario||'.'||
vNombreTabla);
open obtieneColumnas;
loop fetch obtieneColumnas into vNombreColumna;
exit when obtieneColumnas%NOTFOUND;
dbms_output.put_line('=>'||vNombreTabla||'.'||
vNombreColumna);
end loop;
close obtieneColumnas;
end loop;
close obtieneTablas;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20001,'Se ha detectado un error - '||
SQLCODE||' -ERROR- '||SQLERRM);
end;

*******************************************
select owner, table_name
from all_tables
where owner = '154345272'


Select distinct col.column_name
from all_tab_columns col
Where upper(owner)='154345272'

Select owner,Table_name,Column_name
from all_tab_columns
Where upper(owner)='154345272'


/*obtener todas las tablas, columnas y nombre owner*/

DECLARE
vPropietario varchar2(40);
vNombreTabla varchar2(40);
vNombreColumna varchar2(100);

/* Primer cursor */
cursor obtieneTablas is
select distinct t.owner, t.table_name
from all_tables t
where t.owner = '154345272';

/* Segundo cursor */
cursor obtieneColumnas is
select distinct c.column_name
from all_tab_columns c
where c.owner = vPropietario
and c.table_name = vNombreTabla;

begin
open obtieneTablas;
dbms_output.put_line('Abriendo Cursor - obtieneTablas');
loop fetch obtieneTablas into vPropietario, vNombreTabla;
exit when obtieneTablas%NOTFOUND;
dbms_output.put_line('Tabla : '||vPropietario||'.'||
vNombreTabla);
open obtieneColumnas;
loop fetch obtieneColumnas into vNombreColumna;
exit when obtieneColumnas%NOTFOUND;
dbms_output.put_line('=>'||vNombreTabla||'.'||
vNombreColumna);
end loop;
close obtieneColumnas;
end loop;
close obtieneTablas;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20001,'Se ha detectado un error - '||
SQLCODE||' -ERROR- '||SQLERRM);
end;


--FUNCIONES
select sysdate from dual;

select to_char (to_date('20/09/1982','dd-mm-yyyy'),'DAY') from dual;

select '***'|| to_char (to_date('20/09/1982','dd-mm-yyyy'),'DAY')||'***' from dual;

--publicar 2 o 3 ejemplos de TO_CHAR con TO_DATE

-- RECORDANDO A UTILIZAR EL %TYPE
-- DECLARAR TIPO RECORD

select a,b into va,vb;

TYPE mitiporecord is RECORD
(
va varchar2(2),
vb int
);


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;

--probar de la segunda letra
select instr ('Hola mundo','o',1,2) from dual
--probar de la tercera letra
select instr ('Hola mundo','o',3,2) from dual
--agregar un mes
Select add_months (sysdate,1) from dual
--dia de la semana
Select to_char (add_months (sysdate,-1),'day') from dual

sábado, 17 de diciembre de 2011

Clase Sabado 17-12-2011


declare
begin
exception
end
vtipo propiedad.tipo%type
dbms_output.put_line( );
select nombre, sexo
from empleado
declare
 vnombre empleado.nombre%type;
 vsexo empleado.sexo%type;
 vtexto varchar(25);
cursor micursor is
 [select nombre, sexo from empleado]
begin
 open micursor;
 loop
  fetch micursor into vnombre, vsexo;
  exit when micursor%notfound
  if
   vsexo='M' then
   vtexto='Hombre'
  elsif
   vsexo='F' then
   vtexto='Mujer'
  else
   vtexto='Ambiguo'
  endif
  dbms_output.putline(vnombre ││ 'ø' ││ vsexo 'ø' ││ vtexto);
 end loop;
 close micursor

Recuperacion Sabado 17

Se reviso fechas de proxima prueba y examen


sababo 7 de enero catedra2
sabado 14 de enero examen



se continua con la clase normal...



CURSORES

Declare
vgenero varchar2(10);
vnombre empleado.nombre%type;
vsexo empleado.sexo%type;

cursor listageneroempleado is
select nombre, sexo from empleado;

Begin
open listageneroempleado;
loop
fetch listageneroempleado INTO vnombre, vsexo;
exit when listageneroempleado%notfound
if sexo='M' then
vgenero='Hombre';
else if sexo='F' then
vgenero='Mujer';
else
vgenero='Ambiguo';
end if;
DBMS_Output.put_line(vnombre' 'vsexo' 'vgenero);
End loop;
close listageneroempleado;
END;

viernes, 16 de diciembre de 2011

TABLAS CAMPOS

Propiedad(PK)-Arriendo(FK) numPropiedad
Cliente(PK)-Arriendo(FK) numCliente
Visita(PK)-Cliente(PK) numCliente
Propiedad(PK)-Visita(FK) numPropiedad
Propietario(PK)-Propiedad(FK) numPropietario
Empleado(PK)-Propiedad(FK) numEmpleado
Oficina(PK)-Empleado(FK) numOficina
"ESTUDIAR LAS SIGUIENTES INSTRUCCIONES"

INSERT
CONSTRAINT
SELECT
DELETE = ELIMINAR LOS REGISTROS
DML "data manipulation language" /DDL "data definition language"
NULL = es un valor especial para los atributos que nunca han tenido un contenido
DROP = ELIMINAR LA TABLA
IN
DUAL
GROUP
DISTINCT
TRIM
CREATE TABLE
CREATE SEQUENCE
LIKE
WHERE
COUNT/MAX/MIN/AVG
ORDER BY
RPUND
DESC
BETWEEN
UPPER / LOWER

--------------------------------------
EJEMPLO INSERT
TABLA T1 (
A INT PRIMARY KEY,
B VARCHAR (2)
);

INSERT INTO T1 VALUES (1,'...')

--------------------------------------
PK_T1

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

EJERCICIOS
--LISTAR LAS PROPIEDADES QUE TIENE UN CLIENTE (NOMBRE,APELLIDO,NUMPROP,F.INICIO ARRIENDO)

--FORMA MAS FACIL DE HACER UN JOIN

SELECT C.nombre, C.apellido, A.numPropiedad, A.inicioRenta
FROM CLIENTE C, ARRIENDO A
WHERE C.NumCliente = A.NumCliente
AND C.nombre = 'Jhon'
AND C.apellido = 'Perez'


--LISTAR EL NUMERO DE TODAS LAS OFICINAS QUE SE ENCUENTRAN EN VALDIVIA

SELECT numOficina
FROM OFICINA
WHERE CIUDAD = 'Valdivia'

--listar todos los empleaods que trabajan en la oficina de Valdivia

SELECT numEmpleado,Nombre,Apellido
FROM Empleado
Where numOficina IN ('B115','B015');

SELECT numEmpleado,Nombre,Apellido
FROM Empleado
Where numOficina IN (SELECT numOficina
FROM OFICINA
WHERE CIUDAD = 'Valdivia');

--que es lo que entrega el max

SELECT MAX (salario)
FROM Empleado
WHERE sexo = 'F';

--sequence

CREATE SEQUENCE seqt1
START WITH 10
INCREMENT BY 10;

--uso de la secuencia

SELECT seqt1.NEXTVAL FROM dual;
INSERT INTO T1 VALUES (seqT1.NEXTVAL,'1');

CREATE TABLE T1 (
A INT PRIMARY KEY,
B VARCHAR (2)
);

--calcular el salario mostrar nombre,apellido,salario,promedio y la diferencia

SELECT Nombre,Apellido,Salario,(SELECT AVG(Salario) FROM EMPLEADO) AS Promedio,
Salario - (SELECT AVG(Salario) FROM EMPLEADO) AS DIFERENCIA
FROM EMPLEADO

--numero de la oficina, cantidad de empleados(contar), sueldo promedio por oficina(promedio)

SELECT numOficina,count(*) AS CUENTA,AVG(Salario) AS SALARIO, MAX(Salario), MIN(Salario)
FROM Empleado
GROUP BY numOficina

SELECT O.ciudad,O.numOficina,count(*) AS CUENTA,AVG(Salario) AS SALARIO, MAX(Salario), MIN(Salario)
FROM Empleado E, Oficina O
WHERE E.numOficina = O.numOficina
GROUP BY O.ciudad, O.numOficina

--cantidad de oficinas por ciudad
SELECT O.ciudad,O.numOficina,count(*) AS CUENTA,AVG(Salario) AS SALARIO, MAX(Salario) AS MAXIMO, MIN(Salario) AS MINIMO
FROM Empleado E, Oficina O
WHERE E.numOficina = O.numOficina
GROUP BY O.ciudad, O.numOficina
ORDER BY O.Ciudad

SELECT ciudad,count(*) AS CUENTA,AVG(Salario) AS SALARIO, MAX(Salario), MIN(Salario)
FROM Oficina
GROUP BY ciudad

-- Listar las oficina que tiene el salario promedio más ALTO

SELECT numOficina,AVG (Salario) AS SALARIO --MAX(Salario) AS MAXIMO
FROM Empleado
GROUP BY numOficina
HAVING AVG(Salario) = (SELECT MAX(AVG(Salario)) FROM Empleado
GROUP BY numOficina)

--Listar las ciudades que tengan màs de 2 oficinas

SELECT Ciudad,count (numOficina)
FROM Oficina
GROUP BY Ciudad
HAVING count(numOficina) > 2

Clase Viernes 16-12-2011

Listar las propiedades que "tiene" un "cliente"
(nombre,apellido,numprop,finicio(arriendo))

Join:

select c.nombre, c.apellido, a.numpropiedad, a.finicio
from cliente c, arriendo a
where c.numcliente=a.numcliente
and nombre='Juan'
and apellido='Perez'

select c.nombre, c.apellido, a.numpropiedad, a.finicio
from cliente c, arriendo a
where c.numcliente=a.numcliente
and a.numpropiedad=p.numpropiedad
and p.numempleado=e.numempleado

Para lista el numero de oficinas que estan en Valdivia:

select numoficina
from oficina
where ciudad='Valdivia';

Listar empleados que estan en Valdivia:

select numempleado,nombre,apellido
from empleado
where numoficina in (select numoficina
from oficina
where ciudad='Valdivia');

Secuencias:

create
start with 10
increment by 10;

Prueba de la secuencia:

select
insert into t1 values (seqt1.nextval,'1');

Promedio del salario de los empleados:

select
salario - (select avg (salario) from empleado) as diferencia
from empleado

select numoficina, count (*), avg(salario), max(salario), min(salario)
from empleado
group by numoficina

select
from empleado e, oficina o
where e.numoficina=o.numoficina
group by o.ciudad, o.numoficina

Listar las oficinas con el salario promedio mas alto:

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

numoficina,avg(salario)
o.ciudad, o.numoficina, count (*), avg(salario), max(salario), min(salario)
nombre, apellido, salario, round((select avg (salario) from empleado),1) as promedio,
seqt1.nextval from dual;
sequence seqt1

Clase Viernes 16 diciembre

Un Join mas complejo

select c.nombre, c.apellido, a.numpropiedad, a.finicio, e.numempleado
from cliente c, arriendo a, propiedad p, empleado e
where c.numcliente=a.numcliente
and a.numpropiedad=p.numpropiedad
and p.numempleado=e.numpropiedad...


Teoria

DDL = Lenguaje de definicion de datos
DML= Lenguaje de manipulacion de datos


IN


select * from empleado where numoficina IN( Select numoficina from oficina where ciudad='Valdivia')

MAX
select max(salario) from empleado where sexo='M'


SEQUENCE
create sequence seqt1
start with 10 increment by 10;
select seqt1.nextval from dual;

insert into t1 values (seqt1.nextval, '6');
select * from t1

Promedio y round (avg, round)

select nombre, apellido, salario, round((select avg(salario) from empleado),1) as promedio, salario-round((select avg(salario) from empleado),1) as diferencia
from empleado



select numoficina, count (*), avg(salario), max(salario), min(salario)
from empleado
group by numoficina




select o.ciudad, o.numoficina, count (*), avg(salario), max(salario), min(salario)
from empleado e, oficina o
where e.numoficina=o.numoficina
group by o.ciudad, o.numoficina
order by o.ciudad

sábado, 10 de diciembre de 2011

Clases Sabado 10

Se crea un programa simple usando variables y SQL

la PPT de la materia ya esta disponible en el sitio de la U

el codigo de ejemplo es:

/*Creacion de la tabla*/
create table T1(
e integer,
f integer
);

/*se consulta la tabla creada*/
select * from T1


/*Se insertan datos a la tabla*/
Begin
DELETE FROM T1;
INSERT INTO T1 VALUES(1, 3);
INSERT INTO T1 VALUES(2, 4);
End;


/*se ejecuta el programa*/
DECLARE
a NUMBER;
b NUMBER;

BEGIN
SELECT e,f INTO a,b
FROM T1 WHERE e>1;
INSERT INTO T1 VALUES(b,a);
END;


/*se consulta nuevamente la tabla creada*/
select * from T1


/*para mostrar registros por pantalla*/


BEGIN
DBMS_OUTPUT.PUT_LINE('HOLA MUNDO');
END;


/*Ejemplo de impresion con el uso de un programa y el uso de IF*/

declare

precio integer:=150;

BEGIN

if precio>=15 then
DBMS_OUTPUT.PUT_LINE('El precio es: 'precio);
end if;

end;

/*OTRO EJEMPLO*/


declare

precio integer:=150;
texto varchar2(5);

BEGIN

if precio>=15 then
texto:='mayor';
else
texto:='menor';
end if;
DBMS_OUTPUT.PUT_LINE('El precio es 'texto' y es: 'precio);
end;

Recuperacion Sabado 10 de diciembre

Para encontrar un valor entre ciertos rangos

select * from empleado
where salario >= 200000
and salario <= 300000;

otra manera de hacer lo mismo es:

select * from empleado
where salario between 200000 and 300000;

select * from empleado
where fechanac between '01-12-1960' and '31-12-1960';


hacer un join entre 2 tablas

select e.numempleado, e.nombre, o.ciudad
from empleado e, oficina o
where e.numoficina=o.numoficina;


listar los gerentes que ganan mas de 200000

select * from empleado
where cargo='gerente' and salario>=200000;


listar todos los clientes que contengan 'Glasgow' en su direccion

select * from cliente
where direccion like '%Glasgow%';

clientes que su nombre empieza con 'P'

select * from cliente
where nombre like 'P%'

estudiar comando trim, ltrim y rtrim, para no considerar espacios en un campo

ejemplo de trim
select * from empleado
where trim(cargo) like 'Gerent_'


listar todas las visitas que tienen comentario

select * from visita
where comentario is not null;

viernes, 9 de diciembre de 2011

Viernes 09/12/2011

Herramientas
*Dropbox
Permite compartir archivos con la nube
*DIIGO
Permite guardar las URL y publicarlas
ejemplo: www.diigo.com/user/efischer


Diapositiva DreamHome

Tablas
Arriendo
Cliente
Visita
Propietario
Oficina
Propiedad
Empleado

El código de la creación de las tablas se encuentra en ORAHELP.BLOGSPOT.COM

Para que es la tabla dual
¿que es?
Oracle es una base de datos relacional, quiere decir que todos los elementos son relaciones. Entonces cuando
necesitamos realizar una operación podemos hacer uso del dual.
ejemplo

Fecha actual
SELECT SYSDATE FROM DUAL

Ejercicio 1
Crear tabla persona
atributos:
id
nombre
apellido
fechanac
renta

Desarrollo ejercicio 1
CREATE TABLE Persona (
id integer not null,
Nombre integer not null,
Apellido varchar(40),
Fechanac date,
Renta numeric(5,1),
constraint pk_persona primary key(id)
);

Importante
¿Qué comando debo utilizar para saber cuantas tablas tengo creadas?
select * from tab

¿Cómo sé la estructura que tiene una tabla?
DEsC nombre tabla ejemplo: DESC Persona

AUTOINCREMENTO
CREATE SEQUENCE SEQPersona;


LISTAR NUMERO DE PROPIEDAD (numpropiedad) DE TODAS LAS PROPIEDADES QUE HAN SIDO VISITADAS
LISTAR EL SALARIO MENSUAL PARA TODOS LOS EMPLEADOS
LISTAR EL NOMBRE EMPLEADO
LISTAR EL NUMERO EMPLEADO

SELECT NUMEMPLEADO,NOMBRE,ROUND (SALARIO/12,1) AS "SALARIO MENSUAL"
FROM EMPLEADO;

LISTAR TODOS LOS EMPLEADOS QUE GANA MAS DE 100 DOLARES
SELECT NUMEMPLEADO,NOMBRE,ROUND (SALARIO) AS "SALARIO MENSUAL"
FROM EMPLEADO;
WHERE SALARIO > 100000

LISTAR LA INFORMACION DE TODAS LAS OFICINAS QUE ESTAN EN CASTELLON O SANTIAGO? (atributos distintos)
SELECT *
FROM OFICINA
WHERE CIUDAD= 'Arica'
OR CIUDAD= 'Santiago';

SELECT *
FROM OFICINA
WHERE UPPER (CIUDAD)= 'ARICA'
OR LOWER (CIUDAD)= 'santiago';

SELECT *
FROM OFICINA
WHERE UPPER (CIUDAD) IN ('ARICA','SANTIAGO');

LISTAR TODOS LOS EMPLEADOS QUE NO SON GERENTES NI SUPERVISORES
SELECT *
FROM EMPLEADO
WHERE UPPER (CARGO) NOT IN ('GERENTES','SUPERVISORES');

link de interes: http://cursos.atica.um.es/DBA9i1/sqlplus.html

clase viernes 9 de dic

Dual es una tabla ficticia que crea y utiliza para ciertas consultas


create table persona (
id integer,
nombre varchar (35),
apellido varchar (40),
fechanac date,
renta numeric (5,1),
constraint pk_persona primary key (id)
);


/*Consultas*/


/*Consultar tablas de la base*/
select * from tab


select * from empleado

select * from persona


/*Para borrar un registro*/
delete from persona where nombre='Pedro';


insert into persona values (2, 'Pedro', 'Picapiedra', '1-04-1950', 1200.0);
insert into persona values (seqPersona.nextval, 'Pablo', 'Marmol', '1-04-1955', 0.0);


/*Para crear un autoincremento*/
create sequence seqPersona
start with 2
increment by 1;




select distinct numpropiedad from visita order by numpropiedad;


/*Listar el salario mensual de todos los empleados*/

select numempleado, nombre, round (salario/12,1) as "Salario Mensual" from empleado;

/*Pregunta de prueba, que hace el round*/



select * from oficina where upper(ciudad)='ARICA' OR lower(ciudad)='santiago';


select * from oficina where upper(ciudad) in('ARICA','SANTIAGO');
select * from oficina where upper(ciudad) NOT in('ARICA','SANTIAGO');

Clases Viernes 09-12-2011.

Crear una pregunta y publicarla el Sabado 10-12-2011 que ira en la Catedra del 17-12-2011.

Herramientas:
-Dropbox
-Diigo

www.diigo.com/user/efischer

http://orahelp.blogspot.com/search?q=completo

Tabla dual, pregunta de prueba. Es una tabla ficticia para hacer consultas.
Ejemplo:
select sysdate from dual

---

Para crear una tabla persona2:
create table persona2 (
id integer,
nombre varchar2(35),
apellido varchar2(40),
fecha date,
renta numeric (5,1),
constraint pk_persona2 primary key (id)
);


---

Para saber cuales tablas tengo:
select * from tab
              cat


---

desc persona

---

Para insertar Valores en la tabla:
insert into persona2 values (seqPersona2.nextval,'Pablo','Marmol','1-12-1960',200.0);

---

Para Ver los valores insertados:
select * from persona2

---

Para que automaticamente incremente en 1 la id:
create sequence seqPersona2
start with 1
increment by 1;


---

Listar numero de propiedad (numpropiedad) las propiedades que han sido visitadas

select
from visitaorder by numpropiedad;

---

select numempleado, nombre, round(salario/12,1) as "SALARIO MENSUAL"from empleado;

Round sirve para aproximar valores.

---

select *
from oficina
where upper(ciudad)='ARICA'
or lower(ciudad)='santiago';


---

Recordar compañeros que el grupo del curso se encuentra en el siguiente link
http://groups.google.com/group/aci900?pli=1

Buenas practicas en PL / SQL

Link del trabajo:
http://dl.dropbox.com/u/52808587/Buenas%20Practicas%20PL-SQL.docx

Buena practica 1: En los datos numericos, definir la presicion

Oracle soporta hasta 38 digitos de presicion en los tipos de datos "NUMBER", si no se define en forma correcta se esta derrochando memoria.

Forma erronea:
DECLARE
Variable1 NUMBER;

Forma correcta:
DECLARE
Variable1 NUMBER(12 , 2);




Buena Practica 2: Cuidar las conversiones implícitas de tipos de datos


Como es sabido PL/SQL maneja las conversiones implícitas pero existen dos grandes problemas en esto.
Las conversiones no son intuitivas, aveces se realizan de formas no esperadas y ocurren problemas, especialmente dentro de sentencias SQL.
Las reglas de conversión no están bajo el control del desarrollador. Pueden cambiar con una actualización o upgrade de Oracle.


Se puede convertir con el uso explicito de funciones como son: TO_DATE, TO_CHAR, TO_NUMBER y CAST.


Forma erronea:
DECLARE
fecha_fin DATE: = '01-MAR-11';


Forma correcta:





DECLARE





fecha_fin DATE: = TO_DATE ('01-MAR-11' , 'DD-MON-RR');