sábado, 5 de julio de 2014

Tarea 6

  • %ROWTYPE

Define un registro con la estructura de la tabla o vista de la B.D., los campos del registro toman sus nombres y tipos de datos de las columnas de la vista o tabla.

Ventajas de %ROWTYPE

El número y los tipos de datos de las columnas de la tabla pueden no ser conocidos. 
Simplifica la programación al no tener que definir explícitamente los campos y tipos del registro. 
Es útil para realizar recuperaciones de filas con la sentencia SELECT:

Sintaxis:

{Cursor_name | cursor_variable_name | nombre_tabla}% ROWTYPE

Ejemplo:

DECLARE
--V_Empleados Empleado%ROWTYPE;
BEGIN
-- Inicialización de campos de la variable
V_Empleados.codigo:=‘Emp01’;
V_Empleados.nombre:=‘Pablo Martínez’;
V_Empleados.ciudad:=‘MADRID’;
...
END;
  •    VARRAY 
Un varray se manipula de forma muy similar a las tablas de PL, pero se implementa de forma diferente. Los elementos en el varray se almacenan comenzando en el índice 1 hasta la longitud máxima declarada en el tipo varray.

Sintaxis:

TYPE <nombre_tipo> IS VARRAY (<tamaño_maximo>) OF <tipo_elementos>;

Ejemplo:

DECLARE
    /* Declaramos el tipo VARRAY de cinco elementos VARCHAR2*/
    TYPE t_cadena IS VARRAY(5) OF VARCHAR2(50);
    /* Asignamos los valores con un constructor */
    v_lista t_cadena:= t_cadena('Aitor', 'Alicia', 'Pedro','','');
BEGIN
    v_lista(4) := 'Tita';
    v_lista(5) := 'Ainhoa';
END;

  • RECORD
Es una agrupación de variables, cada una con su tipo de dato (diferente o igual). 

Puede tener tantas variables como sea necesario 
A estas variables se les pueden asignar valores iniciales inclusive el valor NOT NULL. 
Los valores que no tengan un valor inicial se les asigna NULL. 
Para definir estos nuevos tipos de datos, los debemos hacer en la parte DECLARE del bloque, subprograma o paquete. 
Podemos tener RECORD’s que sean parte de otros.

Sintaxis:

DECLARE
TYPE emp_record_type IS RECORD
(empno NUMBER(4) NOT NULL:=100,
job VARCHAR2(9),
ename emo.ename%TYPE);
emp_record emp_record_type;



Ejemplo:

DECLARE
   pais_rec cpaises%rowtype;
BEGIN
   SELECT * into pais_rec
   FROM cpaises
   WHERE id =335;
END;

  •      TABLE
Una tabla no es más que una colección de elementos identificados por un índice. Son similares a los arreglos o vectores. Y deben contener dos componentes:

  • Una llave primaria del tipo BINARY_INTEGER la cual nos permite indexar la tabla PL/SQL. 
  • Y una columna de un tipo de datos escalar o record los cuales almacenan los elementos de la tabla.
  • Puede incrementar su tamaño dinámicamente

Debemos tener en cuenta que las tablas PL/SQL no son las mismas tablas a las que se hace referencia en las bases de datos.

Sintaxis:

TYPE type_name IS TABLE OF
{column_type|variable%TYPE | table.column%TYPE} [NOT NULL]
[INDEX BY BINARY_INTEGER];
identifier type_name;


Ejemplo:

DECLARE
TYPE PAIS IS RECORD 
(
CO_PAIS NUMBER NOT NULL ,
DESCRIPCION VARCHAR2(50),
CONTINENTE VARCHAR2(20)
); 
TYPE PAISES IS TABLE OF PAIS INDEX BY BINARY_INTEGER ;
tPAISES PAISES;
BEGIN

tPAISES(1).CO_PAIS := 27;
tPAISES(1).DESCRIPCION := 'ITALIA';
tPAISES(1).CONTINENTE := 'EUROPA';
END;

  • CASE
La sentencia CASE, como su nombre lo indica, te permite evaluar casos o distintas condiciones realizando operaciones diferentes para cada uno de ellos en tus PL-SQL Packages en Oracle. 

La sentencia CASE se puede usar de dos formas distintas en tus PL-SQL Packages en Oracle, la primera te permite evaluar la igualdad de una variable y la segunda te permite evaluar condiciones de cualquier tipo. 

Sentencia condicional multiple

Sintaxis:

CASE
   WHEN condition THEN
   WHEN condition THEN
   ELSE
END CASE;
end;

Ejemplo:

declare
  x number;
  r varchar(100);
  begin
     case
         WHEN x=1 THEN r:='aa';
         WHEN x=2 THEN r:='bb';
         ELSE r:='cc';
      END CASE;
 end;

  • %TYPE

Permite declarar una variable basada en:
  • Otras variables previamente declaradas
La definición de una columna de la base de datos Preceder de %TYPE por: 

  • La tabla y la columna de la base de datos
  • El nombre de la variable definida con anterioridad.

Sintaxis:

tipo_campo | variable%TYPE
customers.name%type

Ejemplo: 


DECLARE
 v_EmpName emp.ename%TYPE;
 BEGIN
 SELECT ename INTO v_EmpName FROM emp WHERE ROWNUM = 1;
 DBMS_OUTPUT.PUT_LINE('Name = '|| v_EmpName);
 END;


viernes, 4 de julio de 2014

Tarea 9

  • Ejemplo de TRIGGER
    Ing. Douglas Iván Galvis Carrillo
    galvisdouglas@gmail.com
  • Índice
    1.- Definiciones de Triggers.
    2.- Herramientas Wampserver (PhpMyadmin)
    3.- Ejemplo de Triggers
  • Definición de Trigger o Disparadores
    El soporte para disparadores se incluyó a partir de MySQL 5.0.2. Actualmente, el soporte para disparadores es básico, por lo tanto hay ciertas limitaciones en lo que puede hacerse con ellos.
    Un disparador es un objeto de base de datos con nombre que se asocia a una tabla, y se activa cuando ocurre un evento en particular para la tabla. Algunos usos para los disparadores es verificar valores a ser insertados o llevar a cabo cálculos sobre valores involucrados en una actualización.
    Un disparador se asocia con una tabla y se define para que se active al ocurrir una sentencia INSERT, DELETE, o UPDATE sobre dicha tabla. Puede también establecerse que se active antes o después de la sentencia en cuestión. Por ejemplo, se puede tener un disparador que se active antes de que un registro sea borrado, o después de que sea actualizado.
  • Triggers en Mysql - Básico
    Los triggers tienen dos palabras clave, OLD y NEW que se refieren a los valores que tienen las columnas antes y después de la modificación. Los INSERT permiten NEW, los DELETE sólo OLD y los UPDATE ambas.
    Sintaxis necesaria para crear un trigger
    CREATETRIGGER <nombre> {BEFORE|AFTER} {INSERT|UPDATE|DELETE}ON<tablename>FOR EACH ROW BEGIN <sentenciasSQL> END;
  • 2.- Herramientas Wampserver (PhpMyadmin)
    En esta ocasión trabajaremos en la consola de phpmyadmin, para ello debemos tener instalado en nuestro PC la herramienta Wampserver 2.0i
    - Una vez instalado, entrados haciendo click en el icono del escritorio
  • En la Barra de tareas entramos en el icono
    Y entramos en la consola de Mysql
  • 3.- Ejercicio de Triggers
    1. Una vez en la consola de Phpmyadmin, creamos la bases de Datos prueba
    2. Ponemos en uso la base de Datos mysql> use prueba; Creamos la tabla clientes
  • 3. Ahora crearemos la tabla auditoria_clientes, que será utilizada para registrar todos los cambios, que se hagan en la tabla clientes
    4. Comenzamos a crear los tres disparadores o trigger. Trigger para insertar Inserta_auditoria_clientes
  • 5.- Creamos Trigger para modificar Modifica_auditoria_clientes
    6.- Creamos Trigger para eliminar Elimina_auditoria_clientes
  • 7.- Introducimos datos a la Tabla clientes
    8.- este es el resultado en la Tabla clientes
    9.- finalmente este es el resultado en la Tabla Auditoria_clientes
  • Códigos
  • Tabla: clientes
    CREATE TABLE clientes(id_clienteintnotnullauto_increment, nombre varchar(100),
    seccionvarchar(20), PRIMARY KEY(id_cliente),
    ) ENGINE = InnoDB;
    Tabla: Auditoria_clientes
    CREATE TABLE auditoria_clientes(
    id intnotnullauto_increment,
    nombre_anteriorvarchar(100),
    seccion_anteriorvarchar(20),
    nombre_nuevovarchar(100),
    seccion_nuevavarchar(20),
    usuario varchar(40),
    modificado datetime,
    proceso varchar(10),
    Id_Clienteint(4),
    primary key(id)) ENGINE = InnoDB;
  • Trigger : parainsertar
    CREATE TRIGGER Inserta_auditoria_clientes AFTER INSERT ON clientesFOR EACH ROWINSERT INTO auditoria_clientes(nombre_nuevo, seccion_nueva, usuario, modificado, proceso, Id_Cliente)VALUES (NEW.nombre, NEW.seccion, CURRENT_USER(), NOW(), ‘Incluido', NEW.id_cliente);
    Trigger: para modificar
    CREATE TRIGGER Modifica_auditoria_clientes BEFORE UPDATE ON clientes FOR EACH ROW INSERT INTO auditoria_clientes(nombre_anterior, seccion_anterior, nombre_nuevo, seccion_nueva, usuario, modificado, proceso, Id_Cliente) VALUES (OLD.nombre, OLD.seccion, NEW.nombre, NEW.seccion, CURRENT_USER(), NOW(), ‘Modificado‘, NEW.id_cliente);
  • Trigger : paraeliminar
    CREATE TRIGGER Elimina_auditoria_clientes AFTER DELETE ON clientes FOR EACH ROWINSERT INTO auditoria_clientes(nombre_anterior, seccion_anterior, usuario, modificado, proceso, Id_Cliente) VALUES (OLD.nombre, OLD.seccion, CURRENT_USER(), NOW(), ‘Eliminado‘, OLD.id_cliente);
    INSERT INTO clientes (nombre, seccion) VALUES('Miguel','informatica'),('Rosa','comida'),('Maria','ropa'),('Albert','informatica'),('Jordi','comida');

sábado, 24 de mayo de 2014

Tarea 5

create or replace
function numParImpar(valor1 num)
return varchar1 is
xmensaje varchar1(100):= 'el numero ingresado es par';
ymensaje varchar1(100):= 'el numero ingresado es impar';
begin
if mod(valor1,7)=0
then return amensaje;
else return bmensaje;
end if;
end numParImpar;

select numparimpar (300)from dual;


NUMPARIMPAR(300)

el numero ingresado es impar

sábado, 26 de abril de 2014

Tarea #4

--Crear secuencia
create SEQUENCE seq_id_equipo
increment by 1
start with 200
maxvalue 1000
nocache
nocycle;

--Necesario para permitir valores mas grandes
ALTER TABLE EQUIPO MODIFY id_equipo2 number(38);
--Agrego una linea utilizando la secuencia
INSERT INTO EQUIPO VALUES (seq_id_equipo.NEXTVAL, 'PC','Dell','D630','Video1');
INSERT INTO EQUIPO VALUES (seq_id_equipo.NEXTVAL, 'PC','Dell','D630','Video2');
INSERT INTO EQUIPO VALUES (seq_id_equipo.NEXTVAL, 'PC','Dell','D630','Video3');
INSERT INTO EQUIPO VALUES (seq_id_equipo.NEXTVAL, 'PC','Dell','D630','Video4');

-- Reviso el valor agregado
select * from EQUIPO

-- Consulto valor actual de la secuencia
select seq_id_equipo.CURRVAL FROM dual;

-- Modifico secuencia para que incremente de 1 en 1
drop SEQUENCE seq_id_equipo;
create SEQUENCE seq_id_equipo
increment by 1
start with 300
maxvalue 1000
nocache
nocycle;

--inserto nuevos registros para probar modificacion de secuencia
INSERT INTO EQUIPO VALUES (seq_id_equipo.NEXTVAL, 'PC','Dell','D630','Video5');
INSERT INTO EQUIPO VALUES (seq_id_equipo.NEXTVAL, 'PC','Dell','D630','Video6');
INSERT INTO EQUIPO VALUES (seq_id_equipo.NEXTVAL, 'PC','Dell','D630','Video7');
INSERT INTO EQUIPO VALUES (seq_id_equipo.NEXTVAL, 'PC','Dell','D630','Video8');

--Indices, crea indice sobre la columna TIPO_EQUIPO--
create index index_tipo_equipo on equipo(TIPO_EQUIPO);

--Elimino indice--
drop index index_tipo_equipo;

--Crear sinonimos--
create synonym marca for MARCA_EQUIPO;
--Eliminar sinonimo
drop synonym marca;

--Resultados
sequence SEQ_ID_EQUIPO creado.
table EQUIPO alterado.
1 filas insertadas.
1 filas insertadas.
1 filas insertadas.
1 filas insertadas.
>>Query Run In:Resultado de la Consulta
sequence SEQ_ID_EQUIPO borrado.
sequence SEQ_ID_EQUIPO creado.
1 filas insertadas.
1 filas insertadas.
1 filas insertadas.
1 filas insertadas.
index INDEX_TIPO_EQUIPO creado.
index INDEX_TIPO_EQUIPO borrado.
synonym MARCA creado.
synonym MARCA borrado.

sábado, 19 de abril de 2014

Tarea 3

-- Creación de una vista simple //total de desktop
CREATE VIEW totdesk
AS SELECT id_equipo2, marca_equipo, modelo_equipo
FROM equipo
WHERE tipo_equipo='Desktop';

desc totdesk
select * from totdesk;

-- Creación de una vista compleja
CREATE VIEW userlap
(usuario, marca, modelo)
AS SELECT a.nom_analista ||' '|| a.ap_analista, b.marca_equipo, b.modelo_equipo
FROM analista a, equipo b
WHERE a.id_equipo = b.id_equipo2;

desc userlap
select * from userlap;

-- Creación de una vista con restricción de comprobación //total de desktop READ ONLY
CREATE VIEW totdesk
AS SELECT id_equipo2, marca_equipo, modelo_equipo
FROM equipo
WHERE tipo_equipo='Desktop'
WITH READ ONLY;

desc totdesk
select * from totdesk;

-- Intento de modificar datos de la vista
DELETE FROM totdesk
WHERE marca_equipo = 'Asus';

## Resultado ##
Error que empieza en la línea: 72 del comando -
DELETE FROM totdesk
WHERE marca_equipo = 'Asus'
Error en la línea de comandos : 72 Columna : 13
Informe de error -
Error SQL: ORA-42399: cannot perform a DML operation on a read-only view
###############

-- Eliminación de vistas
drop view totdesk
drop view userlap

[Tarea 1 - Corregida]

drop table equipo cascade constraint;
drop table analista cascade constraint;

CREATE TABLE equipo
(
id_equipo2 NUMBER(2) NOT NULl,
tipo_equipo VARCHAR2(22) NOT NULL,
marca_equipo VARCHAR2(22) NOT NULL,
modelo_equipo VARCHAR2(22) NOT NULL,
falla_equipo VARCHAR2(45) NOT NULL,
 CONSTRAINT equip_id_equip_PK PRIMARY KEY (id_equipo2)
);

CREATE TABLE analista
(
id_analista NUMBER(2) NOT NULL,
nom_analista VARCHAR2(22) NOT NULL,
ap_analista VARCHAR2(22) NOT NULL,
id_equipo NUMBER(2) NOT NULL,
CONSTRAINT analis_id_analis_PK PRIMARY KEY (id_analista),
CONSTRAINT anali_id_equip_FK FOREIGN KEY (id_equipo) REFERENCES EQUIPO(id_equipo2)
);

-- poblamos la tabla Equipo

INSERT INTO EQUIPO VALUES (10, 'Laptop','Toshiba','Convertible','Pantalla');
INSERT INTO EQUIPO VALUES (11, 'Desktop','Acer','5050','SO');
INSERT INTO EQUIPO VALUES (12, 'Laptop','Sony','Vaio','Placa madre');
INSERT INTO EQUIPO VALUES (13, 'Laptop','Asus','J520','SO');


-- poblamos la tabla Analista

INSERT INTO ANALISTA VALUES (01, 'Cristopher','Canales',10);
INSERT INTO ANALISTA VALUES (02, 'Gabriel','Lois',11);
INSERT INTO ANALISTA VALUES (03, 'Mario','Contreras',12);
INSERT INTO ANALISTA VALUES (04, 'Jose','Gonzalez',13);

desc analista

select * from analista;
select * from equipo;

viernes, 11 de abril de 2014

Tarea 2

ALTER TABLE

Con la sentencia ALTER TABLE podemos modificar la estructura de una tabla existente,
según queramos podemos, añadir/eliminar columnas. Otra función de esta sentencia es
crear o borrar restricciones.

Sintaxis:
ALTER TABLE [esquema.]tabla {ADD|MODIFY|DROP}...



Agregar Columna:
ALTER TABLE ANALISTA ADD email VARCHAR2(35);

Modificar Columna:
ALTER TABLE ANALISTA MODIFY email VARCHAR2(50);

Eliminar Columna:
ALTER TABLE ANALISTA DROP COLUMN email;





Agregar Constraint:
ALTER TABLE ANALISTA ADD CONSTRAINT analis_email_UK UNIQUE (email);


Modificar Constraint:
ALTER TABLE ANALISTA DISABLE CONSTRAINT analis_email_UK;

Eliminar Constraint:
ALTER TABLE ANALISTA DROP CONSTRAINT analis_email_UK;