miércoles, 11 de enero de 2012

Clase 7 - Miercoles 11 de Enero de 2012


TRIGGER
-------



Ejemplo de Creacion de trigger


CREATE [OR REPLACE] TRIGGER <trigger_name>    
  {BEFORE|AFTER} {INSERT|DELETE|UPDATE} ON <table_name>  
  [REFERENCING [NEW AS <new_row_name>] [OLD AS <old_row_name>]]
  [FOR EACH ROW [WHEN (<trigger_condition>)]]    
<trigger_body>



Ejercicio
---------


Creacion de tablas

CREATE TABLE T4 (a INTEGER, b CHAR(10));
CREATE TABLE T5 (c CHAR(10), d INTEGER);


Creacion de trigger asociado a la tablas T4 - T5
-------------------------------------------------

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;



Insertar informacion en tabla T4 para ejecutar trigger
-----------------------------------------------------

INSERT INTO T4 VALUES (4,5)




revisar tabla que fue poblada por trigger "trig1"
-------------------------------------------------

select * from t5;




Creacion Trigger 2
------------------


CREATE TRIGGER TopeDeManejoPropiedadEmpleado
BEFORE INSERT OR UPDATE ON Propiedad
FOR EACH ROW
DECLARE
  vcontP NUMBER;
BEGIN
SELECT COUNT(*) INTO vcontP
FROM Propiedad
WHERE numEmpleado = new.numEmpleado;
IF vcontP = 100
Raise_application_error(-2000, (‘Empleado ‘|| new.numEmpleado|| ‘ ya administra 100 propiedades’);
END IF
END




Creacion Trigger 3
-------------------


create table Person (age int);

CREATE TRIGGER PersonCheckAge
AFTER INSERT OR UPDATE OF age ON Person
FOR EACH ROW
BEGIN
IF (:new.age < 0) THEN
RAISE_APPLICATION_ERROR(-20000, 'no negative age allowed');

END IF;
END;

RUN;


Si intentamos ejecutar la inserción:

insert into Person values (-3);




Desactivando el trigger
-------------------------

Alter trigger PersonCheckAge disable;




Para ver una lista de los triggers definidos usar:
--------------------------------------------------

select trigger_name
from user_triggers;





Para eliminar un trigger se utiliza
------------------------------------
Drop trigger «nombre_trigger»;



Para desactivar un trigger se utiliza
-------------------------------------
Alter trigger «nombre_trigger» disable;



Para activar un trigger se utiliza
----------------------------------
Alter trigger «nombre_trigger» enable;



Para activar todos los trigger de una tabla se utiliza
------------------------------------------------------
Alter table «nombre_tabla» enable all triggers;

viernes, 6 de enero de 2012

Clase 6 - Viernes 6 de Enero de 2012

------------------------------------
:::: CREAR UN PROCEDIMIENTO :::
------------------------------------


CREATE OR REPLACE Procedure Bono2012(pNumEmpleado in Empleado.numempleado%type, pBono numeric:= 0.01)
Is
vSalario empleado.salario%Type;
vTotpropiedad numeric;

Begin

SELECT SALARIO into vSalario /* seguarda el salario en una variable */
FROM EMPLEADO
Where numempleado = pNumEmpleado;

/* Obtiene la cantidad de propiedades del empleado */
select count(*) into vTotpropiedad
From PROPIEDAD
Where numempleado = pNumEmpleado;


if vTotpropiedad >= 5 then
update EMPLEADO Set salario = salario * (1 + pBono)
Where numempleado = pNumEmpleado;

dbms_output.put_line('Empleado: ' || pNumEmpleado || ' Bono: ' || pBono || ' Aumento: ' || vSalario * pBono);
else
dbms_output.put_line('Empleado: ' || pNumEmpleado || ' no obtubo bono...');
end if;

End Bono2012;

*****************************************************************************
-> DEFINICIONES:

Parametro real: Es el valor que paso a mi funcion o procedimiento.
Ejemplo --> Bono2012('SL21')

Parametro formal: Es con el que defino la funcion o procedimiento
Ejemplo --> Bono2012(pNumEmpleado in Empleado.numempleado%type, pBono numeric:= 0.01)


*****************************************************************************


-> EJECUTAR PROCEDIMIENTO.
1.-
Begin
Bono2012('SL21'); /* sino se ingresa monto de bono se asume que es 0.01
end;

2.-
Begin
Bono2012('SL21', 006);
end;

3.-
Begin
Bono2012(pNumEmpleado =>'SL21');
end;


-> EJECUTAR PROCEDIMIENTO EN DISTINTOORDEN DE PARAMETROS.

1.-
Begin
Bono2012(pBono => 0.06, pNumEmpleado =>'SL21');
end;

2.-
Begin
Bono2012('SL21',pBono => 0.05);
end;


*****************************************************************************
*****************************************************************************
*****************************************************************************

------------------------------------
:::: CREAR UNA FUNCION :::
------------------------------------


create or replace function contar_propiedades(pNumEmpleado empleado.NumEmpleado%Type)
Return numeric IS

CantProp numeric;

Begin

Select Count(*) into CantProp
From Propiedad
Where NumEmpleado = pNumEmpleado;


Return CantProp;

Exception
When No_Data_Found Then
Return 0;
When others then
Return 0;

End contar_propiedades;


-> EJECUTAR UNA FUNCION:

1.- Select contar_propiedades('SL21') from dual;
2.-
Begin
dbms_output.put_line('la cantidad de propiedades es: ') || contar_propiedades('SL21');
End;


----> Crear function para sumar los digitos de un numero <------

Create or replace function suma_digitos(pnumero in numeric) return numeric is

num_aux numeric;
suma numeric;
Begin
num_aux:= pnumero;
While num_aux > 0 loop
suma:= + mod(num_Aux,10);
num_aux := trunc(num_aux / 10);
end loop;

Return suma;
End;

miércoles, 28 de diciembre de 2011

Clase RECUPERATIVA II - Miércoles 28 de Diciembre de 2011

/* MANEJO DE FECHAS */

select sysdate from dual;

/* Ver como cambia de minuscula mayuscula */
select to_char(sysdate,'Day') from dual;

/* Agrega un mes al actual */
select ADD_MONTHs(sysdate,1) from dual;


/*Identificar en que dia TERMINA el mes */
select last_day(to_date('20/02/2012','dd/mm/yyyy')) from dual;


select months_between(sysdate,to_date('20/02/2012')) from dual;

/*Siguiente dia */
select next_day(sysdate,'lunes') from dual;

/*------------------------------*/
/* --> Pregunta de PRUEBA <--*/
/* Se puede contenar con: || y con CONCAT (cad1, cad2)= Devuelve "cad1" concatenada con "cad2".*/
/*------------------------------*/

/*Rellenar cadena*/
Select lpad('hola mundo',20,'+') from dual;
Select lpad('hola mundo',2,'+') from dual;

Select Rpad('hola mundo',20,'+') from dual;
Select Rpad('hola mundo',2,'+') from dual;

/*Reemplazo de caracteres */
select replace('kkkkkhhh','k','x') from dual;

/*Busca una cadena dentro de otra*/
select substr('toy cagao de sueño',5,5) from dual;

/*Transforma o cambia una caracter por otro*/
select translate('toy cagao de sueño','o','x') from dual;

/*obtiene el entero siguiente*/
Select ceil(3.7) from dual;

/*El resto de un numero*/
Select mod(10,2) from dual;

/*Validar el NULO de un numero*/
Select nvl(null,2) from dual;
Select nvl(trim(' '),1) from dual;

/*Potencia*/
Select power(2,4) from dual;

/*Redondea*/
Select round(2.5) from dual;

/*Acerca a la parte entera*/
Select trunc(2.5) from dual;

/*Funcion DECODE */
select * from empleado
select sexo, decode(sexo,'F','femenino','M','Macho') "Tipo de sexo" from empleado

/*Uso de CASE */
select salario,
case
when salario > 1000 then 0
else 1
end
from empleado




/*------------------------------------------------*/
/* FUNCIONES */
/*------------------------------------------------*/

/* Crear funciones */

/*CREATE [OR REPLACE] FUNCTION function_name.   
[ (parameter [,parameter]) ].   
RETURN return_datatype.IS |
AS.    [declaration_section].
BEGIN.    executable_section.
[EXCEPTION.    exception_section].END [function_name];*/


CREATE or replace function Par_Impar(pnumero integer)
return varchar2
AS
vtexto varchar2(10);
BEGIN
if mod(pnumero,2)=0 then
vtexto:='Es par';
else
vtexto:='Impar';
end if;

Return vtexto;
END Par_Impar;


select salario, par_impar(salario) from empleado;

jueves, 22 de diciembre de 2011

Clase RECUPERATIVA - Miércoles 21 de Diciembre de 2011


Tablas all_tables y all_tab_columns



select distinct owner, table_name
    from all_tables tablas
    where owner = '141565168';




select distinct column_name
    from all_tab_columns col
    where upper(owner) = 'HR'
    and lower(table_name) = '141565168';



select * from all_tables;
/********************************************************************************************/


tablas all_tables y all_tab_columns asociadas a un usuario

select owner, table_name 
from all_tables 
where owner ='141565168';


select column_name, owner, table_name 
from all_tab_columns;



/********************************************************************************************/


Realizar un cursor con catalogo del usuario



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 = '158196506';

       /* 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



Usando dual


select sysdate from dual;

¿Qué día de la semana nació usted?

select  
to_char(to_date(‘09-SEP-1958','dd-mon-yyyy'),'day') 
from dual;


select to_char(sysdate,'day') 
from dual;


dia de nacimiento


select to_char(to_date('14-01-1981','dd-mm-yyyy'),'day') 
from dual;



/********************************************************************************************/


%TYPE



create procedure update_emp (empid in number) 
is 
 v_empid number; 
 v_fname varchar2(20); 
 v_lname varchar2(30); 
 v_hire date; 
 v_sal number; 
begin 
end; 


create procedure update_emp (empid in number) 
is 
 v_empid employees.employee_id%type; 
 v_fname employees.first_name%type; 
 v_lname employees.last_name%type; 
 v_hire employees.hire_date%type; 
 v_sal employees.salary%type; 
begin 
end; 


begin 
 select employee_id,first_name, 
 last_name, hire_date, salary into v_empid, v_fname, v_lname, v_hire, v_sal 
 from employees 
 where employee_id = empid; 
end;


create procedure update_emp (empid in number) is 
--declare 
TYPE emp_record_type IS RECORD 
(v_empid employees.employee_id%type;
 v_fname employees.first_name%type; 
 v_lname employees.last_name%type; 
 v_hire employees.hire_date%type; 
 v_sal employees.salary%type; 
); 
emp_record emp_record_type; 
begin ...
/********************************************************************************************/


Creando tablas para pruebas



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;


/********************************************************************************************/
Pregunta de prueba


TO_CHAR: 
Transforma un tipo DATE ó NUMBER en una cadena de caracteres. Ejemplos:
to_char(45.31, '99.9') -> retorna '45.3' 
to_char(9,125.33, '9,999.99') -> retorna '9,125.33'
to_char(77, '0099') -> retorna '0077'
TO_DATE: 
Transforma un tipo NUMBER ó CHAR en DATE. 
Ejemplo:
to_date('31/10/2007','DD/MM/YYYY‘) -> retorna ‘31/10/2007’
TO_NUMBER: 
Transforma una cadena de caracteres en NUMBER. Ejemplo:
to_number('123') -> retorna 123

/********************************************************************************************/
Funciones que devuelven valores numéricos


ASCII(cad)= Devuelve el valor ASCII de la primera letra de la cadena "cad". Ejemplo:
ASCII('R') -> Retorna 82
INSTR (cad1, cad2 [, comienzo [,m]])= Permite una búsqueda de un conjunto de caracteres en una cadena pero no suprime ningún carácter después. Ejemplo:
INSTR('CORPORATE FLOOR','OR', 3, 2) ->El resultado obtenido es 14, busca la segunda ocurrencia de la cadena OR a partir de la tercer posición
LENGTH (cad)= Devuelve el numero de caracteres de cad. Ejemplo:
LENGTH(‘HOLA’) ->retorna 4
/********************************************************************************************/


Funciones para el manejo de fechas 


SYSDATE= Devuelve la fecha del sistema. 
ADD_MONTHS (fecha, n)= Devuelve la fecha "fecha" incrementada en "n" meses. 
LAST_DAY (fecha)= Devuelve la fecha del último día del mes que contiene "fecha". 
MONTHS_BETWEEN (fecha1, fecha2)= Devuelve la diferencia en meses entre las fechas "fecha1" y "fecha2". 
NEXT_DAY (fecha, “cad”= Devuelve la fecha del primer día de la semana indicado por "cad" después de la fecha indicada por "fecha“, donde cad corresponde al día de la semana EJ: ‘sábado’

Clase RECUPERATIVA 2 - Sábado 17 de Diciembre de 2011


PL/SQL


Declare
        i     := 1;
Begin

   Loop
            dbms_output.putline ('Hola' || i );
            i:= i+1
    Exit  when  (i>5000)

   EndLoop


/********************************************************************************************/

FOR

For  i  in  ['Hola' || i );

  Loop

     dbms_output.putline ('Hola' || i );


  EndLoop


FOR (REVERSE)


For i in reverse 1..5000


 Loop

     dbms_output.putline ('Hola' || i );


  EndLoop



/********************************************************************************************/

WHILE

  i := 1;

  While  ( i<5000)

  Loop
     
       dbms_output.putline ('Hola' || i );

    EndLoop


/********************************************************************************************/

CURSOR (Consulta en memoria asignado a un nombre)

Declare
  vnombre         empleado.nombre%type
  vsexo              sexo.nombre%type
  cursor             ListaGeneroEmpleado  is
  vgenero           varchar2 (10)

     Select  nombre, sexo   FROM empleado;

    Begin
         Open       ListaGeneroEmpleado ;
         Loop

          Fetch ListaGeneroEmpleado   INTO vnombre, vsexo;
          When   ListaGeneroEmpleado %NOTFOUND;
 
         IF vsexo := 'M'  Then
              vgenero := 'Hombre';
         Else  IF  vsexo = 'F' Then
               vgenero := 'mujer'
         Else
               vgenero := 'ambiguo'
         EndIF

       dbms_output.putline  (VNOMBRE ||'', VSEXO ||'',vgenero  );
       EndLoop

Close ListaGeneroEmpleado;

/********************************************************************************************/

UPDATE

Update  empleado
     Set  sexo = Upper(sexo);

Sube toda la letra en la tabla a MAYUSCULA

Clase 5 - Viernes 16 de Diciembre de 2011


Cátedra

7 preguntes de alternativa
2 de desarrollo (select
/********************************************************************************************/

INSERT

listar las propiedades que  "arrienda" un cliente (nombre, apellido,numpro)(join)

SELECT      c.nombre, c.apellido, a.numpropiedad, a.fechainicio
from             cliente c, arriendo a
where           c.numclinete = a.numcliente
AND            c.nombre = 'Juan'
AND            c.apellido = 'Perez'

INSERT con 3 tablas


SELECT c.nombre, c.apellido, a.numpropiedad, a.fechainicio
from cliente c, arriendo a, propiedad p, empleado e
where c.numclinete = a.numcliente
AND            a.numpropiedad = p.numpropiedad
AND            p.numempleado = e.numempleado


-----------------------------
ddl    creando tabla
dml   agregando registro
----------------------------

NULL    es un valor especial para un atributo que nunca tuvo valor.


/********************************************************************************************/


Mejor manera para buscar

que usar AND y IN
SELECT
numempleado, nombre, apellido FROM EMPLEADO WHERE numoficina IN(SELECT numoficina FROM OFICINA WHERE ciudad = 'London')
/********************************************************************************************/

SELECT max(salario) from empleado where sexo = 'F'

/********************************************************************************************/

sábado, 10 de diciembre de 2011

Clase 4 - Sabado 10 de Diciembre de 2011

create table T1 (
e INTEGER,
F INTEGER
);
Begin
  delete from T1;
  insert into T1 values (1, 3);
  insert into T1 values (2, 4);
end

select * from t1;
/* lo de arriba es SQL; debajo es el programa PL/SQL*/
DECLARE
     a number;
      b number;
BEGIN
  select e,f into a,b /*Cursor implicito, acepta solo un registro*/
  from  T1
  where e > 1; /* Este select asigna el atributo e->a y f ->b, de todos aquellos registros cuyo atributo e->1 */
  insert into T1 values (b,a);
END;

/****************************************/

Set serveroutput on; /* habilita salida output */
/* habilitar en Toad, seleccionar pestaña DBMS Output, seleccionar Turn Output On (circulo rojo inferior izquierdo )*/
BEGIN
  dbms_output.put_line('Hola mundo');
END;

/****************************************/

DECLARE
    Precio integer :=18;
BEGIN
  if precio >=15 then
   dbms_output.put_line('El precio es : ' || precio);
  end if;
END;

/****************************************/

DECLARE
    Precio integer :=18;
    texto varchar2(5);
BEGIN
  if precio >=15 then
   texto:='Mayor';
    
  else
   texto:='Menor';
  end if;
 
  dbms_output.put_line('Es precio es ' || Texto || ' y es' || Precio);
 
END;

/****************************************/
/* Queda en un ciclo hasta que se cumpla la condicion */

DECLARE
    i integer :=0;
   
BEGIN
  LOOP
 
    i:= i + 1;
   dbms_output.put_line(i || '- Hola mundo');
   exit when i =10;
  
  END LOOP;
 
END;