SlideShare una empresa de Scribd logo
1 de 41
Descargar para leer sin conexión
Funciones y Triggers
Introducción, Ejemplos
Álvaro Herrera
13 de noviembre de 2004
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Contenidos
Funciones: ¿para qué?
Lenguajes
Tipos de funciones
Creación de funciones
tradicionales
SRFs
Funciones para triggers
Indices Funcionales
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
¿Para qué quiero funciones?
Mantener lógica lejos de la aplicación
consistencia entre aplicaciones
reducción de funcionalidad duplicada
Acceso predefinido a objetos restringidos
Escoger herramienta adecuada a cada caso
Algunas cosas necesitan lenguaje procedural
SQL es declarativo
se necesita poder expresivo distinto
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Los lenguajes
PostgreSQL soporta múltiples lenguajes procedurales
saber usar el apropiado en cada caso
conocer debilidades, fortalezas de cada uno
Hackers:
agregar soporte a nuevos lenguajes
Lenguajes confiables (trusted)
se puede “desconfiar” del usuario
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Lenguajes: SQL
Lenguaje más básico y simple
No otorga poder adicional
Permite simplificar consultas
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Lenguajes: PL/pgSQL
PL por excelencia
Procedural
Sintaxis para loops, condicionales, etc
Fácil de usar
portar desde Oracle PL/SQL
sintaxis simple y apropiada
No particularmente veloz ···
cache de planes de ejecución
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Lenguajes: C
Muy potente, flexible
Excelente rendimiento
Tiene acceso a todo
ejecutar consultas, escribir archivos, etc
incluso a botar el proceso servidor
Obtuso, pesado, complicado, peligroso
usarlo sólo en caso de necesidad!
No es confiable (trusted)
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Lenguajes: scripting
Tcl
Perl
Python
PHP
otros
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Lenguajes: PL/R
Mención especial
brillantemente mantenido
Propósito específico
manejo estadístico
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Lenguajes: conclusiones
Experimentar, usar, familiarizarse
Puede alivianar el trabajo ···
si se usa la herramienta adecuada
Puede mejorar rendimiento
“premature optimization is the root of all evil”
(Donald Knuth)
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
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 invoker
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Funciones Tradicionales
Retornan un solo resultado
escalar o tupla
Es posible retornar un cursor abierto
Pueden tener efectos secundarios
tabla temporal
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Sintaxis de Creación de Funciones
CREATE [OR REPLACE] FUNCTION
([tipo argumento], ···)
RETURNS [tipo resultado]
{ LANGUAGE lenguaje
| IMMUTABLE | STABLE | VOLATILE
| CALLED ON NULL INPUT
| RETURNS NULL ON NULL INPUT
| STRICT
| [EXTERNAL] SECURITY INVOKER
| [EXTERNAL] SECURITY DEFINER
| AS ’definición’
| AS ’archivo’, ’símbolo’
} ···
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Creación de Funciones: atributos
IMMUTABLE
retorna lo mismo con los mismos argumentos
no hace búsquedas en la BD!
STABLE
como immutable, pero puede cambiar con el estado de la BD
VOLATILE
puede cambiar de una llamada a otra
si tiene efectos secundarios
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Creación de Funciones: atributos (2)
STRICT
RETURNS NULL ON NULL INPUT
si algún argumento es NULL, no es necesario llamarla
CALLED ON NULL INPUT
debe ser invocada
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 1: Una fila, SQL
CREATE FUNCTION suma(INTEGER, INTEGER)
RETURNS INTEGER
IMMUTABLE STRICT LANGUAGE SQL
AS ’SELECT $1 + $2’;
regression=> select suma(10, 14);
suma
------
24
(1 row)
regression=> select * FROM suma(10, 14);
suma
------
24
(1 row)
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 1: Una fila, SQL (cont.)
CREATE OR REPLACE FUNCTION suma(INT, INT)
RETURNS INTEGER LANGUAGE SQL
CALLED ON NULL INPUT
AS ’
SELECT CASE
WHEN $1 IS NULL THEN
CASE
WHEN $2 IS NULL THEN NULL
ELSE $2
END
WHEN $2 IS NULL THEN $1
ELSE $1 + $2
END’
IMMUTABLE;
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 1a, PL/pgSQL
CREATE OR REPLACE FUNCTION suma_null(INT, INT, INT)
RETURNS INTEGER CALLED ON NULL INPUT
LANGUAGE plpgsql AS ’
DECLARE
acum INTEGER;
BEGIN
acum := 0;
IF $1 IS NOT NULL THEN
acum := acum + $1;
END IF;
IF $2 IS NOT NULL THEN
acum := acum + $2;
END IF;
IF $3 IS NOT NULL THEN
acum := acum + $3;
END IF;
RETURN acum;
END’;
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 1b: Un operador
CREATE OPERATOR @+
(PROCEDURE = suma,
LEFTARG = INTEGER,
RIGHTARG = INTEGER);
SELECT 1 @+ 2 @+ NULL @+ 4;
?column?
----------
7
(1 fila)
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 2: Una fila, PL/pgSQL
Números a letras
CREATE OR REPLACE FUNCTION test_plpgsql(INT)
RETURNS TEXT LANGUAGE plpgsql STRICT
IMMUTABLE AS ’
DECLARE
num ALIAS FOR $1;
ret TEXT;
BEGIN
IF num = 1 THEN
ret := ’’uno’’;
ELSIF num = 2 THEN
ret := ’’dos’’;
END IF;
RETURN ret;
END ’;
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 3: Una fila, PL/perl
CREATE OR REPLACE FUNCTION num2pal(INTEGER)
RETURNS TEXT AS ’
$num = shift;
return undef if ($num < 1 || $num > 9);
$num--;
return (qw(uno dos tres cuatro cinco seis
siete ocho nueve))[$num];
’ LANGUAGE plperl;
regression=> select num2pal(5);
num2pal
---------
cinco
(1 fila)
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 4: Una fila, C
#include "postgres.h"
#include "fmgr.h"
PG_FUNCTION_INFO_V1(digitoVer);
Datum digitoVer(PG_FUNCTION_ARGS) {
int rut = PG_GETARG_INT32(0);
text *ret;
int M=0, S=1;
for (; rut; rut = rut / 10)
S = (S + rut % 10 * (9 - M++ % 6)) % 11;
ret = (text *) palloc(VARHDRSZ + 1);
VARATT_SIZEP(ret) = 5;
sprintf(VARDATA(ret), "%c", S ? S + ’0’ - 1 : ’K’
PG_RETURN_TEXT_P(ret);
}
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 4: Una fila, C (cont.)
gcc -Wall -O2 -c -fpic
-I‘pg_config --includedir‘
-I‘pg_config --includedir‘/server
pglib.c
gcc -shared pglib.o -o pglib.so
CREATE OR REPLACE FUNCTION
digito_verificador(INTEGER)
RETURNS TEXT
STRICT IMMUTABLE
AS ’/usr/local/lib/pgsql/pglib.so’,
’digitoVer’ LANGUAGE C;
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 4: Una fila, C (cont.)
#include "postgres.h"
#include "fmgr.h"
PG_FUNCTION_INFO_V1(digitoVer);
Datum digitoVer(PG_FUNCTION_ARGS) {
int rut = PG_GETARG_INT32(0);
text *ret;
int M=0, S=1;
for (; rut; rut = rut / 10)
S = (S + rut % 10 * (9 - M++ % 6)) % 11;
ret = (text *) palloc(VARHDRSZ + 1);
VARATT_SIZEP(ret) = VARHDRSZ + 1;
sprintf(VARDATA(ret), "%c", S ? S+’0’-1 : ’K’);
PG_RETURN_TEXT_P(ret);
}
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 4: para que?
CREATE TABLE clientes (
···
rut INTEGER,
dv TEXT CHECK (dv = digito_verificador(rut)),
···
);
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Set-returning Functions (SRF)
Funciones que “retornan tablas”
En cláusula FROM
hacer JOIN
con otras tablas
otras funciones
subconsultas
Definir tipo de retorno
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
SRF: Ejemplos de uso
SELECT * FROM
una_srf(arg1, arg2),
otra_srf(arg1, arg2)
WHERE una_srf.uno = otra_srf.uno
SELECT * FROM
una_srf(arg1, ···)
JOIN otra_srf( ··· ) USING (columna)
JOIN una_tabla ON (condicion ···)
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
SRF: Ejemplos de uso (cont.)
SELECT * FROM
una_tabla,
una_srf(···),
(SELECT tres, cuatro
FROM otra_srf(···)
WHERE ···)
WHERE ···
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
SRF: Tipos de retorno
Lo especial de una SRF
RETURNS SETOF foo
foo puede ser
un tipo
una tabla
una definición anónima
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
SRF: Sintaxis para retorno
CREATE FUNCTION una_srf (···)
RETURNS SETOF tabla ···;
SELECT * FROM una_srf (foo, bar, ···);
CREATE TYPE foo (a int, b int);
CREATE FUNCTION otra_srf (···)
RETURNS SETOF foo ···;
SELECT * FROM otra_srf(···);
CREATE FUNCTION tercera_srf(···)
RETURNS SETOF RECORD ···;
SELECT * FROM tercera_srf(···)
AS tercera(definicion de tipo);
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
SRF en plgpsql: sintaxis
RETURN NEXT foo
acumula la tupla foo para retornar
RETURN termina la función
y devuelve todas las tuplas retornadas
FOR SELECT ··· LOOP
···
RETURN NEXT ···
END LOOP;
RETURN;
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 5: SRF en plpgsql
Todo el mes en intervalos de 30 minutos
DECLARE
inicio ALIAS FOR $1;
valor TIMESTAMP WITH TIME ZONE;
final ALIAS FOR $2;
paso ALIAS FOR $3;
ret RECORD;
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 5: SRF en plpgsql (cont.)
BEGIN
valor := inicio;
LOOP
IF valor >= final THEN
RETURN;
END IF;
SELECT INTO ret valor, valor + paso;
RETURN NEXT ret;
valor := (valor + paso);
END LOOP;
END;
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 5: SRF en plpgsql (cont.)
SELECT * FROM intervalos
(’2003-01-01’, ’2003-01-02’, ’3 hour’)
AS foo(inicio TIMESTAMP WITH TIME ZONE,
fin TIMESTAMP WITH TIME ZONE);
inicio fin
2003-01-01 00:00:00-03 2003-01-01 03:00:00-03
2003-01-01 03:00:00-03 2003-01-01 06:00:00-03
2003-01-01 06:00:00-03 2003-01-01 09:00:00-03
2003-01-01 09:00:00-03 2003-01-01 12:00:00-03
2003-01-01 12:00:00-03 2003-01-01 15:00:00-03
2003-01-01 15:00:00-03 2003-01-01 18:00:00-03
2003-01-01 18:00:00-03 2003-01-01 21:00:00-03
2003-01-01 21:00:00-03 2003-01-02 00:00:00-03
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 6: SRF en SQL
CREATE FUNCTION getfoo(int)
RETURNS setof foo AS ’
SELECT * FROM foo
WHERE fooid = $1;’
LANGUAGE SQL;
SELECT * FROM getfoo(1);
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Privilegios
Otorgar privilegios: GRANT
Funciones: EXECUTE
Lenguajes: USAGE
untrusted: sólo usuarios confiables!
SECURITY INVOKER
normal; permisos del que hace SELECT
SECURITY DEFINER
equivalente a setuid
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 7: Privilegios
CREATE TABLE blah ( ··· );
GRANT SELECT ON TABLE blah TO usuario1;
SET SESSION AUTHORIZATION usuario1;
CREATE FUNCTION lee_blah AS ’··· /* lee tabla blah */
GRANT EXECUTE ON lee_blah TO usuario2;
SET SESSION AUTHORIZATION usuario2;
SELECT * FROM blah;
Error: permiso denegado
SELECT * FROM lee_blah();
puede otorgar una visión restringida
puede otorgar privilegios limitados de modificación
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Índices Funcionales
Crear un índice siguiendo una función
Agiliza consultas que usen la función
Función debe ser IMMUTABLE
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Ejemplo 9: Índice Funcional
CREATE INDEX indice_func
ON tabla date_part(’month’, campo_fecha);
SELECT * FROM tabla WHERE
date_part(’month’, campo_fecha) = ···
SELECT * FROM tabla WHERE
date_part(’month’, campo_fecha)
BETWEEN ··· AND ···
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
Referencias:
http://www.postgresql.org
http://techdocs.postgresql.org
http://www.postgresql.cl
http://www.varlena.com/GeneralBits
http://archives.postgresql.org/pgsql-es-ayuda
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
¿Preguntas?
Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos

Más contenido relacionado

La actualidad más candente

La actualidad más candente (19)

Forms 10g procedimientos y cursores
Forms 10g procedimientos y cursoresForms 10g procedimientos y cursores
Forms 10g procedimientos y cursores
 
Funciones en Lenguaje C
Funciones en Lenguaje CFunciones en Lenguaje C
Funciones en Lenguaje C
 
Proyecto de compiladores Sentencia While con Java CUP y JFLEX
Proyecto de compiladores Sentencia While con Java CUP y JFLEXProyecto de compiladores Sentencia While con Java CUP y JFLEX
Proyecto de compiladores Sentencia While con Java CUP y JFLEX
 
Shell script
Shell scriptShell script
Shell script
 
El shell-bash
El shell-bashEl shell-bash
El shell-bash
 
Ejercicios resuelto de shell script
Ejercicios resuelto  de shell scriptEjercicios resuelto  de shell script
Ejercicios resuelto de shell script
 
C++ y sus librerias
C++ y sus libreriasC++ y sus librerias
C++ y sus librerias
 
7
77
7
 
Java 8
Java 8Java 8
Java 8
 
49 Php. Funciones De Usuario
49 Php. Funciones De Usuario49 Php. Funciones De Usuario
49 Php. Funciones De Usuario
 
Practica 5
Practica 5Practica 5
Practica 5
 
Introducción a PHP
Introducción a PHPIntroducción a PHP
Introducción a PHP
 
Guion scripts
Guion scriptsGuion scripts
Guion scripts
 
C# Nuevas características en C# 6
C# Nuevas características en C# 6C# Nuevas características en C# 6
C# Nuevas características en C# 6
 
Funciones y procedimientos
Funciones y procedimientosFunciones y procedimientos
Funciones y procedimientos
 
Instalar Python 2.7 y 3 en Windows (Anaconda)
Instalar Python 2.7 y 3 en Windows (Anaconda)Instalar Python 2.7 y 3 en Windows (Anaconda)
Instalar Python 2.7 y 3 en Windows (Anaconda)
 
FUNCIONES LENGUAJE C
FUNCIONES LENGUAJE CFUNCIONES LENGUAJE C
FUNCIONES LENGUAJE C
 
INSTRUCCIONES BÁSICAS PARA C++
INSTRUCCIONES BÁSICAS PARA C++INSTRUCCIONES BÁSICAS PARA C++
INSTRUCCIONES BÁSICAS PARA C++
 
Tutorial de php
Tutorial de phpTutorial de php
Tutorial de php
 

Destacado (7)

Presentación Tema 1
Presentación Tema 1Presentación Tema 1
Presentación Tema 1
 
Procedimientos y funciones
Procedimientos y funcionesProcedimientos y funciones
Procedimientos y funciones
 
Auditoría de bases de datos
Auditoría de bases de datosAuditoría de bases de datos
Auditoría de bases de datos
 
TODO SOBRE SQL
TODO SOBRE SQLTODO SOBRE SQL
TODO SOBRE SQL
 
Trigger Data Base
Trigger Data BaseTrigger Data Base
Trigger Data Base
 
TRIGGERS
TRIGGERSTRIGGERS
TRIGGERS
 
Trigger
TriggerTrigger
Trigger
 

Similar a 03 funciones

Sesion10 - Funciones y procedimientos (Oracle)
Sesion10 - Funciones y procedimientos (Oracle)Sesion10 - Funciones y procedimientos (Oracle)
Sesion10 - Funciones y procedimientos (Oracle)José Toro
 
Basededatos
BasededatosBasededatos
BasededatosHan San
 
Funciones store proc_triggers
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggersLuis Jherry
 
Funciones store proc_triggers
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggersLuis Jherry
 
Taller listasyeasygui
Taller listasyeasyguiTaller listasyeasygui
Taller listasyeasyguiAlbert Page
 
Curso Básico de Pl Sql Oracle
Curso Básico de Pl Sql OracleCurso Básico de Pl Sql Oracle
Curso Básico de Pl Sql Oracleluisguil
 
Introducción Javascript.pdf
Introducción Javascript.pdfIntroducción Javascript.pdf
Introducción Javascript.pdfrhapetus
 
Introduccion a C++
Introduccion a C++Introduccion a C++
Introduccion a C++LenHugo
 
Actividad 3 . funciones en php
Actividad 3 . funciones en phpActividad 3 . funciones en php
Actividad 3 . funciones en phpLeonardoPuerta2
 
Proyectos Web 3 Introduccion Php
Proyectos Web   3 Introduccion PhpProyectos Web   3 Introduccion Php
Proyectos Web 3 Introduccion PhpJose Ponce
 
GUÍA RÁPIDA LENGUAJE C/AL
GUÍA RÁPIDA LENGUAJE C/ALGUÍA RÁPIDA LENGUAJE C/AL
GUÍA RÁPIDA LENGUAJE C/ALmakac0 makac0
 
Estado del Desarrollo de PostgreSQL-9.0
Estado del Desarrollo de PostgreSQL-9.0Estado del Desarrollo de PostgreSQL-9.0
Estado del Desarrollo de PostgreSQL-9.0Marcos Ortiz Valmaseda
 
ESTRUCTURAS DE CONTROL: BUCLES EN C++
ESTRUCTURAS DE CONTROL: BUCLES EN C++ESTRUCTURAS DE CONTROL: BUCLES EN C++
ESTRUCTURAS DE CONTROL: BUCLES EN C++die_dex
 

Similar a 03 funciones (20)

Sesion10 - Funciones y procedimientos (Oracle)
Sesion10 - Funciones y procedimientos (Oracle)Sesion10 - Funciones y procedimientos (Oracle)
Sesion10 - Funciones y procedimientos (Oracle)
 
Funciones
FuncionesFunciones
Funciones
 
Basededatos
BasededatosBasededatos
Basededatos
 
Funciones store proc_triggers
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggers
 
Funciones store proc_triggers
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggers
 
Introducción a Python
Introducción a PythonIntroducción a Python
Introducción a Python
 
Taller listasyeasygui
Taller listasyeasyguiTaller listasyeasygui
Taller listasyeasygui
 
Curso Básico de Pl Sql Oracle
Curso Básico de Pl Sql OracleCurso Básico de Pl Sql Oracle
Curso Básico de Pl Sql Oracle
 
Introducción Javascript.pdf
Introducción Javascript.pdfIntroducción Javascript.pdf
Introducción Javascript.pdf
 
Introduccion a C++
Introduccion a C++Introduccion a C++
Introduccion a C++
 
Postgres trigger
Postgres triggerPostgres trigger
Postgres trigger
 
Actividad 3 . funciones en php
Actividad 3 . funciones en phpActividad 3 . funciones en php
Actividad 3 . funciones en php
 
Introduccion clips
Introduccion clipsIntroduccion clips
Introduccion clips
 
Proyectos Web 3 Introduccion Php
Proyectos Web   3 Introduccion PhpProyectos Web   3 Introduccion Php
Proyectos Web 3 Introduccion Php
 
Presentacion
PresentacionPresentacion
Presentacion
 
Anexo1
Anexo1Anexo1
Anexo1
 
GUÍA RÁPIDA LENGUAJE C/AL
GUÍA RÁPIDA LENGUAJE C/ALGUÍA RÁPIDA LENGUAJE C/AL
GUÍA RÁPIDA LENGUAJE C/AL
 
Estado del Desarrollo de PostgreSQL-9.0
Estado del Desarrollo de PostgreSQL-9.0Estado del Desarrollo de PostgreSQL-9.0
Estado del Desarrollo de PostgreSQL-9.0
 
ESTRUCTURAS DE CONTROL: BUCLES EN C++
ESTRUCTURAS DE CONTROL: BUCLES EN C++ESTRUCTURAS DE CONTROL: BUCLES EN C++
ESTRUCTURAS DE CONTROL: BUCLES EN C++
 
Examen Sandra U Israel Oracle
Examen Sandra U Israel OracleExamen Sandra U Israel Oracle
Examen Sandra U Israel Oracle
 

Último

Propositos del comportamiento de fases y aplicaciones
Propositos del comportamiento de fases y aplicacionesPropositos del comportamiento de fases y aplicaciones
Propositos del comportamiento de fases y aplicaciones025ca20
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALKATHIAMILAGRITOSSANC
 
Comite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxComite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxClaudiaPerez86192
 
clases de dinamica ejercicios preuniversitarios.pdf
clases de dinamica ejercicios preuniversitarios.pdfclases de dinamica ejercicios preuniversitarios.pdf
clases de dinamica ejercicios preuniversitarios.pdfDanielaVelasquez553560
 
Tiempos Predeterminados MOST para Estudio del Trabajo II
Tiempos Predeterminados MOST para Estudio del Trabajo IITiempos Predeterminados MOST para Estudio del Trabajo II
Tiempos Predeterminados MOST para Estudio del Trabajo IILauraFernandaValdovi
 
Introducción a los sistemas neumaticos.ppt
Introducción a los sistemas neumaticos.pptIntroducción a los sistemas neumaticos.ppt
Introducción a los sistemas neumaticos.pptEduardoCorado
 
Presentación Proyecto Trabajo Creativa Profesional Azul.pdf
Presentación Proyecto Trabajo Creativa Profesional Azul.pdfPresentación Proyecto Trabajo Creativa Profesional Azul.pdf
Presentación Proyecto Trabajo Creativa Profesional Azul.pdfMirthaFernandez12
 
TALLER PAEC preparatoria directamente de la secretaria de educación pública
TALLER PAEC preparatoria directamente de la secretaria de educación públicaTALLER PAEC preparatoria directamente de la secretaria de educación pública
TALLER PAEC preparatoria directamente de la secretaria de educación públicaSantiagoSanchez353883
 
Diapositiva de Topografía Nivelación simple y compuesta
Diapositiva de Topografía Nivelación simple y compuestaDiapositiva de Topografía Nivelación simple y compuesta
Diapositiva de Topografía Nivelación simple y compuestajeffsalazarpuente
 
CICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresaCICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresaSHERELYNSAMANTHAPALO1
 
Calavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdfCalavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdfyoseka196
 
Residente de obra y sus funciones que realiza .pdf
Residente de obra y sus funciones que realiza  .pdfResidente de obra y sus funciones que realiza  .pdf
Residente de obra y sus funciones que realiza .pdfevin1703e
 
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIASTEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIASfranzEmersonMAMANIOC
 
Manual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdfManual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdfedsonzav8
 
Sesion 02 Patentes REGISTRO EN INDECOPI PERU
Sesion 02 Patentes REGISTRO EN INDECOPI PERUSesion 02 Patentes REGISTRO EN INDECOPI PERU
Sesion 02 Patentes REGISTRO EN INDECOPI PERUMarcosAlvarezSalinas
 
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdfAnthonyTiclia
 
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIPSEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIPJosLuisFrancoCaldern
 
Una estrategia de seguridad en la nube alineada al NIST
Una estrategia de seguridad en la nube alineada al NISTUna estrategia de seguridad en la nube alineada al NIST
Una estrategia de seguridad en la nube alineada al NISTFundación YOD YOD
 
Curso intensivo de soldadura electrónica en pdf
Curso intensivo de soldadura electrónica  en pdfCurso intensivo de soldadura electrónica  en pdf
Curso intensivo de soldadura electrónica en pdfFernandaGarca788912
 
sistema de construcción Drywall semana 7
sistema de construcción Drywall semana 7sistema de construcción Drywall semana 7
sistema de construcción Drywall semana 7luisanthonycarrascos
 

Último (20)

Propositos del comportamiento de fases y aplicaciones
Propositos del comportamiento de fases y aplicacionesPropositos del comportamiento de fases y aplicaciones
Propositos del comportamiento de fases y aplicaciones
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
 
Comite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxComite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptx
 
clases de dinamica ejercicios preuniversitarios.pdf
clases de dinamica ejercicios preuniversitarios.pdfclases de dinamica ejercicios preuniversitarios.pdf
clases de dinamica ejercicios preuniversitarios.pdf
 
Tiempos Predeterminados MOST para Estudio del Trabajo II
Tiempos Predeterminados MOST para Estudio del Trabajo IITiempos Predeterminados MOST para Estudio del Trabajo II
Tiempos Predeterminados MOST para Estudio del Trabajo II
 
Introducción a los sistemas neumaticos.ppt
Introducción a los sistemas neumaticos.pptIntroducción a los sistemas neumaticos.ppt
Introducción a los sistemas neumaticos.ppt
 
Presentación Proyecto Trabajo Creativa Profesional Azul.pdf
Presentación Proyecto Trabajo Creativa Profesional Azul.pdfPresentación Proyecto Trabajo Creativa Profesional Azul.pdf
Presentación Proyecto Trabajo Creativa Profesional Azul.pdf
 
TALLER PAEC preparatoria directamente de la secretaria de educación pública
TALLER PAEC preparatoria directamente de la secretaria de educación públicaTALLER PAEC preparatoria directamente de la secretaria de educación pública
TALLER PAEC preparatoria directamente de la secretaria de educación pública
 
Diapositiva de Topografía Nivelación simple y compuesta
Diapositiva de Topografía Nivelación simple y compuestaDiapositiva de Topografía Nivelación simple y compuesta
Diapositiva de Topografía Nivelación simple y compuesta
 
CICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresaCICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresa
 
Calavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdfCalavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdf
 
Residente de obra y sus funciones que realiza .pdf
Residente de obra y sus funciones que realiza  .pdfResidente de obra y sus funciones que realiza  .pdf
Residente de obra y sus funciones que realiza .pdf
 
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIASTEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
 
Manual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdfManual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdf
 
Sesion 02 Patentes REGISTRO EN INDECOPI PERU
Sesion 02 Patentes REGISTRO EN INDECOPI PERUSesion 02 Patentes REGISTRO EN INDECOPI PERU
Sesion 02 Patentes REGISTRO EN INDECOPI PERU
 
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
 
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIPSEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
 
Una estrategia de seguridad en la nube alineada al NIST
Una estrategia de seguridad en la nube alineada al NISTUna estrategia de seguridad en la nube alineada al NIST
Una estrategia de seguridad en la nube alineada al NIST
 
Curso intensivo de soldadura electrónica en pdf
Curso intensivo de soldadura electrónica  en pdfCurso intensivo de soldadura electrónica  en pdf
Curso intensivo de soldadura electrónica en pdf
 
sistema de construcción Drywall semana 7
sistema de construcción Drywall semana 7sistema de construcción Drywall semana 7
sistema de construcción Drywall semana 7
 

03 funciones

  • 1. Funciones y Triggers Introducción, Ejemplos Álvaro Herrera 13 de noviembre de 2004 Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 2. Contenidos Funciones: ¿para qué? Lenguajes Tipos de funciones Creación de funciones tradicionales SRFs Funciones para triggers Indices Funcionales Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 3. ¿Para qué quiero funciones? Mantener lógica lejos de la aplicación consistencia entre aplicaciones reducción de funcionalidad duplicada Acceso predefinido a objetos restringidos Escoger herramienta adecuada a cada caso Algunas cosas necesitan lenguaje procedural SQL es declarativo se necesita poder expresivo distinto Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 4. Los lenguajes PostgreSQL soporta múltiples lenguajes procedurales saber usar el apropiado en cada caso conocer debilidades, fortalezas de cada uno Hackers: agregar soporte a nuevos lenguajes Lenguajes confiables (trusted) se puede “desconfiar” del usuario Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 5. Lenguajes: SQL Lenguaje más básico y simple No otorga poder adicional Permite simplificar consultas Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 6. Lenguajes: PL/pgSQL PL por excelencia Procedural Sintaxis para loops, condicionales, etc Fácil de usar portar desde Oracle PL/SQL sintaxis simple y apropiada No particularmente veloz ··· cache de planes de ejecución Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 7. Lenguajes: C Muy potente, flexible Excelente rendimiento Tiene acceso a todo ejecutar consultas, escribir archivos, etc incluso a botar el proceso servidor Obtuso, pesado, complicado, peligroso usarlo sólo en caso de necesidad! No es confiable (trusted) Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 8. Lenguajes: scripting Tcl Perl Python PHP otros Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 9. Lenguajes: PL/R Mención especial brillantemente mantenido Propósito específico manejo estadístico Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 10. Lenguajes: conclusiones Experimentar, usar, familiarizarse Puede alivianar el trabajo ··· si se usa la herramienta adecuada Puede mejorar rendimiento “premature optimization is the root of all evil” (Donald Knuth) Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 11. 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 invoker Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 12. Funciones Tradicionales Retornan un solo resultado escalar o tupla Es posible retornar un cursor abierto Pueden tener efectos secundarios tabla temporal Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 13. Sintaxis de Creación de Funciones CREATE [OR REPLACE] FUNCTION ([tipo argumento], ···) RETURNS [tipo resultado] { LANGUAGE lenguaje | IMMUTABLE | STABLE | VOLATILE | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT | [EXTERNAL] SECURITY INVOKER | [EXTERNAL] SECURITY DEFINER | AS ’definición’ | AS ’archivo’, ’símbolo’ } ··· Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 14. Creación de Funciones: atributos IMMUTABLE retorna lo mismo con los mismos argumentos no hace búsquedas en la BD! STABLE como immutable, pero puede cambiar con el estado de la BD VOLATILE puede cambiar de una llamada a otra si tiene efectos secundarios Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 15. Creación de Funciones: atributos (2) STRICT RETURNS NULL ON NULL INPUT si algún argumento es NULL, no es necesario llamarla CALLED ON NULL INPUT debe ser invocada Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 16. Ejemplo 1: Una fila, SQL CREATE FUNCTION suma(INTEGER, INTEGER) RETURNS INTEGER IMMUTABLE STRICT LANGUAGE SQL AS ’SELECT $1 + $2’; regression=> select suma(10, 14); suma ------ 24 (1 row) regression=> select * FROM suma(10, 14); suma ------ 24 (1 row) Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 17. Ejemplo 1: Una fila, SQL (cont.) CREATE OR REPLACE FUNCTION suma(INT, INT) RETURNS INTEGER LANGUAGE SQL CALLED ON NULL INPUT AS ’ SELECT CASE WHEN $1 IS NULL THEN CASE WHEN $2 IS NULL THEN NULL ELSE $2 END WHEN $2 IS NULL THEN $1 ELSE $1 + $2 END’ IMMUTABLE; Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 18. Ejemplo 1a, PL/pgSQL CREATE OR REPLACE FUNCTION suma_null(INT, INT, INT) RETURNS INTEGER CALLED ON NULL INPUT LANGUAGE plpgsql AS ’ DECLARE acum INTEGER; BEGIN acum := 0; IF $1 IS NOT NULL THEN acum := acum + $1; END IF; IF $2 IS NOT NULL THEN acum := acum + $2; END IF; IF $3 IS NOT NULL THEN acum := acum + $3; END IF; RETURN acum; END’; Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 19. Ejemplo 1b: Un operador CREATE OPERATOR @+ (PROCEDURE = suma, LEFTARG = INTEGER, RIGHTARG = INTEGER); SELECT 1 @+ 2 @+ NULL @+ 4; ?column? ---------- 7 (1 fila) Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 20. Ejemplo 2: Una fila, PL/pgSQL Números a letras CREATE OR REPLACE FUNCTION test_plpgsql(INT) RETURNS TEXT LANGUAGE plpgsql STRICT IMMUTABLE AS ’ DECLARE num ALIAS FOR $1; ret TEXT; BEGIN IF num = 1 THEN ret := ’’uno’’; ELSIF num = 2 THEN ret := ’’dos’’; END IF; RETURN ret; END ’; Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 21. Ejemplo 3: Una fila, PL/perl CREATE OR REPLACE FUNCTION num2pal(INTEGER) RETURNS TEXT AS ’ $num = shift; return undef if ($num < 1 || $num > 9); $num--; return (qw(uno dos tres cuatro cinco seis siete ocho nueve))[$num]; ’ LANGUAGE plperl; regression=> select num2pal(5); num2pal --------- cinco (1 fila) Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 22. Ejemplo 4: Una fila, C #include "postgres.h" #include "fmgr.h" PG_FUNCTION_INFO_V1(digitoVer); Datum digitoVer(PG_FUNCTION_ARGS) { int rut = PG_GETARG_INT32(0); text *ret; int M=0, S=1; for (; rut; rut = rut / 10) S = (S + rut % 10 * (9 - M++ % 6)) % 11; ret = (text *) palloc(VARHDRSZ + 1); VARATT_SIZEP(ret) = 5; sprintf(VARDATA(ret), "%c", S ? S + ’0’ - 1 : ’K’ PG_RETURN_TEXT_P(ret); } Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 23. Ejemplo 4: Una fila, C (cont.) gcc -Wall -O2 -c -fpic -I‘pg_config --includedir‘ -I‘pg_config --includedir‘/server pglib.c gcc -shared pglib.o -o pglib.so CREATE OR REPLACE FUNCTION digito_verificador(INTEGER) RETURNS TEXT STRICT IMMUTABLE AS ’/usr/local/lib/pgsql/pglib.so’, ’digitoVer’ LANGUAGE C; Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 24. Ejemplo 4: Una fila, C (cont.) #include "postgres.h" #include "fmgr.h" PG_FUNCTION_INFO_V1(digitoVer); Datum digitoVer(PG_FUNCTION_ARGS) { int rut = PG_GETARG_INT32(0); text *ret; int M=0, S=1; for (; rut; rut = rut / 10) S = (S + rut % 10 * (9 - M++ % 6)) % 11; ret = (text *) palloc(VARHDRSZ + 1); VARATT_SIZEP(ret) = VARHDRSZ + 1; sprintf(VARDATA(ret), "%c", S ? S+’0’-1 : ’K’); PG_RETURN_TEXT_P(ret); } Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 25. Ejemplo 4: para que? CREATE TABLE clientes ( ··· rut INTEGER, dv TEXT CHECK (dv = digito_verificador(rut)), ··· ); Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 26. Set-returning Functions (SRF) Funciones que “retornan tablas” En cláusula FROM hacer JOIN con otras tablas otras funciones subconsultas Definir tipo de retorno Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 27. SRF: Ejemplos de uso SELECT * FROM una_srf(arg1, arg2), otra_srf(arg1, arg2) WHERE una_srf.uno = otra_srf.uno SELECT * FROM una_srf(arg1, ···) JOIN otra_srf( ··· ) USING (columna) JOIN una_tabla ON (condicion ···) Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 28. SRF: Ejemplos de uso (cont.) SELECT * FROM una_tabla, una_srf(···), (SELECT tres, cuatro FROM otra_srf(···) WHERE ···) WHERE ··· Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 29. SRF: Tipos de retorno Lo especial de una SRF RETURNS SETOF foo foo puede ser un tipo una tabla una definición anónima Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 30. SRF: Sintaxis para retorno CREATE FUNCTION una_srf (···) RETURNS SETOF tabla ···; SELECT * FROM una_srf (foo, bar, ···); CREATE TYPE foo (a int, b int); CREATE FUNCTION otra_srf (···) RETURNS SETOF foo ···; SELECT * FROM otra_srf(···); CREATE FUNCTION tercera_srf(···) RETURNS SETOF RECORD ···; SELECT * FROM tercera_srf(···) AS tercera(definicion de tipo); Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 31. SRF en plgpsql: sintaxis RETURN NEXT foo acumula la tupla foo para retornar RETURN termina la función y devuelve todas las tuplas retornadas FOR SELECT ··· LOOP ··· RETURN NEXT ··· END LOOP; RETURN; Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 32. Ejemplo 5: SRF en plpgsql Todo el mes en intervalos de 30 minutos DECLARE inicio ALIAS FOR $1; valor TIMESTAMP WITH TIME ZONE; final ALIAS FOR $2; paso ALIAS FOR $3; ret RECORD; Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 33. Ejemplo 5: SRF en plpgsql (cont.) BEGIN valor := inicio; LOOP IF valor >= final THEN RETURN; END IF; SELECT INTO ret valor, valor + paso; RETURN NEXT ret; valor := (valor + paso); END LOOP; END; Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 34. Ejemplo 5: SRF en plpgsql (cont.) SELECT * FROM intervalos (’2003-01-01’, ’2003-01-02’, ’3 hour’) AS foo(inicio TIMESTAMP WITH TIME ZONE, fin TIMESTAMP WITH TIME ZONE); inicio fin 2003-01-01 00:00:00-03 2003-01-01 03:00:00-03 2003-01-01 03:00:00-03 2003-01-01 06:00:00-03 2003-01-01 06:00:00-03 2003-01-01 09:00:00-03 2003-01-01 09:00:00-03 2003-01-01 12:00:00-03 2003-01-01 12:00:00-03 2003-01-01 15:00:00-03 2003-01-01 15:00:00-03 2003-01-01 18:00:00-03 2003-01-01 18:00:00-03 2003-01-01 21:00:00-03 2003-01-01 21:00:00-03 2003-01-02 00:00:00-03 Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 35. Ejemplo 6: SRF en SQL CREATE FUNCTION getfoo(int) RETURNS setof foo AS ’ SELECT * FROM foo WHERE fooid = $1;’ LANGUAGE SQL; SELECT * FROM getfoo(1); Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 36. Privilegios Otorgar privilegios: GRANT Funciones: EXECUTE Lenguajes: USAGE untrusted: sólo usuarios confiables! SECURITY INVOKER normal; permisos del que hace SELECT SECURITY DEFINER equivalente a setuid Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 37. Ejemplo 7: Privilegios CREATE TABLE blah ( ··· ); GRANT SELECT ON TABLE blah TO usuario1; SET SESSION AUTHORIZATION usuario1; CREATE FUNCTION lee_blah AS ’··· /* lee tabla blah */ GRANT EXECUTE ON lee_blah TO usuario2; SET SESSION AUTHORIZATION usuario2; SELECT * FROM blah; Error: permiso denegado SELECT * FROM lee_blah(); puede otorgar una visión restringida puede otorgar privilegios limitados de modificación Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 38. Índices Funcionales Crear un índice siguiendo una función Agiliza consultas que usen la función Función debe ser IMMUTABLE Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 39. Ejemplo 9: Índice Funcional CREATE INDEX indice_func ON tabla date_part(’month’, campo_fecha); SELECT * FROM tabla WHERE date_part(’month’, campo_fecha) = ··· SELECT * FROM tabla WHERE date_part(’month’, campo_fecha) BETWEEN ··· AND ··· Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos
  • 41. ¿Preguntas? Álvaro Herrera Funciones y TriggersIntroducción, Ejemplos