La estructura básica de una función es el bloque, que incluye dos partes, la declaración de variables y la sección de sentencias:
declare
sección de variables
begin
sección de sentencias
end;
Sentencia | Descripción |
declare begin end | Bloque |
:= | Asignación |
select into | Asignación desde un select |
Sentencias sql | Cualquier sentencia sql |
perform | Realiza una llamada a comando sql |
execute | Interpreta una cadena como comando sql |
exit | Termina la ejecución de un bloque |
return | Termina la ejecución de una función |
if | Ejecuta sentencias condicionalmente |
loop | Repite la ejecución de un conjunto de sentencias |
while | Repite un conjunto de sentencias mientras |
for | Repite un conjunto de sentencias utilizando una variable de control |
raise | Despliega un mensaje de error a advertencia |
La sentencia de asignación utiliza el operador ‘:=‘ para almacenar los resultados de expresiones en variables. PostgreSQL proporciona otra sentencia para hacer asignaciones, select. Esta sentencia debe obtener como resultado un solo valor para que pueda ser almacenado en la variable:
select into x psugerido from productos where clave = 3;
La ejecución de comandos sql como create, drop, insert o update pueden hacerse sin ninguna sintaxis especial. La excepción es el comando select, que requiere ejecutarse con el comando perform a fin de que el resultado de la consulta sea descartado.
perform select psugerido from productos;
La sentencia execute también ejecuta un comando sql pero a partir de una cadena de texto. Esta sentencia comporta el problema de que su sintaxis no se verifica hasta la ejecución. Se puede utilizar, por ejemplo, para procesar parámetros como comandos sql:
execute $1
El comando exit termina la ejecución de un bloque. Se utiliza principalmente para romper ciclos.
La bifurcación, o ejecución condicional, se realiza mediante la sentencia if:
if ( $1 > 0 ) then
resultado := `Positivo´;
else
resultado := `Negativo´;
end if;
También puede utilizarse if con más de dos ramas:
if ( $1 > 0 ) then
resultado := `Positivo´;
elsif ( $1 < 0 ) then
resultado := `Negativo´;
else
resultado := `Cero´;
end if;
Con referencia a los bucles, PL/pgSQL ofrece tres opciones:
• El bucle loop es infinito, por lo que tiene una estructura muy simple. Por lo general se utiliza con alguna sentencia if para terminarlo:
cont := 0;
loop
if ( cont = 10 )
then exit;
end if;
-- alguna acción
cont := cont + 1;
end loop;
• El bucle while incluye la condición al inicio del mismo, por lo que el control de su terminación es más claro:
cont := 0;
while cont != 10 loop
-- alguna acción
cont := cont + 1;
end loop;
• El bucle for permite realizar un número de iteraciones controladas por la variable del ciclo:
for cont in 1 .. 10 loop
-- alguna acción
end loop;
La sentencia raise permite enviar mensajes de tres niveles de severidad:
• debug. El mensaje se escribe en la bitácora del sistema (logs).
• notice. El mensaje se escribe en la bitácora y en el cliente psql.
• exception . El mensaje se escribe en la bitácora y aborta la transacción.
El mensaje puede incluir valores de variables mediante el carácter ‘ %’:
• raise debug ‘funcion(): ejecutada con éxito;
• raise notice ‘El valor % se tomo por omisión’, variable;
• raise excepción ‘El valor % está fuera del rango permitido’, variable;