Está en la página 1de 331

Creacin de una base de datos en postgreSQL

Primero vamos a abrir una terminar con control+alt+t

Luego cambiar del usuario actual al usuario postgres sudo su postgres

Despues ya como usuario postgres Createdb taller

Una vez creada la base de datos, vamos a acceder a ella: psql taller

Creacin de tablas

create table N !"#$%&"L&' N !"#$C&!P ( %)P D$D&% , *** N !"#$C&!P N %)P D$D&% +,

Para ver la in-ormacin de la tablas se utiliza el siguiente comando: %aller. /d tabla

Para eliminar una tabla %aller0. D# P %&"L$ tabla,

Crear la tabla 1obs

CREATE TABLE jobs ( job_id serial NOT NULL job_title !arc"ar(#$$% NOT NULL &in_salar' integer NOT NULL &a(_salar' integer NOT NULL )R*+AR, -E, (job_id%%.

)nserte datos el la tabla 1obs

*N/ERT *NTO jobs (job_title &in_salar' &a(_salar'% 0ALUE/ (12erente1 34444 33444%.

create table editoriales' codigo serial, nombre varc2ar'34+, primary 5ey 'codigo+ +,

create table libros ' codigo serial, titulo varc2ar'64+, autor varc2ar'34+, codigoeditorial smallint, primary 5ey'codigo+ +,

insert into editoriales'nombre+ values'7Planeta7+, insert into editoriales'nombre+ values'7$mece7+, insert into editoriales'nombre+ values'7Paidos7+, insert into editoriales'nombre+ values'7Siglo 88)7+,

insert into libros'titulo,autor,codigoeditorial+ values'7Uno7,7#ic2ard "ac27,(+, insert into libros'titulo,autor,codigoeditorial+ values'7)lusiones7,7#ic2ard "ac27,(+, insert into libros'titulo,autor,codigoeditorial+ values'7&prenda P9P7,7!ario !olina7,6+, insert into libros'titulo,autor,codigoeditorial+ values'7$l alep27,7"orges7,:+, insert into libros'titulo,autor,codigoeditorial+ values'7Puente al in-inito7,7#ic2ard "ac27,:+,

#ealizar una consulta ;ue obtenga el nombre de las editoriales ;ue 2an publicado libros del autor <#ic2ard "ac2<:

select nombre -rom editoriales =2ere codigo in 'select codigoeditorial -rom libros =2ere autor07#ic2ard "ac27+,

SU"C NSUL%&S

Una subconsulta 'sub;uery+ es una sentencia <select< anidada en otra sentencia <select<, <insert<, <update< o <delete< 'o en otra subconsulta+*

Las subconsultas se emplean cuando una consulta es muy comple1a, entonces se la divide en varios pasos lgicos y se obtiene el resultado con una >nica instruccin y cuando la consulta depende de los resultados de otra consulta*

Las subconsultas se D$"$N incluir entre par?ntesis* Puede 2aber subconsultas dentro de subconsultas*

Se pueden subconsultas:

emplear

@ $n lugar de una eApresin, siempre ;ue devuelvan un solo valor o una lista de valores*

@ Que retornen un con1unto de registros de varios campos en lugar de una tabla o para obtener el mismo resultado ;ue una combinacin '1oin+*

9ay tres tipos bBsicos de subconsultas: (* las ;ue retornan un solo valor escalar ;ue se utiliza con un operador de comparacin o en lugar de una eApresin*

:* las ;ue retornan una lista de valores, se combinan con <in<, o los operadores <any<, <some< y <all<* 3* los ;ue prueban la eAistencia con <eAists<*

$1ercicio: &gregar a la tabla libros el campo precio de tipo numeric '6,:+ y actualizar el precio de cada libro*

&L%$# %&"L$ libros &DD precio numeric 'C,:+, update libros set precio0(:4*:3 =2ere codigo0:,

$laborar una consulta ;ue me obtenga el precio de un libro y la di-erencia de este precio con el precio mBs alto*

select titulo,precio, precio@'select maA'precio+ -rom libros+ as DDi-erenciaE -rom libros =2ere titulo07Uno7,

#ealizar una consulta ;ue obtenga el tFtulo, autor y precio del libro mBs costoso:

select titulo,autor, precio -rom libros =2ere precio0 'select maA'precio+ -rom libros+,

Subconsultas de tipo in

Se vio ;ue una subconsulta puede reemplazar una eApresin* Dic2a subconsulta debe devolver un valor escalar o una lista de valores de un campo*

las subconsultas ;ue retornan una lista de valores reemplazan a una eApresin en una clBusula <=2ere< ;ue contiene la palabra clave <in<*

$l resultado de una subconsulta con <in< o '<not in<+ es una lista* Luego ;ue la subconsulta retorna resultados, la consulta eAterior los usa*

La sintaAis bBsica es la siguiente: ***=2ere $8P#$S) N in 'SU"C NSUL%&+,

Podemos buscar las editoriales ;ue no 2an publicado libros de <#ic2ard "ac2<:

select nombre -rom editoriales =2ere codigo not in 'select codigoeditorial -rom libros =2ere autor07#ic2ard "ac27+,

$1ercicio: Una empresa tiene registrados sus clientes en una tabla llamada <clientes<, tambi?n tiene una tabla <ciudades< donde registra los nombres de las ciudades*

(@ Cree la tabla <clientes< create table clientes ' codigo serial, nombre varc2ar'34+, domicilio varc2ar'34+, codigociudad smallint not null, primary 5ey'codigo+ +,

:*@Cree la tabla ciudades: create table ciudades' codigo serial, nombre varc2ar':4+, primary 5ey 'codigo+ +,

insert into ciudades 'nombre+ values'7Cordoba7+, insert into ciudades 'nombre+ values'7Cruz del $1e7+, insert into ciudades 'nombre+ values'7Carlos Paz7+, insert into ciudades 'nombre+ values'7La Galda7+, insert into ciudades 'nombre+ values'7Hilla !aria7+,

insert into clientes'nombre,domicilio,codigociudad+ values '7Lopez !arcos7,7Colon (((7,(+, insert into clientes'nombre,domicilio,codigociudad+ values '7Lopez 9ector7,7San !artin :::7,(+, insert into clientes'nombre,domicilio,codigociudad+ values '7Perez &na7,7San !artin 3337,:+, insert into clientes'nombre,domicilio,codigociudad+ values '7Iarcia Juan7,7#ivadavia 6667,3+,

insert into clientes'nombre,domicilio,codigociudad+ values '7Perez Luis7,7Sarmiento CCC7,3+, insert into clientes'nombre,domicilio,codigociudad+ values '7Iomez )nes7,7San !artin KKK7,6+, insert into clientes'nombre,domicilio,codigociudad+ values '7%orres Gabiola7,7&lem LLL7,C+, insert into clientes'nombre,domicilio,codigociudad+ values '7Iarcia Luis7,7Sucre MMM7,C+,

Necesitamos conocer los nombres de las ciudades de a;uellos clientes cuyo domicilio es en calle <San !artin<, empleando subconsulta*

select nombre -rom ciudades =2ere codigo in 'select codigociudad -rom clientes =2ere domicilio li5e 7San !artin N7+,

btenga los nombre de las ciudades de los clientes cuyo apellido no comienza con una letra especF-ica, empleando subconsulta*

C !")N&C) N$S 'J )NS+

Por medio del operador combinacin 'J )N+ podemos combinar dos relaciones o tablas segun una condicin para obtener tuplas compuestas por atributos de las dos relaciones combinadas*

$n el lengua1e SQL eAisten di-erentes maneras de combinar dos relaciones o tablas*

Combinaciones internas '# )NN$# J )N S+: Un )NN$# J )N entre dos relaciones # y S, es el resultado ;ue se obtiene despu?s de aplicar al producto cartesiano de las dos relaciones # y S, una condicin para acotar dic2o producto*

Un 1oin es una operacin ;ue relaciona dos o mBs tablas para obtener un resultado ;ue incluya datos 'campos y registros+ de ambas, las tablas participantes se combinan seg>n los campos comunes a ambas tablas*

La sintaAis bBsica es la siguiente: select C&!P S -rom %&"L&( inner 1oin %&"L&: on C ND)C) NdeC !")N&C) N,

$1emplos: select O -rom libros inner 1oin editoriales on codigoeditorial0editoriales*cod igo,

select O -rom libros inner 1oin editoriales on codigoeditorial0editoriales*cod igo =2ere editoriales*codigo0:,

&nalicemos la consulta anterior* @ especi-icamos los campos ;ue aparecerBn en el resultado en la lista de seleccin,

@ indicamos el nombre de la tabla


luego del <-rom< '<libros<+, @ combinamos esa tabla con <inner 1oin< y el nombre de la otra tabla '<editoriales<+, se especi-ica ;u? tablas se van a combinar y cmo,

@cuando se combina in-ormacin de varias tablas, es necesario especi-icar ;u? registro de una tabla se combinarB con ;u? registro de la otra tabla, con <on<*

Se debe especi-icar la condicin para enlazarlas, es decir, el campo por el cual se combinarBn, ;ue tienen en com>n*

<on< 2ace coincidir registros de ambas tablas basBndose en el valor de tal campo, en el e1emplo, el campo <codigoeditorial< de <libros< y el campo <codigo< de <editoriales< son los ;ue enlazarBn ambas tablas*

Se emplean campos comunes, ;ue deben tener tipos de datos iguales o similares*

La condicin de combinacin, es decir, el o los campos por los ;ue se van a combinar 'parte <on<+, se especi-ica seg>n las claves primarias y eAternas*

Si una de las tablas tiene clave primaria compuesta, al combinarla con la otra, en la clBusula <on< se debe 2acer re-erencia a la clave completa, es decir, la condicin re-erenciarB a todos los campos clave ;ue identi-ican al registro*

Se emplea este tipo de combinacin para encontrar registros de la primera tabla ;ue se correspondan con los registros de la otra, es decir, ;ue cumplan la condicin del <on<*

Si un valor de la primera tabla no se encuentra en la segunda tabla, el registro no aparece*

select l*codigo,titulo,autor,nombre -rom libros as l )nner 1oin editoriales as e on l*codigoeditorial0e*codigo,

Combinacin eAterna

Himos ;ue una combinacin interna 'inner 1oin+ encuentra registros de la primera tabla ;ue se correspondan con los registros de la segunda,

es decir, ;ue cumplan la condicin del <on< y si un valor de la primera tabla no se encuentra en la segunda tabla, el registro no aparece*

Si ;ueremos saber ;u? registros de una tabla N encuentran correspondencia en la otra, es decir, no eAiste valor coincidente en la segunda, necesitamos otro tipo de combinacin, <outer 1oin< 'combinacin eAterna+*

Las combinaciones eAternas combinan registros de dos tablas ;ue cumplen la condicin, mBs los registros de la segunda tabla ;ue no la cumplen,

es decir, muestran todos los registros de las tablas relacionadas, a>n cuando no 2aya valores coincidentes entre ellas*

9ay tres tipos de combinaciones eAternas: <le-t outer 1oin<, <rig2t outer 1oin< y <-ull outer 1oin<, se pueden abreviar con <le-t 1oin<, <rig2t 1oin< y <-ull 1oin< respectivamente*

Se emplea una combinacin eAterna iz;uierda para mostrar todos los registros de la tabla de la iz;uierda* Si no encuentra coincidencia con la tabla de la derec2a, el registro muestra los campos de la segunda tabla puestos a <null<*

select C&!P S -rom %&"L&)PQU)$#D& le-t 1oin %&"L&D$#$C9& on C ND)C) N,

select l*titulo,e*nombre -rom editoriales as e le-t 1oin libros as l on l*codigoeditorial 0 e*codigo,

$l resultado mostrarB el tFtulo y nombre de la editorial, las editoriales de las cuales no 2ay libros, es decir, cuyo cdigo de editorial no estB presente en <libros< aparece en el resultado, pero con el valor <null< en el campo <titulo<*

$s importante la posicin en ;ue se colocan las tablas en un <le-t 1oin<, la tabla de la iz;uierda es la ;ue se usa para localizar registros en la tabla de la derec2a*

%ambi?n podemos mostrar las editoriales ;ue N estBn presentes en <libros<, es decir, ;ue N encuentran coincidencia en la tabla de la derec2a:

select l*titulo,e*nombre -rom editoriales as e le-t 1oin libros as l on e*codigo0l*codigoeditorial =2ere l*codigoeditorial is null,

ROLE/

PostgreSQL mane1a los permisos de acceso a bases de datos usando el concepto de # L$S* Un # L puede ser pensado como si -uera un usuario o un grupo de base de datos, dependiendo de como se establezca el # L*

Los #oles pueden poseer ob1etos de base de datos 'por e1emplo tablas+ y puede asignar privilegios sobre esos ob1etos 2acia otros roles para controlar ;uien tiene acceso a dic2os ob1etos*

Los # L$S de base de datos son en concepto completamente separados de los usuarios del sistema operativo*

$n la practica podrFa se conveniente mantener una correspondencia, &un;ue esto no es obligatorio*

Los roles de base de datos son globales en todo el cluster de base de datos 'y no individuales para cada base de datos+*

Para crear un rol se usa el siguiente comando SQL C#$&%$ # L$ nombre,

Para eliminar un rol se usa el siguiente comando SQL: D# P # L$ nombre,

&tributos de un # L

Un rol de base de datos puede tener un n>mero de atributos ;ue de-ine sus privilegios e interactua con el sistema de autenticacin de usuarios*

Privilegio de L I)N Solo roles ;ue tienen el atributo L I)N pueden ser usados como el rol inicial para una coneAin a la base de datos*

Un rol con el atributo L I)N puede ser considerado como si -uera un usuario de base de datos* Para crear un role con el privilegio de login usar:

C#$&%$ # L$ nombre L I)N,

$status SUP$#US$# Un super usuario de base de datos sobrepasa todo el c2e;ueo de permisos, eAcepto el derec2o de loguearse o el derec2o de iniciar replicacin*

$ste es un privilegio peligroso y no debe usarse sin cuidado, es me1or 2acer la mayoria del traba1o con un rol ;ue no sea de super usuario*

Para crear un un nuevo superusuario de base de datos:


CREATE ROLE no&bre /U)ERU/ER5

$ste rol debe de 2acerse siendo ya un superusuario*

#ol de creacin de base de datos* & un rol se le deben de dar permisos eAplicitos para crear bases de datos'eAcepto para los superusers, por ;ue ellos tienen todos los permisos+*

Para crear un rol con permisos para crear bases de datos use: CREATE ROLE no&bre CREATE6B

& un rol se le deben dar permisos eAplicitos para crear mBs roles 'eAcepto para superusers+*

Para crear tal rol usar : CREATE ROLE no&bre CREATEROLE.

Un rol con el privilegio CREATEROLE puede cambiar o borrar otros roles asF como otorgar o ;uitar permisos sobre dic2os roles

Asignando contrase7a a un rol Una contraseQa se utilizarB solo si el m?todo de autenticacin de ?l cliente re;uiere ;ue el usuario ingrese una contraseQa para conectarse a la base de datos*

CREATE ROLE no&bre )A//8OR6 9contrase7a9.

+e&bresia de ROLE/

$s conveniente el agrupar usuarios para administrar de -orma -Bcil los privilegios, de esa -orma los privilegios pueden ser otorgados o revocados a todo el grupo como un todo*

$n PostgreSQL esto se 2ace creando un rol ;ue represente al grupo y otorgue la membresia en el rol del grupo y entonces otorgarles permiso en el rol del grupo a usuarios individuales*

Para crear un grupo como un rol primero se crea el rol: CREATE ROLE no&bre. %ipicamente un rol ;ue va a ser usado como un grupo no tendrFa el atributo L I)N*

Una vez ;ue el role eAista, se pueden agregar miembros o ;uitar miembros usando los comandos I#&N% y #$H R$ I#&N% rolSgrupo % rol(, *** , #$H R$ rolSgrupo G# ! rol(,** ,

0*/TA/

Una vista es una alternativa para mostrar datos de varias tablas* Una vista es como una tabla virtual ;ue almacena una consulta*

Los datos accesibles a trav?s de la vista no estBn almacenados en la base de datos como un ob1eto*

$ntonces, una vista almacena una consulta como un ob1eto para utilizarse posteriormente* Las tablas consultadas en una vista se llaman tablas base*

$n general, se puede dar un nombre a cual;uier consulta y almacenarla como una vista*

Una vista, en s, es una tabla virtual derivada, con nombre. El trmino virtual significa que la tabla no existe como tal, pero para el usuario si parece existir.

Las vistas tienen la misma estructura ;ue una tabla : -ilas y columnas* los datos se recuperan mediante una consulta S$L$C% y se presentarBn igual ;ue los de una tabla*

La sintaAis de de-inicin de una vista en SQL es: CREATE [OR REPLACE] VIEW nombre_de_vista AS sentenciaSS$L$C%

$1emplo sencillo : CREATE VIEW cliente_apellido AS SELECT * FROM clientes WHERE ap_paterno LIKE A%

$L)!)N&# H)S%&S* Si en alg>n caso, se necesita modi-icar una vista, deberB eliminarla primero y luego volverla a crear*

De -orma similar si tambi?n se necesita eliminar una vista de la base de datos, la sentencia es la siguiente : DROP VIEW <nombre_de_la_vista>

#$IL&S

$l sistema de reglas de )ostgre/:L permite de-inir una accin alternativa cuando se e1ecutan inserciones, actualizaciones o borrados en las tablas de la base de datos

$s decir, una regla va a proveer comandos adicionales ;ue serBn e1ecutados cuando se e1ecute una accin en una tabla determinada*

Como alternativa una regla tipo *N/TEA6 reemplazarB el comando dado por otro o 2arB ;ue el comando dado no se e1ecute del todo

Las reglas se suelen implementar en las vistas tambi?n*

9ay ;ue tomar en cuenta ;ue la regla es un mecanismo de trans-ormacin o un comando macro*

La tran-ormacin pasa antes de la e1ecucin del comando dado

Se puede crear la ilusin de una D0ista Acuali;ableE de-iniendo reglas para insercin, borrado y actualizacin

Por e1emplo reemplazando la accin U)6ATE en la vista, por un U)6ATE en la tabla o tablas ;ue involucra la vista*

Siempre 2ay ;ue tomar en cuenta ;ue cuando se actualiza una vista, debemos utilizar una regla tipo *N/TEA6 incondicional

Parametros: No&bre: $s el nombre de la regla a crear debe de ser distinto a cual;uier nombre de otra regla o de la tabla*

E!ento: $l evento serB un S$L$C%, UPD&%$, )NS$#% o D$L$%$*

Tabla: $l nombre de la tabla o vista a la cual se va a aplicar la regla*

Condici<n: Cual;uier eApresin /:L* La condicin no puede 2acer re-erencia a ning>n otra tabla, solo N$T y LD y no puede tener -unciones agregadas*

*N/TEA6: $l *N/TEA6 indica los comandos ;ue serBn e1ecutados en lugar del comando original

AL/O: )ndica ;ue los comandos serBn e1ecutados ademas del comando original

Co&ando: $l comando o comandos ;ue se 2aran con la regla, los comandos validos son /ELECT U)6ATE *N/ERT , 6ELETE5

Se debe ser el propietario de la tabla para poder crear o cambiar una regla asociada a dic2a tabla*

CREATE = OR RE)LACE > RULE nombre A/ ON evento TO tabla U 8?ERE condicin V 6O = AL/O @ *N/TEA6 > A NOT?*N2 W comando W ' comando , comando *** + X

$1ercicio: Crear la tabla clientes, con un clienteSid de tipo serial y un nombre de tipo varc2ar de K4, teniendo como llave primaria clienteSid

)nsertar 3 clientes en la tabla clientes: &rmando Iuerra, $lmer 9omero, &;uiles "rinco*

Crear la tabla lineas teniendo como llave primaria lineaSid de tipo serial, cliente Sid de tipo entero 'llave -oranea con clientes+ y un numero ;ue serB varc2ar de 64*

)nsertar en la la tabla lineas: : n>meros para el cliente (, ( para el cliente : y ( para el cliente 3*

Crear una vista ;ue retorne toda la in-ormacin de las lFneas de los clientes*

CREATE 0*E8 clientesSlineas A/ /ELECT c*clienteSid,l*lineaSid, c*nombre, l*numero BRO+ clientes c *NNER CO*N lineas l ON c*clienteSid0l*clienteSid ,

Se necesita crear una #$IL& ;ue prote1a los datos de la tabla clientes en caso de actualizacin o borrado

CREATE RULE proteccionSclientesSupdate A/ ON U)6ATE TO clientes 8?ERE old*clienteSid Y 3 6O *N/TEA6 not2ing,

U)6ATE clientes /ET nombre07P$%$#7 8?ERE clienteSid0(,

CREATE RULE proteccionSclientesSdelete A/ ON 6ELETE TO clientes =2ere old*clienteSid Y 6 6O *N/TEA6 not2ing,

6ELETE BRO+ clientes 8?ERE clienteSid03

Las #eglas de )nsercin: sobre la vista cuando se trata de insertar un cliente Nuevo

CREATE RULE insSclientesSlineasSnuevo A/ ON *N/ERT TO clientesSlineas 8?ERE N$T*clienteSid )S NULL 6O *N/TEA6 ( *N/ERT *NTO clientes (nombre% 0ALUE/ (N$T*nombre% , *N/ERT *NTO lineas (clienteSid, numero% 0ALUE/ (currval(7clientesSclienteSidSse;7%, N$T*numero% %,

Las #eglas de )nsercin: Cliente $Aistente

CREATE RULE insSclienteSlineaSeAistente A/ ON *N/ERT TO clientesSlineas 8?ERE N$T*clienteSid */ NOT NULL 6O *N/TEA6 *N/ERT *NTO lineas (clienteSid, numero% 0ALUE/ (N$T*clienteSid, N$T*numero%,

Las #eglas de )nsercin: )ncondicional

CREATE RULE insSclienteSlineaSnot2ing A/ ON *N/ERT TO clientesSlineas 6O *N/TEA6 NOT?*N2,

*N/ERT *NTO clientesSlineas (nombre, numero% 0ALUE/ (7Daniela Donoso7 7:36@6CKL7%,

*N/ERT *NTO clientesSlineas (clienteSid, numero% 0ALUE/ (3, Z[ML@(:33Z%,

Las #eglas de &ctualizacin

CREATE RULE updSclientesSlineasScliente A/ ON U)6ATE TO clientesSlineas 8?ERE N$T*clienteSid */ NOT NULL 6O *N/TEA6 U)6ATE clientes /ET nombre 0 N$T*nombre 8?ERE clienteSid 0 N$T*clienteSid,

CREATE RULE updSclientesSlineasSlinea A/ ON U)6ATE TO clientesSlineas 8?ERE N$T*lineaSid */ NOT NULL 6O *N/TEA6 U)6ATE lineas /ET numero 0 N$T*numero 8?ERE lineaSid 0 N$T*lineaSid,

CREATE RULE updSclientesSlineasSnot2ing A/ ON U)6ATE TO clientesSlineas 6O *N/TEA6 NOT?*N2.

U)6ATE clientesSlineas /ET nombre 0 7Carmen Campora7 8?ERE clienteSid 0 3,

U)6ATE clientesSlineas /ET numero 0 7(@M44@MMMM7 8?ERE lineaSid 0 6,

#eglas de "orrado* "orrar una linea o varias de un cliente

CREATE RULE delSclientesSlineas A/ ON 6ELETE TO clientesSlineas =2ere old*clienteSid */ NOT NULL and old*lineaSid */ NOT NULL 6O *N/TEA6 6ELETE BRO+ lineas 8?ERE lineaSid0old*lineaSid AN6 clienteSid0old*clienteSid,

Gunciones SQL

)ostgre/:L nos brinda un conjunto de Dunciones para el &anejo de Dec"as string nE&eros etc5 pero ade&Fs nos per&ite crear Dunciones propias5

La creaci<n de una Dunci<n es &u' Etil cuando quere&os reutili;ar un algorit&o5 )ode&os crear una Dunci<n ' luego lla&arla en diDerentes situaciones5

create or replace Dunction Unombre de la -uncinV 'UparBmetrosV+ returns Utipo de dato ;ue retornaV as Ude-inicin de la -uncinV language Ulengua1e utilizadoV

&ntes de crear nuestras -unciones 2ay ;ue crear el lengua1e en el ;ue las vamos a programar: C#$&%$ L&NIU&I$ plpgs;l,

Co&o pri&er proble&a i&ple&entare&os una Dunci<n que reciba dos enteros ' retorne la su&a de los &is&osG

create or replace Dunction sumar'integer,integer+ returns integer A/ 7select \(]\:,7 language s;l,

Cada parBmetro se lo accede luego mediante la posicin ;ue ocupa y se le antecede el caracter \*

$l o los comandos SQL deben ir entre comillas simples al -inal del comando pondremos , Luego indicamos al -inal ;ue se trata de una -uncin SQL*

Para llamar luego a esta -uncin lo 2acemos por e1emplo en un select: select su&ar(H I%.

create or replace Dunction retornarclave'varc2ar+ returns integer as 7select clienteSid Dro& clientes J"ere nombre0\(,7 language sql,

Cree la tabla con la siguiente estructura: create table medicamentos' codigo serial, nombre varc2ar':4+, laboratorio varc2ar':4+, precio decimal'C,:+, cantidad smallint, primary 5ey'codigo+ +,

'7Sertal7,7#oc2e7,C*:,(44+, '7"uscapina7,7#oc2e7,6*(4,:44+, '7&moAidal7,7"ayer7,(C*K4,(44+, '7Paracetamol7,7"ago7,(*[4,:44+, '7&spirina7,7"ayer7,:*(4,(C4+, '7&moAidal 1arabe7,7"ayer7,C*(4,:C4+,

)mplementar una -uncin ;ue retorne el precio promedio de la tabla medicamentos* )mprimir el precio promedio de los medicamentos* )mprimir los medicamentos ;ue tienen un precio mayor al promedio*

create or replace Dunction preciopromedio'+ returns decimal as 7select a!g'precio+ Dro& medicamentos,7 language sql.

select preciopromedio'+, select O -rom medicamentos =2ere precio^preciopromedio'+,

Gunciones ;ue no retornan valor

Cuando ;ueremos crear una -uncin ;ue no retorne dato lo debemos indicar luego de la palabra clave returns disponiendo el valor !oid:

create or replace Dunction cargarusuarios'+ returns !oid as \\ insert into clientes 'nombre+ !alues '7!arcelo7+, insert into clientes 'nombre+ !alues '7JuanPerez7+, insert into clientes 'nombre+ !alues '7Susana7+, insert into clientes 'nombre+ !alues '7Luis7+, \\ language sql.

)mplementar una -uncin ;ue reciba el cdigo de un medicamento y proceda a borrarlo* La -uncin no retorna dato*

create or replace Dunction borrarmedicamento'integer+ returns !oid as 7delete Dro& medicamentos J"ere codigo0\(,7 language sql.

select borrarmedicamento'(+, select O -rom medicamentos,

9emos visto ;ue una -uncin puede no retornar dato, retornar un dato simple 'integer, varc2ar etc*+ &2ora veremos como retornar toda una -ila de una tabla*

create or replace Dunction retornarlibro'int+ returns libros as 7select O Dro& libros J"ere codigo0\( ,7 language sql.

select retornarlibro'6+, '3,<&licia en el pais de las maravillas<,<Le=is Carroll<,$mece,([*[C+

)mplementar una -uncin ;ue retorne el registro completo del medicamento mBs caro*

create or replace Dunction medicamentomascaro'+ returns medicamentos as 7select O Dro& medicamentos J"ere precio0'select maA'precio+ Dro& medicamentos+,7 language sql.

EL LEN2UACE 6E BUNC*ONE/ )LKpg/:L

Una de las caracterFsticas de PostgreSQL en ;ue aventa1a a la base de datos mySQL es ;ue permite al usuario o administrador de la base de datos escribir sus propias -unciones dentro de la base de datos*

$stas -unciones se almacenan y e1ecutan desde el proceso de base de datos y no desde la aplicacin del cliente*

)ostgre/:L permite en este sentido crear sus -unciones de usuario o com>nmente llamadas <P# C$D)!)$N% S &L!&C$N&D S<

No solo en lengua1e SQL ;ue es un lengua1e ;ue carece de estructuras de control como )G, T9)L$, G # y otros, sino ;ue permite de-inir un lengua1e propio y eAtenderlo a la base de datos*

$s asF como estBn disponibles para PostgreSQL los siguientes lengua1es : C, Perl, P2yton, P9P entre otros* $stos lengua1es deben ser instalados en la base de datos previamente antes de ser utilizados*

Sin embargo, tambien eAiste un lengua1e propio de )ostgre/:L, denominado <)LKpgsql<*

Que posee estructuras de control y permite aprovec2ar toda la potencia de SQL para crear nuestras propias -unciones, es este lengua1e de -unciones en el ;ue concentraremos este manual*

$structura de PL_pgSQL

El lenguaje )LKpg/:L es estructura en bloques5 Todas las palabras cla!e ' los identiDicadores pueden escribirse &e;clando letras &a'Esculas ' &inEsculas5

Un bloque se deDine de la siguiente &aneraG = LLlabelMM > = 6ECLARE 6eclarations > BE2*N state&ents EN6 = label >.

)ueden e(istir !arios bloques o subNbloques en la secci<On de sentencias de un bloque5

Los subNbloques pueden ser usados para ocultar las !ariables a los bloques &Fs e(ternos5

Nor&al&ente una de las sentencias es el !alor de retorno usando la palabra cla!e RETURN5

Las !ariables declaradas en la secci<n que antecede a un bloque se iniciali;an a su !alor por o&isi<n cada !e; que se entra al bloque

No sola&ente al ser lla&ada la Dunci<n5 )or eje&ploG

CREATE BUNCT*ON estaDunc(% RETURN/ *NTE2ER A/ PP 6ECLARE cantidad *NTE2ER GQ H4. BE2*N RA*/E NOT*CE 1Cantidad contiene aquR S1 cantidad. NN Cantidad contiene aquR H4 cantidad GQ $4.

NN Crea&os un subNbloque 6ECLARE cantidad *NTE2ER GQ T4. BE2*N RA*/E NOT*CE 1Cantidad contiene aquR S1 cantidad. NN Cantidad contiene aquR T4 EN6.

RA*/E NOT*CE 1Cantidad contiene aquR S1 cantidad. NN Cantidad contiene aquR $4 RETURN cantidad. EN6. PP LAN2UA2E 1plpgsql1.

Co&entarios constantes ' !ariables

$Aisten dos tipo de comentarios en PL_pgSQL* Un doble guin @@ da inicio a un comentario, el cual se eAtiende 2asta el -inal de la lFnea*

Un _O inicia un blo;ue ;ue se eAtiende 2asta la primera ocurrencia de O_*

0ariables ' constantes

Todas las !ariables Dilas ' registros usados en un bloque o en sus subN bloques deben declararse en la secci<n de declaraciones del bloque5

Las !ariables en )LKpg/:L pueden ser de cualquier tipo de datos de /:L co&o *NTE2ER 0ARC?AR ' C?AR5

A continuaci<n se &uestran algunos eje&plos de declaraci<n de !ariablesG


user_id integer. quantit' nu&eric($%. url !arc"ar. +'roJ tablena&eSRO8T,)E. aroJ RECOR6.

La declaraciones tienen las siguiente sinta(isG no&bre = CON/TANT > tipo = NOT NULL > = A 6EBAULT @ GQ U !alor >,

El !alor de una !ariable declarado co&o CON/TANT no puede ser &odiDicado5

cantidad 6EBAULT H#. url !arc"ar GQ 1"ttpGKK&'site5co&1. user_id CON/TANT integer GQ 34.

0ariables pasadas a las Dunciones (para&etros%

Las !ariables (para&etros% que se pasan a las Dunciones son deno&inadas con los identiDicadores P3 P# etc5 (el &F(i&o es 3V%5

Opcional&ente se pueden establecer alias para las !ariables que recibe la Dunci<n "aciendolas &Fs leibles5

no&bre AL*A/ BOR Pn. Los alias se pueden establecer para cualquier !ariable dentro de la Dunci<n5

CREATE BUNCT*ON i!a_!enta(REAL% RETURN/ REAL A/ PP 6ECLARE subtotal AL*A/ BOR P3. BE2*N return subtotal W 353$. EN6. PP LAN2UA2E 1plpgsql1.

$s posible agregar parametros de salida a una -uncin

Cuando una Dunci<n es declarada con para&etros de salida puede ser proporcionado con un alias igual que los para&etros de entrada5

Un para&etro de salida es una !ariable que inicia su !alor con NULL ' durante la ejecuci<n de la Dunci<n se le asigna su !alor correspondiente5

CREATE BUNCT*ON i!a_!enta#(subtotal real OUT total real% A/ PP BE2*N totalGQsubtotal W 353$. EN6. PP LAN2UA2E 1plpgsql1.

CREATE BUNCT*ON su&_'_&ul(( int ' int OUT su& int OUT &ul int% A/ PP BE2*N su& GQ ( + '. &ul GQ ( W '. EN6. PP LAN2UA2E plpgsql.

Atributos

Usando los atributos ST,)E and SRO8T,)E es posible declarar !ariables con el &is&o tipo de dato o estructura de otro ite& de la base de datos (por eje&plo un ca&po de una tabla%5

ST,)E )roporciona el tipo de dato de una !ariable o una colu&na5 /e puede utili;ar para declarar !ariables que al&acenen !alores de bases de datos5

)or eje&plo suponga&os que tene&os una colu&na lla&ada cliente_id en la tabla clientes5

)ara declarar una !ariable con el &is&o tipo de dato que el usado en nuestra tabla de clientes escribiria&osG
clienteSid clientes*clienteSidN%`P$,

Al usar ST,)E puede despreocuparse de los ca&bios Duturos en la deDinici<n de la tabla5

No&bre tablaSRO8T,)E 6eclara una rengl<n con la estructura de la tabla especiDicada5 tabla puede ser una tabla o una !ista que e(ista en la base de datos5

Los ca&pos del rengl<n se accesan con la notaci<n punto5 Los parF&etros de una Dunci<n pueden ser de tipo co&puesto (renglones co&pletos de una tabla%5

Es este caso el identiDicador correspondiente Pn serF del tipo roJt'pe pero debe usarse un seud<ni&o o alias usando el co&ando AL*A/

6ECLARE renglon clientesSRO8T,)E.

/entencias

Asignaci<n Una asignaci<n de un !alor a una !ariable o ca&po de Dila o de registro se escribeG identiDier GQ e(pression.

/i el tipo de dato resultante de la e(presi<n no coincide con el tipo de dato de las !ariables o la !ariable tienen un ta&a7o o precisi<n conocido (co&o c"ar(#X%%

El resultado serF a&oldado i&plicita&ente por el interprete de )LKpg/:L usando los tipos de las !ariables para las Dunciones de entrada ' los tipos resultantes en las Dunciones de salida5

i&puesto GQ subtotal W 453$. &i_registro5user_id GQ #4.

Una asignaci<n de una selecci<n co&pleta en un registro o Dila puede "acerse del siguiente &odoG /ELECT e(pressions *NTO target BRO+ 555.

target puede ser un registro una !ariable de Dila o una lista separada por co&as de !ariables ' ca&po de registros o Dilas5

/i una Dila o una lista de !ariables se usa co&o objeti!o los !alores seleccionados "an de coincidir e(acta&ente con la estructura de los objeti!os o se producirF un error de ejecuci<n5

E(iste una !ariable especial lla&ada BOUN6 de tipo booleano que puede usarse in&ediata&ente despuYs de /ELECT *NTO para co&probar si una asignaci<n "a tenido Y(ito5

/ELECT W *NTO &'rec BRO+ clientes 8?ERE no&bre Q &ino&bre. *B NOT BOUN6 T?EN RA*/E EZCE)T*ON 1cliente S no encontrado1 &ino&bre. EN6 *B.

Abortando la ejecuci<n ' &ensajes

Use la sentencia RA*/E para en!iar &ensajes al &ecanis&o de bitacora de )ostgre/:L5 RA*/E le!el identiDier =555>>. 9Dor&at9 =

RA*/E NOT*CE 1Cantidad contiene aquR S1 cantidad.

RA*/E EZCE)T*ON 1cliente S no encontrado1 &ino&bre. EN6 *B.

Estructuras de control

Condiciones *B e(presion T?EN sentencias =EL/E sentencias> EN6 *B.

*B e(presi<n boolean T?EN sentencias = EL/E*B e(presi<n boolean T?EN sentencias = EL/E*B e(presi<n boolean T?EN sentencias 555>> = EL/E state&ents > EN6 *B.

Reali;ar una Dunci<n con el lenguaje plKpgsql que reciba co&o para&etro un nE&ero ' con el uso de estructuras de control dY co&o resultado si el nE&ero es cero positi!o o negati!o

CREATE OR RE)LACE BUNCT*ON eje&plo*B(nu&ero integer% RETURN/ !arc"ar A/ PP 6ECLARE tipo !arc"ar. BE2*N *B nu&ero Q 4 T?EN tipoGQ1cero1.

EL/E*B nu&eroM4 T?EN tipoGQ1positi!o1. EL/E*B nu&ero L 4 T?EN tipoGQ1Negati!o1. EL/E tipoGQ1NULL1. EN6 *B. RETURN tipo. EN6. PP LAN2UA2E plpgsql.

Case si&ple

CA/E e(presi<n 8?EN e(presi<n = e(presi<n = 555 >> T?EN sentencias = 8?EN e(presi<n = e(presi<n = 555 >> T?EN sentencias 555 > = EL/E sentencias > EN6 CA/E.

La e(presi<n es e!aluada una !e; ' sucesi!a&ente co&parada con cada e(presi<n en la clausula 8?EN si "a' concordancia entonces las sentencias correspondientes son ejecutadas5

Entonces el control pasa a la siguiente sentencia despues del EN6 CA/E. (todos los T?EN siguientes no son e!aluados%

/i no se encuentran correspondencias las sentencias asignadas al EL/E son ejecutadas5

CA/E ( 8?EN 3 # T?EN &sg GQ 1Uno o 6os1 EL/E &sg GQ 1Otro !alor diDerente a uno o dos1. EN6 CA/E.

Ciclos

LOO) =LLEtiquetaMM> LOO) sentencias EN6 LOO).

/e trata de un bucle no condicional que "a de ser ter&inado de Dor&a e(plicita &ediante una sentencia EZ*T5

La etiqueta opcional puede ser usada por las sentencias EZ*T de otros ciclos anidados para especiDicar el ni!el del ciclo que "a de ter&inarse5

EZ*T = Etiqueta > = 8?EN E(presi<n boolean >.

LOO) NN Algunos Calculos *B contador M 4 T?EN EZ*T. NN sale del loop EN6 *B. EN6 LOO).

C*CLO LOO) NN Algunos Calculos EZ*T 8?EN contador M 4. NN &is&o resultado anterior EN6 LOO).

LLbloque(MM BE2*N NN Algunos calculos *B stoc[s M 344444 T?EN EZ*T bloque(. NN /ale Begin EN6 *B. NN +Fs Calculos que seran brincados Cuando stoc[s M 344444 EN6.

C*CLO 8?*LE =LLEtiquetaMM> 8?*LE e(presi<n LOO) /entencias EN6 LOO).

El Ciclo 8?*LE repite una secuencia de sententencias "asta que la e(presi<n sea e!aluada ' sea !erdadera5 La e(presi<n se c"eca cada !e; que se entra al cuerpo del ciclo5

C*CLO BOR =LLEtiquetaMM> BOR !ariable *N = RE0ER/E > e(presi<n 55 e(presi<n LOO) sentencias EN6 LOO).

/e trata de un bucle que se itera sobre un rango de !alores enteros5 La !ariable se crea auto&Ftica&ente con el tipo entero ' e(iste solo dentro del ciclo5

Las dos e(presiones dan el li&ite inDerior ' superior del rango ' son e!aluados s<lo cuando se entra en el ciclo5 El paso de la iteraci<n es sie&pre 35

BOR i *N 35534 LOO) NN To&arF los !alores de 3 a 34 en el ciclo EN6 LOO).

BOR i *N RE0ER/E 34553 LOO) NN To&arF los !alores de 34 a 3 en el ciclo EN6 LOO).

?acer una Dunci<n en plKpgsql que reciba I para&etros H nE&eros ' una operaci<n5 ' te de el resultado de la Operaci<n especiDicada(/u&a +ultiplicaci<n )ro&edio%

+anejando Registros

RECOR6 es un tipo de dato que al&acena un registro co&pleto de una tabla de base de datos a tra!Ys de un select

RECOR6 roJt'pe la es que estructura RECOR6

es si&ilar a unica diDerencia no "a' una deDinida para

RECOR6 se puede usar en sentencias ' ciclos BOR

)ara declarar un record se sigue la siguiente sinta(is no&bre RECOR6.

Una asignaci<n se puede dar de la siguiente Dor&aG /ELECT *NTO target e(presiones BRO+ 555.

Los posibles !alores para TAR2ET sonG Un registro Una !ariable rengl<n Una lista de !alores separados por co&as

CREATE BUNCT*ON no&bre_cliente(cliente integer% RETURN/ te(t A/ PP 6ECLARE reg_cliente RECOR6. no&bre_co&pleto TEZT. NNse declaran una !ariable de tipo registro ' una !ariable de tipo te(to

BE2*N /ELECT *NTO reg_cliente W BRO+ clientes 8?ERE cliente_id Q cliente. \ /e busca al cliente # ' se asigna el resultado a la !ariable tipo RECOR6(reg_cliente%

no&bre_co&pleto GQ reg_cliente5no&bre @@1 1@@ reg_cliente5apellidos. NN/e asigna el !alor del no&bre concatenado con los apellidos del cliente

return no&bre_co&pleto. EN6. PP LAN2UA2E plpgsql.

?a' otra Dor&a de c"ecar los resultados de un select into utili;ando la condici<n NULL5

Con un *B pode&os saber si un ca&po es NULL o NOT NULL si "a' &Fs de un registro NULL solo se &ostrarF el pri&ero los de&as se eli&inan5

*teraciones a tra!Ys de registros

E(iste una sinta(is especial del ciclo Dor para iterar entre resultados de una sentencia select ' darnos la Dacilidad de &anipular los datos

La sinta(is esG BOR RECOR6 @ roJ *N sentencia select LOO) sentencias. EN6 LOO).

Cuando se ejecuta el ciclo Dor las sentencias en el cuerpo del ciclo son ejecutadas para cada registro o renglon en resultado de la sentencia select

Reali;ar una Dunci<n que de la tabla de &edica&entos su&e todas las e(istencias ' regrese la su&a total utili;ando un ciclo Dor

Reali;ar una Dunci<n que actuali;e el precio de un &edica&ento deter&inado de la tabla de &edica&entos incre&entandolo o decre&entandolo segEn un porcentaje deter&inado

)LKpg/:L ' Triggers

Las Dunciones pueden ser deDinidas para que de Dor&a auto&Ftica se ejecuten cuando una acci<n tal co&o U)6ATE 6ELETE *N/ERT ocurre5

Esto se lle!a a cabo con un Trigger < disparador

El Trigger in!oca a una Dunci<n cuando la operaci<n U)6ATE 6ELETE *N/ERT ocurre en la tabla especiDicada5

Los Triggers pueden ser deDinidos con el co&ando CREATE BUNCT*ON

6eben ser declarados sin argu&entos ' con retorno O)A:UE5

O)A:UE es un tipo de dato que es usado solo por Dunciones internas que lla&an a otras Dunciones5

Las Dunciones deDinidas con el tipo de retorno O)A:UE no pueden ser usadas en consultas /:L por que el tipo O)A:UE no e(iste en /:L

La sinta(is para crear un Trigger esG CREATE TR*22ER No&bre_trigger ABEBORE@ABTERU tipo_e!ento

ON no&bre_tabla BOR EAC? ARO8@ /TATE+ENTU EZECUTE )ROCE6URE no&bre_Duncion (para&etros%

El orden i&portaG /i pri&ero se crea un Trigger ' despues se crea la Dunci<n que el Trigger lla&a el Trigger no se ejecutarF de Dor&a correcta5

/e debe crear pri&ero la Dunci<n ' despues el Trigger que usarF esa Dunci<n

0ariables especiales en )LKpg/:L Cuando una Dunci<n escrita en )LKpg/:L es lla&ada por un Trigger tene&os ciertas !ariables especiales disponibles en dic"a Dunci<n5 Estas !ariables son las siguientesG

NE8 Tipo de dato RECOR6. 0ariable que contiene la nue!a Dila de la tabla para las operaciones *N/ERTKU)6ATE en Triggers del tipo roJNle!el5 Esta !ariable es NULL en Triggers del tipo state&entNle!el5

OL6 Tipo de dato RECOR6. 0ariable que contiene la antigua Dila de la tabla para las operaciones U)6ATEK6ELETE en Triggers del tipo roJNle!el5 Esta !ariable es NULL en Triggers del tipo state&entNle!el5

T2_NA+E Tipo de dato na&e. !ariable que contiene el no&bre del Trigger que estF usando la Dunci<n actual&ente5

T2_8?EN Tipo de dato te(t. una cadena de te(to con el !alor BEBORE o ABTER dependiendo de co&o el Trigger que estF usando la Dunci<n actual&ente "a sido deDinido5

T2_O) Tipo de dato te(t. una cadena de te(to con el !alor *N/ERT U)6ATE o 6ELETE dependiendo de la operaci<n que "a acti!ado el Trigger que estF usando la Dunci<n actual&ente5

Crear la tablaG create table autores(id_autor integer no&bre !arc"ar%.

Otro eje&plo de un Trigger es guardar una bitacora de ca&bios sobre una tabla

Reali;ar un trigger que proteja la tabla &edica&entos de ser borrada5

En resu&enG Un Trigger se puede deDinir de las siguientes &anerasG

] )ara que ocurra ANTE/ de cualquier *N/ERT U)6ATE < 6ELETE ] )ara que ocurra 6E/)UE/ de cualquier *N/ERT U)6ATE < 6ELETE

] )ara que se ejecute una sola !e; por co&ando /:L (state&entNle!el trigger% ] )ara que se ejecute por cada linea aDectada por un co&ando /:L (roJNle!el trigger%

Creaci<n de un Trigger de tipo state&entNLe!elG

EjercicioG Crear la tabla !entas_&edica&entos ConG id_usuario integer codigo integer cantidad integer

Crear un trigger que cuando se inserte en la tabla !entas_&edica&entos decre&ente las e(istencias de dic"o &edica&ento en la tabla &edica&entos5

/i el &edica&ento no tiene e(istencias suDicientes que la operaci<n no se realice si la operaci<n es !Flida que &ande a pantalla la e(istencia del &edica&ento despues de la !enta5

También podría gustarte