Está en la página 1de 45

Sesión 10

Variables

Mtro. Anastacio Rodríguez García

Universidad Tecnológica del Norte de Guanajuato

4 de junio de 2020
Resumen

Trabajaremos con varias técnicas para declarar

variables en PL/pgSQL.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte 4dedeGuanajuato)
junio de 2020 2 / 45
Variables en PL/pgSQL

Es un nombre signicativo para una

localización de memoria.

Contiene un valor que puede cambiar a lo

largo del bloque o la función.

Es asociada con un tipo de dato en

particular.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte 4dedeGuanajuato)
junio de 2020 3 / 45
Declaración de variables

Antes de usarla hay que declararla en la

sección de declaraciones del bloque.

Sintaxis para declarar una variable:

variable_name data_type [:= expression];

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte 4dedeGuanajuato)
junio de 2020 4 / 45
Identicador de la variable

Primero se especica el nombre de la

variable.

Una buena práctica es asignarle un nombre

signicativo a la variable: En vez de nombrar

i deberíamos nombrar index o counter.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte 4dedeGuanajuato)
junio de 2020 5 / 45
Tipo de dato

Después asociar un tipo de dato especíco

con la variable.

Los tipos de datos que se pueden utilizar

son todos los validos para Postgres como:

INTEGER, NUMERIC, VARCHAR Y CHAR.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte 4dedeGuanajuato)
junio de 2020 6 / 45
Asignación de un valor

Opcionalmente asignaremos un valor por

defecto a la variable.

Si no se le asigna un valor inicial será

inicializada en NULL.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte 4dedeGuanajuato)
junio de 2020 7 / 45
Ejemplo de declaración de variables
DO $$
DECLARE
counter INTEGER := 1;
rst_name VARCHAR(50) := 'John';
last_name VARCHAR(50) := 'Doe';
payment NUMERIC(11,2) := 20.5;
BEGIN
RAISE NOTICE ' % % % has been paid % USD',
counter, rst_name, last_name, payment;
END $$;
Mtro. Anastacio Rodríguez García (Universidad
Sesión
Tecnológica
10 del Norte 4dedeGuanajuato)
junio de 2020 8 / 45
Explicación
La variable counter es entera y es
inicializada en 1.

Las variables rst_name y last_name

son cadenas de caracteres de longitud

variable ( VARCHAR) inicializadas en


John y Doe.
Payment es numérica de 2 decimales
inicializadas en 20.5.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte 4dedeGuanajuato)
junio de 2020 9 / 45
Valores por defecto
Observa que postgreSQL evalúa los valores por

default y se los coloca a las variables cuando

entra el bloque.
DO $$
DECLARE
created_at time := NOW();
BEGIN
RAISE NOTICE ' %', created_at;
PERFORM pg_sleep(10); RAISE NOTICE ' %',
created_at;
END $$;
Mtro. Anastacio Rodríguez García (Universidad
Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 10 / 45
Salida

1 Declara una variable cuyo valor por defecto

es inicializado con la hora actual.

2 Imprime el valor de la variable y pausa la

ejecución en 10 segundos.

3 Imprime el valor de la variable create_at

nuevamente.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 11 / 45
Como se muestra claramente en la salida el valor

de create_at solo se inicializa una vez cuando se

esta dentro del bloque.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 12 / 45
Copiando tipos de datos

PostgreSQL te permite denir una variable

con un tipo de dato que hace referencia al

tipo de dato de la columna de la tabla o del

tipo de dato de otra variable:

variable_name table_name.column_name %TYPE;

variable_name variable %TYPE;

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 13 / 45
Ejemplo

Puedes denir una variable llamada

city_name con el mismo tipo de dato


que la columna name de la tabla city

city_name city.name%TYPE := 'San


Francisco';

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 14 / 45
Ventajas

1 No necesitas cuidar los tipos de datos de la

columna.

2 No necesitas cambiar la declaración de la

variable en las funciones para adaptar a los

nuevos cambios.

3 Puedes crear funciones polimórcas.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 15 / 45
Alias
PostgreSQL te permite asignarle alias a

cualquier variable:

new_name ALIAS FOR old_name;


Los alias son usados principalmente en los

procedimientos disparadores.

Asignan nombres mas signicativos a las

variables que tienen nombres

predeterminados, ejemplo: NEW o OLD.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 16 / 45
Constantes

A diferencia de las variables, los valores de

constantes no cambian una vez que son

inicializados

Las constantes hacen el código más legible.

selling_price = net_price + net_price * 0.1;

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 17 / 45
Razones de uso
¾Qué signica 0.1?

Puede ser interpretado como cualquier cosa.

selling_price = net_price + net_price * VAT;


Precio de venta = al precio neto + 10 % de

impuesto

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 18 / 45
Razones de uso
Reduce los esfuerzos de mantenimiento.

Benecia nombrar una constante cuando

usa múltiples veces a lo largo de la función.

Cambiarás solamente una vez el valor donde

la declararas e inicializas.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 19 / 45
Sintaxis para declarar constantes

constant_name CONSTANT data_type := expression;

1 Especica el nombre, por convención en

mayúsculas.

2 Escribes la palabra clave CONSTANT y el

tipo de dato asociado.

3 Inicializa el valor de la constante.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 20 / 45
Ejemplo de constante
DO $$
DECLARE
VAT CONSTANT NUMERIC := 0.1;
net_price NUMERIC := 20.5;
BEGIN
RAISE NOTICE 'The selling price is %', net_price * (
1 + VAT );
END $$;

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 21 / 45
¾Reasignar valor a constante?
DO $$
DECLARE
VAT CONSTANT NUMERIC := 0.1;
net_price NUMERIC := 20.5;
BEGIN
RAISE NOTICE 'The selling price is %', net_price * (
1 + VAT );
VAT := 0.05;
END $$;

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 22 / 45
DO $$
DECLARE
start_at CONSTANT time := now();
BEGIN
RAISE NOTICE 'Start executing block at %', start_at;
END $$;

PostgreSQL evalua la función NOW() cada que

llamamos el bloque osea en tiempo de ejecución.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 23 / 45
Mensajes y errores en PL/pgSQL

Para mandar mensajes de reporte y errores

utilizamos la instrucción RAISE.

RAISE level format;

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 24 / 45
RAISE - level
Niveles de severidad de errores
DEBUG

LOG

NOTICE

INFO

WARNING

EXCEPTION

Por defecto será EXCEPTION

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 25 / 45
RAISE - format

Es una cadena que especíca un mensaje.

Usa % que marca donde se sustituirá por

algún argumento proporcionado.

Los % deben de coincidir con el número de

argumentos, si no marcara error la

instrucción.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 26 / 45
Ejemplo

Para mandar mensajes de reporte y errores

utilizamos la instrucción RAISE.


DO $$
BEGIN
RAISE INFO 'information message %', now() ;
RAISE LOG 'log message %', now();
RAISE DEBUG 'debug message %', now();
RAISE WARNING 'warning message %', now();
RAISE NOTICE 'notice message %', now();
END $$;

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 27 / 45
Salida - RAISE

Figura: Salida del bloque con instrucciones RAISE.

No todos los mensajes son reportados al cliente, solo NOTICE, INFO,

WARNING. Esto lo controlan los parámetros de conguración

client_min_messages y log_min_message

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 28 / 45
Levantamiento de errores
Para generar mensajes de error se usa el nivel
EXCEPTION, por defecto RAISE lo tiene.
USING option = expression
Clausulas de RAISE
MESSAGE: Coloca el texto del mensaje de error.
HINT: proporciona un indicio de la causa raíz del error.
DETAIL: Da la info detallada del error.
ERRCODE: Identica el código del error 5 caracteres.

SQLSTATE code: Código de error SQL.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 29 / 45
Ejemplo Mensaje de error
DO $$
DECLARE
email varchar(255) := 'email@example.com';
BEGIN
 check email for duplicate
 ...
 report duplicate email
RAISE EXCEPTION 'Duplicate email: %', email
USING HINT = 'Check the email again';

END $$;

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 30 / 45
SQLSTATE

Los siguientes ejemplos ilustran cómo generar un

SQLSTATE y su condición correspondiente:

DO $$
DO $$
BEGIN
BEGIN
...
...
RAISE
RAISE SQLSTATE '2210B';
invalid_regular_expression;
END $$;
END $$;

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 31 / 45
Depuración usando ASSERT

La instrucción ASSERT esta disponible

desde la versión 9.5

En las funciones grandes es muy difícil

detectar errores.

Para facilitar la detección se usa la

instrucción ASSERT agregando

vericaciones de depuración.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 32 / 45
Sintaxis ASSERT

ASSERT condition [, message];


La condición es una expresión booleana.

Si la condición evalúa TRUE, la instrucción

ASSERT no hará nada.

Si la condición evalúa FALSE o NULL, se

genera ASSERT_FAILURE.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 33 / 45
Mensaje

Si no proporcionas un mensaje, PL usa

assertion failed por defecto.

Al proporcionar un mensaje, será sustituido

el mensaje por defecto.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 34 / 45
Mensaje

Si no proporcionas un mensaje, PL usa

assertion failed por defecto.

Al proporcionar un mensaje, será sustituido

el mensaje por defecto.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 35 / 45
Ejemplo mensaje ASSERT
DO $$
DECLARE
counter integer := -1;
BEGIN
ASSERT counter = 0, 'Expect
counter starts with 0';
END $$;
Las instrucciones ASSERT para depuración

solamente.
Mtro. Anastacio Rodríguez García (Universidad
Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 36 / 45
Creando una función
SINTAXIS
CREATE FUNCTION function_name (p1
type, p2 type)

RETURNS type AS
BEGIN
- - logic

END;
LANGUAGE language_name;

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 37 / 45
Detalle de CREATE FUNTION

Especica el nombre de la función después

de CREATE FUNCTION.

Poner la lista de parámetros separado por

comas dentro de parentesis seguido del

nombre de la función.

Especica el tipo de retorno de la función

después de la palabra RETURN.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 38 / 45
Detalle de CREATE FUNTION (2)

Coloca el código de la función dentro del

bloque BEGIN Y END.

La función siempre termina con punto y

coma (;) seguida de la palabra END.

Indica el lenguaje de procedimiento de la

función por ejemplo: plpgsql.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 39 / 45
Ejemplo
Creando la función inc
CREATE FUNCTION inc(val
integer) RETURNS integer AS $$

BEGIN
RETURN val + 1;
END; $$
LANGUAGE PLPGSQL;

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 40 / 45
Creando la función desde pgAdmin

Ir Schemas -> Functions

Figura: En la base de datos examples en pgadmin crea


una nueva función.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 41 / 45
Nombre de la función
Pestaña General

Figura: En el cuadro de dialogo en la pestaña general


coloca el nombre.
Mtro. Anastacio Rodríguez García (Universidad
Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 42 / 45
Agregando código
Pestaña Denición

Figura: (2)Agrega el tipo de retorno de la funcion (3)


Lenguaje PL y (4) Código.
Mtro. Anastacio Rodríguez García (Universidad
Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 43 / 45
Concluyendo denición
Pestaña SQL

Figura: Visualizando el código la denición de la función


completo.
Mtro. Anastacio Rodríguez García (Universidad
Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 44 / 45
Concluyendo denición

Pestaña SQL

Figura: Probando la función

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
10 del Norte4 de
de Guanajuato)
junio de 2020 45 / 45

También podría gustarte