70
PostgreSQL Capacitación Nivel 1 Día 4

PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Embed Size (px)

Citation preview

Page 1: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

PostgreSQLCapacitación Nivel 1

Día 4

Page 2: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Agenda• Funciones de Date/time.• Recomendaciones para el manejo del servidor.• Configuración• Parámetros avanzados• GEQO• Tipos de identificación de objetos y columnas de sistema.• Tipos de datos propios.• Introducción a los lenguajes procedurales.

– Tipos.– Variedad.– Finalidad.

• Expresiones regulares.

Page 3: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Fechas

Page 4: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Extracción y Casteo

Page 5: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Más sobre fechas

Page 6: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Más sobre fechas

Page 7: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION
Page 8: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Configuración

Page 9: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Configuración• SHARED_BUFFERS

– El que más afecta el rendimiento.– Comenzar a partir del 10% de memoria.– Se peude setear en MB, KB (24MB, 24576KB).– Tener en cuenta el /proc/sys/kernel/shmax (Linux)

# sysctl -w kernel.shmmax=112009216 ó modificar a mano shmmax y shmall

• WORK_MEM– Memoria utilizada para trabajo del servidor.– Aumentar en caso de tener muchas consultas

complejas.– Para empezar el 4% de la memoria total.

Page 10: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Configuración• MAX_CONNECTIONS• LOGGING (Varios parametros)• effective_cache_size (una de las más

importantes debe tener un buen espacio en memoria para serv. Dedicados)

• wal_sync_method wal_buffers (cantidad, método y tamaño de los buffers).

• Autovacuum

Page 11: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Configuración F[ree] S[pace] M[ap]

• max_fsm_pages, max_fsm_pages– Gracias al Visibility Map, en 8.4 ya no es necesario

setear estas variables.– En versiones menores a 8.3, se debe setear en un valor

determinado a la base más grande del cluster.» El Vacuum nos dirá a través de un HINT que

debemos aumentar por encima de un determinado número.

Page 12: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Parámtetros avanzados

Page 13: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Opciones avanzadas• default_statistics_target (valores por defecto de la

recolección de estadísticas, con expeción de aquellas establecidas con ALTER TABLE SET STATISTICS)

• from_collapse_limit , join_collapse_limit (establece si el optimizador debe fusionar subconsultas en las consultas si los items del FROM o el JOIN -según corresponda- están por debajo del valor dado)

• constraint_exclusion (establece si el optimizador debe utilizar las restricciones para la optimización.

• effective_cache_size (tamaño efectivo del caché de disco disponible para rastreo de índice. Aumentarlo, aumenta la probabilidad de rastreo por índice).

Page 14: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Opc. durante la compilación

• block_size (por defecto 8192)» Indica el tamaño del bloque de datos.

• integer_datetime» Soporte o no de 64 bits.

• lc_collate, lc_ctype» Forma de hacer la ordenación y clasificaciones de texto.

• server_encoding» Encoding del servidor

Page 15: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Parametros de almacenamiento

• Fillfactor(integer)– Porcentaje entre 10 y 100 (empaquetamiento completo). – A menor valor, las operaciones de inserción empaquetarán la

tabla solo en el porcentaje especificado. – El espacio remanente será reservado para los UPDATE de

las filas de esa página.• Esto le da la chance a los UPDATE de almacenar la copia de la fila en

el mismo espacio que el original, lo que es mejor que almacenarla en otro lugar.

– Para tablas con poco o casi nada de UPDATES, 100% es el mejor valor. Casos contrarios, disminuirlo.

Page 16: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Parametros de almacenamiento (2)

• autovacuum_enabled(boolean) (deshabilita o habilita el autovacuum en una tabla particular)

• autovacuum_vacuum_threshold(int) (numero de inserciones o actualizaciones para disparar el autovacuum)

Page 17: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

TOAST (The Oversized Attributte Storage Technique)

• Se reconocen 4 tipos de estrategias para el almacenamiento de columnas TOASTables

• PLAIN previene la compresión o el almacenamiento fuera de linea. Deshabilita el uso de encabezados de un solo byte para los tipos varlena. Es la única posible estrategia para los tipos no toast-ables (Tipos Fijos : int, char, real).

• EXTENDED permite compresión y almacenamiento fuera de linea. Es el por defecto de la mayoría de los tipos de datos toastables. La compresión ocurrirá primero, si la fila sigue siendo grande: out-of-line.

• EXTERNAL permite el alamcenamiento fuera de linea pero no la compresión. Hará las operaciones con caracteres y expresiones más rápidas en textos y byteas largos ( pero consumiendo mayor espacio) debido a que esas operaciones están optimizadas para avanzar sobre solamente las partes requeridas del valor de fuera de linea cuando no están comprimidas.

• MAIN permite la compresión per no el almacenamiento fuera de linea (Actualmente, el almacenamiento fuera de linea será mejorado para este tipod e columnas, pero solo como último recurso, cuando no hay otro camino para hacer que la fila sea más pequeña).

TiposVariables:VarcharText, Bytea,etc.

Page 18: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

GEQO Genetic Query Optimizer

• Elimina aquellos planes de ejecución que posiblemente sean caros.

• geqo_thresold (items del FROM a partir del cual se debe utilizar geqo). Se podría recomendar bajar.

• Geqo (activa o desactiva)

Page 19: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Gestión de Recursos del Kernel

• max_locks_per_transaction» 220 bytes c/u

• max_connections» 400 bytes ~c/u + 220*max_locks_per_transactions

• max_prepared_transactions» 600 bytes ~ c/u +220*max_locks_per_transactions

• shared_buffers» Cada buffer es de 8kb (se recomiendan valores

superiores a 5000)

• wal_buffers» 8kb c/u (puede recomendarse un valor superior a los

5000)

Page 20: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Getión de Recursos del Kernel (2)

• max_fsm_relations» 70 bytes c/u

• max_fsm_pages» c/u 6 bytes (max_fsm_relations*16)

Page 21: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Parametros del kernelParámetros Descripción Valores Razonables

SHMMAX Maximo del segmento de mem compartida

32MB es por defecto. Se aconsejan 200 MB mínimo.

SHMMIN Mínimo del segmento de mem compartida

500 kb

SHMALL Total compartida ~SHMMAX

SHMSEG Máximo seg. Mem. Por proceso

1

SHMNI Máximo de segmentos SHMSEG+requerido por aplic.

SEMMNI Máx. De identificadores de semáforos

Al menos max_conection /16

SEMMNS Máx. De semáforos del sistema

(max_connection/16)*17+req. Por las aplic.

SEMMSL Semáforos del conjunto Min. 17

SEMMAP Entradas en un mapa de semáforos

~SEMMNS

SEMVMX Valor máx. De semáforo Al menos 32767

Page 22: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Modificación Parametros del Kernel

• Archivo sysctl.conf en el directorio /etc.• Delante de cada parámetro agregar

kernel.<parametro>

Page 23: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Recomendaciones

Page 24: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Cambiando la configuración

• ¿Como resetear – recargar?– /etc/init.d/postgres reload– /etc/init.d/postgres restart– Service postgres reload | restart

• En el postgresql.conf, las variables que requieren restartear el motor, tienen un comentario que indica eso.

• 'Reload' utiliza mucho menos tiempo.

Page 25: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Identificadores de objetosY columnas de sistema

Page 26: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

OID• Se usa internamente para tablas de sistema como PK's.• No son agregadas a las tablas de usuarios a menos que se la cree

con la opción WITH OIDS o se habilite la variable default_with_oids.• Hay diversos tipos de alias para el OID: regproc, regprocedure,

regoper, regoperator, regclass, regtype, regconfig, and regdictionary.

Page 27: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Tableoid

• El OID de la tabla es el contenido de esta fila. Es particularmente útil para consultas que selecccionan desde herencia, permitiendo observar deque tabla individualmente proviene un registro. Puede ser 'unido' contra el OID de la columna OID de pg_class, obteniendo el nombre de la tabla.

Page 28: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Ejemplo Tableoid

Page 29: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

xmin

• Es la identidad de la transacción de inserción de la versión de la fila.

• Una 'versión de una fila' es un estado individual de una fila. – Cada actualización de una fila genera una

nueva versión de la misma para la misma fila lógica.

Page 30: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Cmin -cmax

• CMIN: El identificador de comando (comenzando de 0) de la transacción de inserción.

• CMAX:Idem de la transacción de borrado o en 0.

Page 31: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

xmax

• Es la identidad de la transacción de borrado o en 0 para una fila no borrada.

• Es posible para esta columna ser distinto de 0 en una versión de fila visible.

• Usualmente indica que la transacción de borrado no ha sido comprometida aún o que fue abortada con 'rollback'.

Page 32: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

ctid• Ubicación física de una versión de una fila de

una tabla• El CTID puede variar, por lo que no se aconseja

para ser utilizada para buscar un determinado campo. (Esto lo hace el VACUUM).

• Es útil para identificar campos en conjuntos grandes. En el caso de buscar filas lógicas, se recomienda OID.

Page 33: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Hackaton Ctid

Page 34: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Tipos propios

Page 35: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Ejemplocreate type groupOfNumber AS (

first integer, second float, third numeric(10,2)

);

create table tabla1( numeros groupOfNumber, a serial not null, dia date default CURRENT_DATE);

CREATE DOMAIN midominio as integer default 1 NOT NULL;

create table foo3 (numero midominio);alter domain midominio set default 2;

NOTICE: CREATE TABLE will create implicit sequence "tabla1_a_seq" for serial column "tabla1.a" CREATE TABLE base1=# \d List of relations Schema | Name | Type | Owner --------+--------------+----------+---------- public | tabla1 | table | postgres public | tabla1_a_seq | sequence | postgres (2 rows)

insert into tabla1 default values; --mirar que no hay restriccion en 'numeros'

insert into tabla1 values( (1,2.0,2.1) );

Page 36: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Expresiones regulares

Page 37: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Operadores

http://developer.postgresql.org/pgdocs/postgres/functions-string.html

Page 38: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Ejemplos• 'abc' ~ 'abc' true• 'abc' ~ '^a' true• 'abc' ~ '(b|d)' true• 'abc' ~ '^(b|c)' false• 'abc' ~ '(b)$' false

Page 39: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Funciones

• regexp_matches('foobarbequebaz', '(bar)(beque)')

• regexp_replace('Thomas', '.[mN]a.', 'M')• regexp_split_to_array('hello world', E'\\s+')• regexp_split_to_table('hello world', E'\\s+')

Page 40: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Ejemplos funciones• substring('foobar' from 'o.b') oob• substring('foobar' from 'o(.)b') o• regexp_replace('foobarbaz', 'b..', 'X') fooXbaz• regexp_replace('foobarbaz', 'b..', 'X', 'g') fooXX• regexp_replace('foobarbaz', 'b(..)', E'X\\1Y', 'g') fooXarYXazY

Page 41: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Ejemplos

Page 42: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Ejemplos

Page 43: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Lenguajes Procedurales

Page 44: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Finalidad• Extienden los limites de SQL para tareas

complejas.• Permiten el control de acceso a

determinados objetos.• Controlar la integridad de los datos.• Realizar operaciones suplementarias del

lado del servidor, aprovechando el poder de procesamiento-

Page 45: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Características• Las funciones se ejecutan del lado servidor,

lo que puede ser utilizado para aprovechar los beneficios que eso acarrea, en lugar de ejecutarlos localmente.

• Están 'más cerca de los datos'.

Page 46: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Lenguajes

• Postgresql posee varios lenguajes Procedurales (o extensiones).

• Entre ellos se encuentran: SQL, PL/Pgsql, C, PL/python, PL/perl, PL/tcl, PL/Proxy, PL/Scheme, PL/R, PL/java, PL/php entre varios más...

• Saber aprovechar las ventajas de cada uno y conocer las debilidades.

Page 47: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Intro Pl/Pgsql

• PL por excelencia• Procedural • Fácil de usar• Fácil de portar desde Oracle PL/SQL• Sintaxis simple y apropiada• No particularmente veloz …

• cache de planes de ejecución• Requiere ser instalado, pero no necesita

modificaciones en la compilación.

Page 48: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

PL/pgsql

• Plpgsql no esta instalado por defecto.• Se lo instala: CREATE LANGUAGE 'plpgsql';• Se puede crear a traves de un handler teniendo compilada la

shared library.• Plperl no viene por defecto, requiere librerias no incluidas.• Entre los mas conocidos PL/tcl, python, ruby,php, java... y

continua la lista...

Page 49: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Crear lenguaje• CREATE [ PROCEDURAL ] LANGUAGE name• CREATE [ TRUSTED ] [ PROCEDURAL ]

LANGUAGE name• HANDLER call_handler [ VALIDATOR valfunction ]

CREATE LANGUAGE plpgsql;GRANT ALL ON LANGUAGE plpgsql TO resagado2;--all es USAGE en este caso

Page 50: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Tipos de Funciones

• Según lo que retornan– Funciones “normales”– SRF (set-returning

function)– Agregación

• Especiales– trigger– language_handler

• Privilegios durante invocación– security definer– security invoke

• Por lo que modifican– Volátiles VOLATILE– Inmutable INMUTABLE– Estricta STRICT

• Tradicionales– Retornan un solo resultado

(escalar o tupla)– Es posible retornar un

cursor abierto– Pueden tener efectos

secundarios( tabla temporal)

Page 51: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Declaraciónpostgres=# \h create function

...

CREATE [ OR REPLACE ] FUNCTION

name ( [ [ argmode ] [ argname ] argtype [, ...] ] )

[ RETURNS rettype ]

{ LANGUAGE langname

| IMMUTABLE | STABLE | VOLATILE

| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT

| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER

| COST execution_cost

| ROWS result_rows

| SET configuration_parameter { TO value | = value | FROM CURRENT }

| AS 'definition'

| AS 'obj_file', 'link_symbol'

} ...

[ WITH ( attribute [, ...] ) ]

Page 52: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Estructura• Tienen estructuras de 'bloque'.• Cada bloque se define usando DECLARE, BEGIN, END; Estos bloques pueden estar

anidados.• NO SE PUEDEN DEFINIR TRANSACCIONES EN UNA FUNCIÓN.• Los tipos de datos pasados a la función se dan en paréntesis • El cuerpo de la función se pasa a la base de datos como una cadena de caracteres

(véase, que el cuerpo empieza y acaba con comillas simples en las versiones 7.x, a partir del 8 se recomienda el uso de $$ o $BODY$)

• Tras la cadena el lenguaje usado para crear la función se define usando la orden "LANGUAGE" (otros lenguajes posibles son PL/PERL, PL/python, C, etc)

Page 53: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Calificadores• SECURITY DEFINER• STRICT• COST cost_metric • ROWS est_num_rows

Page 54: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Tipos de variablesNumero INTEGER;otro VARCHAR(20);otroNumero NUMERIC(10,2);

-- RECOMENDADO, podemos utilizar nuestros datos predefinidossoyDelTipoQueSeaUnCampo mitabla.campo%TYPE;soyDelTipoRegistroDeUnaTabla mitable%ROWTYPE;...

RETURN soyDelTipoRegistroDeUnaTabla.unCampoDeLaTabla; -- utilizo un campo de la tupla en la variable

Page 55: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Bloques y declaraciónDECLAREvariable tipodedato:= dameUnValor;variable2 algunTipocurs1 refcursor;curs2 CURSOR FOR SELECT * FROM tablita;

variable := valor;SELECT field1, field2INTO variable,variable2FROM tablita WHERE .. LIMIT 1;

Page 56: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

EjemploCREATE FUNCTION suma (INT,INT,INT,INT)RETURNS INT4 AS $BODY$DECLARE SUMA INT4; soyElPrimerParametro ALIAS FOR $1;BEGIN SUMA:=soyElPrimerParametro+$2+$3; SUMA:=SUMA-$4; RETURN cast(SUMA as int4);END;$BODY$ LANGUAGE plpgsql;

postgres=> SELECT SUMA (1,2,3,4);Suma----- 2

Page 57: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Control de Flujo (FOR)FOR i IN 1 ... numtimes

LOOP statementsEND LOOP;FOR i IN REVERSE

numtimes ...1 LOOP statementsEND LOOP;

FOR var_e IN EXCUTE('someDynamicSql') LOOPstatements

RETURN NEXT var_e;

END LOOPFOR var_e IN someSql

LOOPstatements

RETURN NEXT var_e;

END LOOP;

Page 58: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Control condicional IFIF condition THEN

:

END IF;

IF condition THEN:

ELSE:

END IF;

IF condition THEN:ELSEIF condition THEN:ELSE:END IF;

Page 59: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

8.4 CASE (x valor)CREATE OR REPLACE FUNCTION x(INT4) RETURNS TEXT as $$BEGIN CASE $1 WHEN 1,2 THEN RETURN 'uno o dos'; WHEN 3 THEN RETURN 'tres...'; ELSE RETURN 'ni idea'; END CASE;END;$$ language plpgsql;

Page 60: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

8.4 CASE (x expresión)CREATE OR REPLACE FUNCTION x(INT4) RETURNS TEXT as $$BEGIN CASE WHEN $1 < 10 THEN RETURN 'menor a 10'; WHEN $1 = 10 THEN RETURN 'it''s 10'; ELSE RETURN 'mas de 10 seguro'; END CASE; END;$$ language plpgsql;

Page 61: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Bucle (while y loop)

WHILE condition LOOP:

END LOOP;LOOP

-- codigoEXIT WHEN count > 100;CONTINUE WHEN count < 50;-- cout IN [50 .. 100]

END LOOP;

Page 62: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

ReturnRETURN somevariable;RETURN NEXT rowvariable;RETURN QUERY; --nuevo!!RETURN algundatoRETURN SETOF algunTipoDeDato (SRF)RETURN voidRETURN refcursorRETURN trigger

Page 63: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Estados y constantes de error

FOUNDROW_COUNTdivision_by_zerono_data_foundtoo_many_rowsunique_violation

Page 64: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

RAISE

• RAISE DEBUG[1-5]• RAISE EXCEPTION• RAISE INFO• RAISE LOG• RAISE NOTICE

Page 65: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Exepciones

RAISE EXCEPTION 'Exception notice: %', varEXCEPTION WHEN condition THEN hacer o dejar en blanco para ignorarEND;

Page 66: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Variables predefinidas para Triggers

Nombre Tipo DescripciónNEW %ROWTYPE Nuevos Valores (INSERT | UPDATE)OLD %ROWTYPE Valores Antiguos ( UPDATE |DELETE )TG_NAME NAME Nombre del TRIGGERTG_WHEN TEXT BEFORE | AFTERTG_LEVEL TEXT ROW | SENTENCIA (SQL)TG_OP TEXT INSERT, UPDATE | DELETETG_RELID OID Identificador de la tablaTG_RELNAME NAME Nombre de la tablaTG_NARGS INT Numero de argumentosTG_VARGS TEXT[] Argumentos

Page 67: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

EjemploCREATE OR REPLACE FUNCTION capitalize(_texto text) RETURNS text AS $BODY$

DECLARE

fin INTEGER;

temporal RECORD;

retval TEXT;

BEGIN

retval = ' ';

FOR temporal IN SELECT string_to_array (_texto,' ') AS arreglo LOOP

SELECT regexp_replace(

regexp_replace(

array_dims(temporal.arreglo),'[^1-9]','','g')

,'.','')::integer into fin;

FOR i IN 1..fin LOOP

retval = retval || upper(substring(temporal.arreglo[i],1,1)) || lower(regexp_replace(temporal.arreglo[i],'(.)(.*)','\\2')) ||' ';

END LOOP;

END LOOP;

RETURN trim(retval);

END;

$BODY$ LANGUAGE 'plpgsql' VOLATILE;

Page 68: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Ejemplo

Se inserta el valor de un campoEn una variable (cursor implícito)

Page 69: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

Ejemplo Triggers

Page 70: PostgreSQL - repositorio.siu.edu.ar · . Ejemplos ... postgres=# \h create function... CREATE [ OR REPLACE ] FUNCTION

</Día 4></curso>

</Gracias!>