You are on page 1of 71

Algunas Palabras Claves Y Ejemplos Para El Manejo De PostgreSQL PostgreSQL (UN BREVE REPASO) M.C.

Edgar Rangel Lugo


Derechos Reservados(c) 2013. Edgar Rangel Lugo. Mxico. ** La imagen de fondo fue extrada de captura de pantalla del software de la Herramienta pgAdmin III que instala PostgreSQL, quien tiene los derechos reservados.

Destacan Dos Lenguajes:

DDL Definicin DML Manipulacin

DDL Definicin
CREATE - Crear DROP - Borrar ALTER - Modificar

DDL Definicin CREATE DATABASE


CREATE DATABASE nombre WITH OWNER = usuario ENCODING = 'LATIN9' CONNECTION LIMIT = -1 ;

DDL Definicin CREATE TABLE


CREATE TABLE nombre_tabla (
nombre_campo1 tipo_datos restriccin, ... nombre_campoN tipo_datos restriccin ...

) INHERITS (nombre_tabla_base) ;

DDL Definicin
DROP DATABASE
drop database nombre_de_la_BD ;

DROP TABLE
drop table nombre_de_la_Tabla ;

DDL Definicin
ALTER DATABASE
ALTER DATABASE nombre OWNER TO usuario ; ALTER DATABASE nombre RENAME TO nuevo_nombre ;

DDL Definicin
ALTER TABLE
DROP
alter table productos drop existencias ;

ADD
alter table productos add existencias integer check (existencias>=0);

DML Manipulacin
INSERT Agregar (Insertar) UPDATE Modificar (Actualizar) DELETE Borrar (Eliminar) SELECT Listar (Seleccionar)

DML Manipulacin
INSERT
Insert into tabla (campos) values (valores) ; Insert into tabla1 (campos) select campos from tabla2 ; Insert into tabla1 select * from tabla2 ;

DML Manipulacin
UPDATE
Update nombre_tabla Set campo1 = valor1 , , campoN = valorN Where (Condicin) ;

DML Manipulacin
DELETE
Delete From nombre_tabla Where (Condicin) ;

DML Manipulacin
SELECT
Select campos From tablas Where (condicin) ; Select campos From tablas Where (condiciones) Group By campos Having (condicin) Order By campos Asc/Desc;

DML Manipulacin
SELECT
Select campos into variables From tablas ; Select funcion_almac (parametros) ; Select func_almac () into variable ;

Algunos Tipos Vlidos Para Create, Insert, Alter, que destacan son:
text timetz numeric [ (p, s) ] double precision varchar [ (n) ] boolean real date datetime serial bigserial integer bigint xml

Algunas Restricciones Para Create, Alter, que destacan son:


CHECK (condicin) = CHECK (nombre_campo operador valor)

UNIQUE (nombre_campo1, ..., nombre_campoN) NOT NULL NULL PRIMARY KEY UNIQUE REFERENCES nombre_tabla (PK_de_tabla_ext) FOREIGN KEY (campo1, camposN) REFERENCES tabla_ext (campo_ext1, campo_ext2) REFERENCES tabla_ext ON DELETE CASCADE ON UPDATE CASCADE

Algunos Operadores Para Condiciones que destacan son:


Aritmticos: Lgicos: Relacionales: + and or ^ not * /

>= <= > < <> = between like

CLASES , OBJETOS , MTODOS Y EVENTOS


(Utilizando PostgreSQL 8.4.4 / 9.0)

M.C. Edgar Rangel Lugo


Derechos Reservados(c) 2013. Edgar Rangel Lugo. Mxico.

** La imagen ha sido extrada de la captura de pantalla Del programa de instalacin de PostgreSQL empaquetado Por EnterpriseDB, quien tiene los derechos reservados.

CLASES - SE DECLARAN UTILIZANDO


TYPE.

Sintaxis :

CREATE TYPE nombre_tipo AS (


atributo_1 tipo, .... atributoN tipo

); Ejemplo: CREATE TYPE alumnos ( matricula varchar(50), nombre varchar(50), carrera varchar(50) ); AS

OBJETOS

- SE DECLARAN CAMPOS DENTRO DE UNA TABLA CUYO


TIPO ES UN TYPE.

Sintaxis : CREATE TABLE nombre_tabla (


campo_1 .... , campoN tipo_definido(TYPE), tipo_definido(TYPE)

); Ejemplo: CREATE TABLE escuela (


clave serial primary key, -- es un campo estudiantes alumnos, -- es un objeto profesores maestros -- es un objeto

);

MTODOS

SE DECLARAN UTILIZANDO FUNCTION .

Sintaxis : CREATE FUNCTION nombre_funcion (parametros) RETURNS tipo AS $$ DECLARE -- variables : nombre_variable tipo ; BEGIN -- sentencias SQL y de programacion RETURN variable_del_tipo ; END ; $$ LANGUAGE plpgsql ;
NOTA: LOS parmetros SE INTEGRAN POR : variable Tipo, ..... SEPARADOS POR COMA.

MTODOS

SE DECLARAN UTILIZANDO FUNCTION .

Ejemplo : CREATE FUNCTION civa (saldo numeric, iva integer) RETURNS numeric AS $$ DECLARE myiva numeric := 0; BEGIN myiva := (saldo * iva) / 100; RETURN myiva; END ; $$ LANGUAGE plpgsql ;

ALGUNAS SENTENCIAS QUE PUEDEN USARSE DENTRO DE CDIGO PL/SQL


ASIGNACIN variable := valor ; SENTENCIAS RAISE NOTICE 'Texto %' , variable NULL, NOT FOUND, RETURN, CONDICIONES IF (CONDICION) THEN NULL ; ELSE NULL; END IF;

OTRAS SENTENCIAS QUE PUEDEN USARSE DENTRO DE CDIGO PL/SQL


CICLOS FOR variable (CONSULTA - RANGO) LOOP NULL; END LOOP; WHILE (CONDICION) LOOP NULL; END LOOP; Y TODO COMANDO DEL SQL SELECT , INSERT INTO, UPDATE, DROP, CREATE, DELETE, .....

Y TAMBIN PUEDEN USARSE LOS OPERADORES


ARITMTICOS +, -, * , / RELACIONALES > , < , >= , = , <=, <> , != , between , like LGICOS and or not

Y LOS TIPOS O VALORES QUE PUEDEN USARSE EN LA SENTENCIA RETURN


SE PUEDE REGRESAR: - UNA VARIABLE - UN VALOR - NULL Y SI ES UNA FUNCIN QUE UTILICE UN TRIGGER : - NULL - OLD - NEW -- SI ES TRIGGER UPDATE OR DELETE -- SI TRIGGER ES BEFORE -- SI TRIGGER ES AFTER

EVENTOS -

SE COMBINAN DOS ELEMENTOS: 1) EL USO DE FUNCTION CUYO TIPO DE RETORNO ES UN TRIGGER . Y 2) SE IMPLEMENTAN UTILIZANDO LA SIGUIENTE SINTAXIS:

PASO 1

CREATE OR REPLACE FUNCTION nombre (parametros) RETURNS TRIGGER AS $$ NOTA: LOS parmetros DECLARE POR : -- variables : nombre_variable tipo ; SE INTEGRAN variable Tipo, ..... SEPARADOS POR COMA. BEGIN -- sentencias SQL y de programacin RETURN Tipo_Trigger ; -- NEW , OLD, NULL NOTA: Donde: END ; MODIFICADOR $$ LANGUAGE plpgsql ;
puede ser BEFORE o AFTER. Y SENTENCIA puede ser DROP , INSERT, DELETE, UPDATE, ......

PASO 2

CREATE TRIGGER nombre_del_disparador MODIFICADOR SENTENCIA ON tabla FOR EACH ROW EXECUTE PROCEDURE nombre_function ( parametros);
NOTA: Para SENTENCIA o MODIFICADOR : BEFORE o DELETE o UPDATE, se recomienda el uso de OLD o NULL .

EJEMPLO DE EVENTOS - TRIGGERS


CREATE OR REPLACE FUNCTION listar () RETURNS TRIGGER AS $$ DECLARE filas clientes%ROWTYPE ; actual clientes%ROWTYPE ; BEGIN FOR actual IN select * from clientes LOOP RAISE NOTICE ' % ' , actual ; END LOOP; RETURN OLD ; END ; $$ LANGUAGE plpgsql ; CREATE TRIGGER trigger_lista BEFORE DELETE ON clientes FOR EACH ROW EXECUTE PROCEDURE listar () ;

Ejemplos Para PostgreSQL PostgreSQL


By

M.C. Edgar Rangel Lugo


Derechos Reservados(c) 2013. Edgar Rangel Lugo. Mxico. ** Las imgenes de Chuchita y Cholillo son obras registradas por el autor de este documento.

Por fin !!! Ya Vienen Los Ejemplos

Oh My God

Primero, Lo Primero: CURSO PostgreSQL 8.4 ........................................... Para Entrar .................... 1.- Entrar a pgAdmin y hacer doble click sobre PostgreSQL 8.4 (localhost:5432) 2.- Teclear clave de acceso que se dio durante la instalacin (Por Ejemplo: 12345678)

Luego : Crear BD ................ 1.- Botn derecho sobre databases 2.- Click en opcin : New Database... 3.- Se escribe nombre a la BD, se selecciona un dueo (usuario), y se ajustan el resto de los parmetros y privilegios 4.- Se pulsa botn OK

Despus :
1.- Click sobre el nombre de la base de datos 2.- Se pulsa sobre signo + para expandir la estructura 3.- Se hace doble click sobre Schemas y luego doble click sobre public 4.- Luego, botn derecho sobre Tables 5.- Y CLick sobre New Table... 6.- Se escribe nombre a la tabla y se selecciona un dueo (usuario) 7.- En pestaa columns se pulsa botn add
7.1.- Se escribe nombre del campo y se selecciona un tipo de datos 7.2.- Se escribe valor por default 7.3.- Se indica si se desea Not Null (marcando la casilla de verificacin) 7.4.- Se pulsa botn OK 7.5.- Si desea otro campo, ir al paso 7

Crear Tablas .......................

8.- Luego, en la pestaa constrains, se selecciona Primary Key y se pulsa botn add
8.1.- En pestaa columns, se selecciona el campo que sera clave primaria y se pulsa botn add 8.2.- Se pulsa OK a la ventana o dialogo

9.- Se pulsa OK en ventana principal

Finalmente : OTRA MANERA: -- USANDO COMANDO CREATE .... 1.- Se pulsa sobre boton de barra de herramientas SQL (Execute arbitrary SQL query) 2.- En la pestaa SQL Editor se escribe: create table datos_personales ( domicilio varchar(50) null, telefono numeric );

OTRO EJEMPLO: Crear una tabla productos usando Restricciones o constraints CREATE TABLE productos (
codigo_barras bigint PRIMARY KEY NOT NULL, descripcion varchar(40) NOT NULL, precio numeric (8, 2) NOT NULL CHECK (precio>0), costo numeric (8, 2) NOT NULL CHECK (costo>0), exist integer NULL CHECK (exist >= 0)

);
Ahora s , Que Vengan Los Ejemplos

Herencia ................
Suponiendo que proveedores y clientes tienen los mismos campos como datos personales, solo se crea la tabla con algunos datos y el resto se hereda: create table datos_personales ( domicilio varchar(50) null, telefono numeric );

create table proveedores ( clave_pro integer PRIMARY KEY, razon_social varchar(50) NOT NULL ) INHERITS (datos_personales); create table clientes ( clave_cli integer PRIMARY KEY, nombre varchar(50) NOT NULL, saldo float NOT NULL ) INHERITS (datos_personales);

Recordando ... ........................


Funciones o Propiedades de un Campos (Constraints):

clave integer PRIMARY KEY id integer UNIQUE descripcion NULL precio numeric CHECK(precio>0) costo numeric UNIQUE NOT NULL CHECK(costo<precio AND costo>0) UNIQUE (precio, costo) -- ERROR deben ser integer

Recordando ... ......................... Para El Manejo de LLaves (KEYS)


CREATE TABLE A ( Aid integer PRIMARY KEY, ... ... ); CREATE TABLE B ( Bid integer PRIMARY KEY, Aid integer REFERENCES A (Aid), Aid integer REFERENCES A ON DELETE CASCADE, ... ... );

Recordando ... ......................... Y Los Tipos De Datos


integer bigint smallint decimal numeric real double precision serial bigserial money

float char(n) text character(n) varchar(n) varying(n) "char" xml

boolean date time interval bytea bit(n)

Recordando ... ......................... Y Los Operadores < > >= <= = <> != between like and or not + * / ^

Vengan Los Ejemplos, Pues !!!

Para agregar hora (time) y fecha (date) puede utilizar el formato: (date) (time) insert into ventas values( '20-01-2009', '12:30' ); Para Modificar y Eliminar Usando Fechas: DELETE FROM ventas WHERE fecha='22-02-2010'; UPDATE ventas SET fecha='22-02-2010' , hora='13:30:25' WHERE fecha = '20-01-2009';

Y PARA LOS TIPOS ENUMERADOS : Create TYPE mybinario AS ENUM ('F', 'V'); Create table BINARIOS ( clave SERIAL primary key, datos mybinario default 'V' );

Y PARA LOS ARREGLOS : Create table AAA ( datos integer [3] [3] ); insert into AAA values( '{ {0,0,0},{1,1,1},{2,2,2} }' );

Y PARA CLASES y OBJETOS :


Las clases seran en este caso los create type .. AS, es decir, el tipo definido por el usuario que pueden ser equivalentes o similares a unas tablas..... Y los objetos serian entonces, los campos de una tabla cuyo tipo de datos no es uno primitivo, sino mas bien es de tipo definido por el usuario...

-- clases CREATE TYPE alumnos AS ( matricula varchar(20), nombre varchar(50), carrera varchar(45), semestre varchar(5) ) ; CREATE TYPE maestros AS ( cedula varchar(20), nombre varchar(50), carrera varchar(45), semestre varchar(5) ) ; CREATE TABLE escuela ( clave serial primary key, estudiante alumnos, -- objeto profes maestros -- objeto );

-- Para agregar y consultar se hace :

insert into escuela (estudiante, profes) values ( ('675849', 'cholillo' , 'informatica','5a') , ('342450', 'chuchita', 'agronomia' ,7b' ) ); select * from escuela; select (profes).nombre, (estudiante).nombre from escuela ;

-- Para eliminar o actualizar se puede usar:

UPDATE escuela SET profes = ROW('valor1', , 'valorN' ) WHERE (Condicin) ; UPDATE escuela SET (profes).nombre = 'valor_dato' WHERE (Condicin) ;

Stored Procedures o Funciones

Y Venga La Implementacin !!!

CREATE FUNCTION mostrar() RETURNS numeric AS $$ DECLARE num numeric := 0; BEGIN RAISE NOTICE 'Num= %', num; select sum(saldo) into num from clientes; if not found then RAISE NOTICE 'No se encontro'; -- En consola, else se invocara as: RAISE NOTICE 'Ok'; end if; select mostrar() ; RETURN num; Permite mostrar el saldo de END; todos los clientes $$ LANGUAGE plpgsql;

Stored Procedures o Funciones


CREATE OR REPLACE FUNCTION ok() RETURNS numeric AS $$ DECLARE num numeric := 0; BEGIN
insert into clientes(nombre, saldo) values('chuchita', 2350.50);

insert into clientes(nombre, saldo) values('cholillo', 800); select mostrar() into num; return num; -- En consola, END; se invocara as: $$ LANGUAGE plpgsql; select ok ( ) ;
Inserta dos clientes y regresa la suma de todos los saldos

Stored Procedures o Funciones

CREATE function mayor (a numeric, b numeric) returns numeric as $$ DECLARE c numeric := 0; BEGIN if (a > b ) then c:= a; -- En consola, else se invocara as: if (a = b) then c:= -1; else select mayor(5, 6) ; c:=b; select mayor(5, 5) ; end if; Regresa el nmero mayor end if; entre a y b. Si son iguales, return c; Regresa -1 END; $$ LANGUAGE plpgsql;

Stored Procedures o Funciones


CREATE function correr () returns text as $$ DECLARE -- En consola, se invocara as: p numeric := 0; q numeric := 0; select correr ( ) ; r numeric := 0; Consulta nombre y saldo de dos a varchar(50) ; Clientes y Regresa Texto Indicando Cual es el cliente con saldo mayor b varchar(50) ; BEGIN

select nombre, saldo into a, p from clientes where nombre='chuchita'; select nombre, saldo into b, q from clientes where nombre='cholillo';

select mayor(p, q) into r; return 'chuchita vs. Cholillo: ' || a || ' > ' || b || ' ? : ' || r; END; $$ LANGUAGE plpgsql;

Y Para Los TRIGGERS

Se deben hacer funciones que regresen tipo trigger:

CREATE OR REPLACE FUNCTION visualizar() RETURNS TRIGGER AS $$ DECLARE filas clientes%ROWTYPE ; i clientes%ROWTYPE ; BEGIN -- Cuando sea invocada por -- muestra registros antes de agregar algn Trigger, Mostrar for i IN select * from clientes los clientes antes o despus LOOP De la operacin, segn se RAISE NOTICE ' %', i; Indique en el Trigger END LOOP; RAISE NOTICE ' Correcto' ;
-- obligatorio, porque sino, No agrega el dato nuevo, -- cuando se use UPDATE puede regresar RETURN NULL;

RETURN NEW ; END; $$ LANGUAGE plpgsql;

TRIGGERS
CREATE TRIGGER mostrar_trigger BEFORE INSERT ON clientes FOR EACH ROW EXECUTE PROCEDURE visualizar(); CREATE TRIGGER mostrar_trigger2 AFTER INSERT ON clientes FOR EACH ROW EXECUTE PROCEDURE visualizar();

-- En el primer caso, se mostrar el listado de clientes antes de Agregar una tupla en dicha tabla. Y en el segundo caso, se mostrar el listado de clientes despus de haber agregado Una tupla en la tabla clientes.

Ejercicios Para PostgreSQL PostgreSQL


By

M.C. Edgar Rangel Lugo


Derechos Reservados(c) 2013. Edgar Rangel Lugo. Mxico. ** Las imgenes de Chuchita y Cholillo son obras registradas por el autor de este documento.

Oye, A poco esos Fueron los ejemplos ?

Pues segn, pero si no te gustaron, ay Te van estos ejercicios

EJERCICIO # 1: Crear tablas e insertar datos.


Se muestra como crear tres tablas usando restricciones e insertar datos.

create table datos ( clave serial primary key, nombre varchar(50), edad integer check(edad>5), domicilio varchar(60) ); create table clientes ( cla_cli serial primary key, rfc varchar(50), saldo integer check(saldo>0) ) inherits (datos) ; create table empleados ( clave_emp serial primary key, turno varchar(30), dias_trab integer check(dias_trab>=0) ) inherits (datos); insert into datos(nombre, edad, domicilio) values('fausto lopez', 41, 'conocido'); insert into clientes (nombre, edad, domicilio, rfc, saldo) values('pancho lopez', 23, 'desconocido', '????', 1500.50 ); insert into clientes (nombre, edad, domicilio, rfc, saldo) values('chuchita', 25, 'coyuca', '????', 2000 );

EJERCICIO # 2: Implementando Un Procedimiento Almacenado:


CREATE FUNCTION civa (saldo numeric, iva integer) RETURNS numeric AS $$ DECLARE myiva numeric := 0; BEGIN - Calcula el porcentaje de un myiva := (saldo * iva) / 100; nmero, que en este caso, el RETURN myiva; porcentaje del Saldo. END ; Caso prctico: El iva. $$ LANGUAGE plpgsql ;

-- Utilizando El Procedimiento Almacenado :


SELECT civa (1500, 50) , civa (1500, 16) ; SELECT nombre, saldo, civa(saldo, 15) from clientes; select nombre, civa(edad, 15) from datos;

EJERCICIO # 3: Implementando Otro Procedimiento Almacenado:


CREATE FUNCTION esonoes (edad integer) RETURNS text AS $$ DECLARE cadena text ; BEGIN cadena := 'No Se detecto'; IF (edad >=18 ) THEN cadena := 'Mayor de Edad'; ELSE - Se indica la edad de la cadena := 'Menor de Edad'; Persona (datos_personales), y END IF; La funcin informa si es RETURN cadena; Mayor o menor de edad. END ; $$ LANGUAGE plpgsql ;

-- Utilizando El Procedimiento Almacenado :


insert into datos(nombre, edad, domicilio) values('pepito',16,'X'); select nombre, esonoes(edad) from datos order by nombre desc;

EJERCICIO # 4: Crear TIPOS e insertar datos.


Se crean dos tipos y luego una tabla con dos campos de TYPE. Despus se insertan datos en la tabla y se muestra como dentro de un campo aparecen varios valores.

CREATE TYPE alumnos AS ( matricula varchar(50), nombre varchar(50), carrera varchar(50) ) ; CREATE TYPE maestros AS ( cedula varchar(50), nombre varchar(50), grado_academico varchar(50) ) ; CREATE TABLE escuela ( clave serial primary key, -- es un campo estudiantes alumnos, -- es un objeto profesores maestros -- es un objeto );
insert into escuela (estudiantes, profesores) values( ('2010990', 'agripino', 'biologia' ) , ('02934', 'jirafales', 'ing.') ); insert into escuela (estudiantes, profesores) values( ('5670977', 'fandila', 'contaduria' ) , ('02934', 'jirafales', 'ing.') ); insert into escuela (estudiantes, profesores) values( ('11120909', 'chuchita', 'contaduria' ) , ('12934', 'juan lopez', 'dr.') ); insert into escuela (estudiantes, profesores) values( ('789000', 'cholillo', 'biologia' ) , ('12934', 'juan lopez', 'dr.') ); select * from escuela ;

EJERCICIO # 5: Listando Datos Con TIPOS .


Partiendo del ejemplo anterior, se muestra como listar tablas con campos de TYPE. select (estudiantes).nombre, (estudiantes).carrera , (profesores).nombre from escuela

where (profesores).nombre like '%ales%' ; -- TAREA: CHECAR SI ESTO NO TIENE ERROR: select (estudiantes).nombre, (estudiantes).carrera from escuela where (profesores).nombre = 'jirafales'; select (profesores).nombre, (profesores).grado_academico from escuela where (estudiantes).nombre = 'agripino'; select (profesores).nombre, (profesores).grado_academico from escuela where (estudiantes).nombre = 'chuchita'; select (estudiantes).nombre, (estudiantes).carrera from escuela where (profesores).nombre = 'juan lopez';

EJERCICIO # 6: Otro Ejemplo De TIPOS


Se crea un TYPE y una tabla con dicho tipo y se insertando datos.

CREATE TYPE proveedores AS ( cla_pro integer, nombre varchar(50), domicilio varchar(50), telefono varchar(50) ) ; CREATE TABLE productos ( clave serial primary key, codigo_barras numeric not null, descripcion varchar(50), costo numeric check(costo>0), precio numeric check(precio>0), existencias integer default '0', proveedor proveedores ) ;
insert into productos (codigo_barras, descripcion, costo, precio, existencias, proveedor ) values (203948 , 'fab' , 4, 10.50, 10, (111, 'Blanca Nieves', 'suc. indep.', '01-747-1234565')); insert into productos (codigo_barras, descripcion, costo, precio, existencias, proveedor ) values (345679 , 'aceite' , 8, 20.50, 5, (112, 'oleico', 'reforma', '01722-222333')); insert into productos (codigo_barras, descripcion, costo, precio, existencias, proveedor ) values (203948 , 'rufles' , 1, 5, 4, (211, 'sabritas', 'c. brazil # 21', '0155-59234565'));

EJERCICIO # 7: Otro Procedimiento Almacenado


CREATE FUNCTION es_o_no_bajo (existencias integer) RETURNS text AS $$ DECLARE cadena text ; BEGIN cadena := 'Se desconoce estado'; IF (existencias>5) THEN cadena:= 'Perfecto'; - Partiendo del ejemplo anterior, se implementa ELSE una funcin para saber cadena:= 'Bajo en Existencias'; si un producto est bajo END IF; en existencias. RETURN cadena ; END ; $$ LANGUAGE plpgsql ; select descripcion, existencias, es_o_no_bajo(existencias) from productos;

EJERCICIO # 8: Usando TRIGGERS


CREATE OR REPLACE FUNCTION listar () RETURNS TRIGGER AS $$ DECLARE filas clientes%ROWTYPE ; actual clientes%ROWTYPE ; BEGIN FOR actual IN select * from clientes LOOP RAISE NOTICE ' % ' , actual ; END LOOP; RETURN OLD ; Permite Listar los END ; Clientes antes de ser $$ LANGUAGE plpgsql ; Eliminados de la
base de datos.

CREATE TRIGGER trigger_lista BEFORE DELETE ON clientes FOR EACH ROW EXECUTE PROCEDURE listar () ;

EJERCICIO # 9: Otro Ejemplo Similar


Create or replace function listar() returns trigger as $$ declare filas productos%rowtype; actual productos%rowtype; begin raise notice ' Producto Exis Status ' ; for actual in select * from productos loop raise notice ' % % % ', actual.descripcion , actual.existencias , es_o_no_bajo(actual.existencias) ; end loop; return OLD ; Permite Listar los end; productos antes de ser $$ language plpgsql; Eliminados de la create trigger trigger_lista before delete on productos for each row execute procedure listar();
base de datos.

delete from productos where descripcion like '%ru%'; delete from productos;

EJERCICIO # 10: Otro Ejemplito


Crear funcin que permita mostrar ganancias a c/u de los productos

create function ganancias (costo numeric, precio numeric) returns numeric as $$ declare ganancia numeric:=0; begin ganancia:= precio-costo; return ganancia; Indicando el costo y end; Preciola funcin $$ language plpgsql; Regresa la resta, que
Refiere a las ganancias Para ese producto.

select descripcion, precio, costo, ganancias(costo, precio) from productos ;

EJERCICIO # 11: Otro Ejercicito


Crear tabla llamada respaldo cuya estructura sea la misma que productos. Y crear trigger que respalde todos los productos en la tabla respaldo antes de insertar datos en productos

Create table respaldo ( clave serial primary key, codigo_barras numeric not null, descripcion varchar(50), costo numeric check(costo>0), precio numeric check(precio>0), existencias integer default '0', proveedor proveedores );
CREATE OR REPLACE FUNCTION respaldar () RETURNS TRIGGER AS $$ BEGIN delete from respaldo; INSERT INTO respaldo select * from productos ; RETURN NEW ; END ; $$ LANGUAGE plpgsql ; CREATE TRIGGER mytrigger3 BEFORE INSERT ON productos FOR EACH ROW EXECUTE PROCEDURE respaldar () ; insert into productos(codigo_barras, descripcion, costo, precio, existencias, proveedor) values (12905, 'cafe legal', 7.50, 18.30, 10, (1234, 'nestle', 'ninguno', '01-34-567-89') ); select * from respaldo; select * from productos;

MS EJERCICIOS DE TAREA
Hacer un trigger que permita respaldar los datos en una tabla llamada backup antes de eliminar productos

Hacer trigger que despus de actualizar datos en productos, muestre un listado de los valores que tenan los registros antes de su actualizacin

ADICIONALES
Pues quien sabe, De que le entiendan los Estudiantes del M.C. Edgar Rangel Lugo

Oye, Y esto que viene Para qu ?

OTRA PRCTICA
create table proveedores ( id_proveedor numeric primary key, nombre text, domicilio text, telefono numeric); create table productos ( codigo numeric primary key, id_proveedor numeric, descripcion text, precio numeric, costo numeric, existencias numeric, foreign key (id_proveedor) references proveedores (id_proveedor) on delete cascade on update cascade); create table respaldo (codigo numeric primary key, id_proveedor numeric, descripcion text, precio numeric, costo numeric, existencias numeric);

-- ------------------------------------------------------------------------------ ESTE EJEMPLO ELIMINA TODO DE RESPALDO Y LO VUELVE A COPIAR -- ----------------------------------------------------------------------------create or replace function respaldando () returns trigger as $$ declare -- Solo si se desea mostrarlos antes del respaldo -- actual productos%ROWTYPE ; begin -- Solo si se desea mostrarlos antes del respaldo -- for actual in select * from productos -- loop -- raise notice '% % %', actual.codigo , actual.id_proveedor, actual.descripcion ; -- end loop; delete from respaldo ; insert into respaldo select * from productos ; return OLD ; end ; $$ language plpgsql ; create trigger respaldo4 before delete on proveedores for each row execute procedure respaldando () ;

-- ------------------------------------------------------------------------------- OTRO EJEMPLO QUE NO ELIMINA LO QUE HAY EN RESPALDO, SOLO COPIA LO NUEVO -- QUE SE HA ELIMINADO EN CASCADA ... -- -----------------------------------------------------------------------------create or replace function respaldando () returns trigger as $$ declare actual productos%ROWTYPE ; begin -- Solo si se desea mostrarlos antes del respaldo for actual in select * from productos where id_proveedor = OLD.id_proveedor loop raise notice '% % %', actual.codigo , actual.id_proveedor, actual.descripcion ; end loop; -- delete from respaldo ; insert into respaldo select * from productos where id_proveedor = OLD.id_proveedor ; return OLD ; end ; $$ language plpgsql ; create trigger respaldo5 before delete on proveedores for each row execute procedure respaldando () ;

insert into proveedores (id_proveedor, nombre, domicilio, telefono) values (01, 'Lala','-',7671010011) ; insert into proveedores (id_proveedor, nombre, domicilio, telefono) values (02, 'Alpura','-',7671010022) ; insert into proveedores (id_proveedor, nombre, domicilio, telefono) values (03, 'Sabritas','-',7671010023) ; insert into proveedores (id_proveedor, nombre, domicilio, telefono) values (04, 'Coca-Cola','-',7671010111) ; insert into proveedores (id_proveedor, nombre, domicilio, telefono) values (05, 'Bimbo','-',7671010010) ; insert into productos (codigo, id_proveedor, descripcion, precio, costo, existencias ) values (0001, 01 , 'Flan', 10 , 7 , 5) ; insert into productos (codigo, id_proveedor, descripcion, precio, costo, existencias ) values (0002, 01 , 'Leche', 15 , 11 , 5) ; insert into productos (codigo, id_proveedor, descripcion, precio, costo, existencias ) values (0003, 05 , 'Donitas', 10 , 7 , 5) ; insert into productos (codigo, id_proveedor, descripcion, precio, costo, existencias ) values (0004, 05 , 'Pan Integral', 12 , 8 , 5) ;

create or replace function ganancia (precio numeric, costo numeric) returns numeric as $$ declare ganancia1 numeric := 0 ; begin ganancia1 = precio - costo ; return ganancia1 ; end; $$ language plpgsql ; create view v_existencias as select id_proveedor, codigo, descripcion, existencias from productos order by id_proveedor ; create view v_ganancias as select id_proveedor, codigo, descripcion, precio, costo, ganancia (precio,costo) from productos order by id_proveedor ; select * from v_existencias ; select * from v_ganancias ; delete from proveedores where id_proveedor = 5 ; delete from proveedores where id_proveedor = 5 ; -- Para el Caso 2

Fin
Pues yo ni sent Pasar el tiempo

Por fin !!! Cre que Esto ya no acababa

You might also like