6.3. Sentencias

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;