Utiliza la instrucción RAISE para reportar mensajes y lanzar errores.
RAISE [level] 'format' [,expression[, ... ]] [ USINGoption{ = | := }expression[, ... ] ]; RAISE [level]condition_name[ USINGoption{ = | := }expression[, ... ] ]; RAISE [level] SQLSTATE 'sqlstate' [ USINGoption{ = | := }expression[, ... ] ]; RAISE [level] USINGoption{ = | := }expression[, ... ]; RAISE ;
La opción level especifica la severidad del error.
Los niveles permitidos son DEBUG, LOG, INFO,
NOTICE, WARNING y EXCEPTION, siendo
EXCEPTION el valor por defecto. EXCEPTION lanza un error
(lo que normalmente aborta la transacción actual); los otros niveles solo generan mensajes
de diferentes niveles de prioridad.
Si los mensajes de una prioridad particular se reportan al cliente, se escriben en el registro
del servidor o ambos, se controla mediante las variables de configuración
log_min_messages y client_min_messages.
Consulta la Chapter 19 para obtener más información.
En la primera variante de sintaxis, después del level si existe,
escribe una cadena de format (que debe ser un literal de
cadena simple, no una expresión). La cadena de formato especifica el texto del mensaje de error
a reportar. La cadena de formato puede ir seguida de expresiones de argumentos opcionales que se insertarán
en el mensaje. Dentro de la cadena de formato, % se reemplaza por la representación
en cadena del valor del siguiente argumento opcional. Escribe %% para emitir un
carácter % literal. El número de argumentos debe coincidir con el número de
marcadores de posición % en la cadena de formato, o se lanzará un error durante
la compilación de la función.
En este ejemplo, el valor de v_job_id reemplazará al % en la cadena:
RAISE NOTICE 'Calling cs_create_job(%)', v_job_id;
En la segunda y tercera variantes de sintaxis, condition_name
y sqlstate especifican un nombre de condición de error o
un código SQLSTATE de cinco caracteres, respectivamente. Consulta el Appendix A
para conocer los nombres de condiciones de error válidos y los códigos SQLSTATE predefinidos.
Aquí tienes ejemplos de uso de condition_name y
sqlstate:
RAISE division_by_zero; RAISE WARNING SQLSTATE '22012';
En cualquiera de estas variantes de sintaxis, puedes adjuntar información adicional al reporte de error
escribiendo USING seguido de elementos option =
expression. Cada expression
puede ser cualquier expresión con valor de cadena. Las palabras clave permitidas para
option son:
MESSAGE #Establece el texto del mensaje de error. Esta opción no se puede utilizar en la primera variante de sintaxis, ya que el mensaje ya está suministrado.
DETAIL #Suministra un mensaje de detalle del error.
HINT #Suministra un mensaje de sugerencia (hint).
ERRCODE #Especifica el código de error (SQLSTATE) a reportar, ya sea por el nombre de la condición, como se muestra en Appendix A, o directamente como un código SQLSTATE de cinco caracteres. Esta opción no se puede utilizar en la segunda o tercera variante de sintaxis, ya que el código de error ya está suministrado.
COLUMNCONSTRAINTDATATYPETABLESCHEMA #Suministra el nombre de un objeto relacionado.
Este ejemplo abortará la transacción con el mensaje de error y la sugerencia dados:
RAISE EXCEPTION 'Nonexistent ID --> %', user_id
USING HINT = 'Please check your user ID';
Estos dos ejemplos muestran formas equivalentes de establecer el SQLSTATE:
RAISE 'Duplicate user ID: %', user_id USING ERRCODE = 'unique_violation'; RAISE 'Duplicate user ID: %', user_id USING ERRCODE = '23505';
Otra forma de producir el mismo resultado es:
RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;
Como se muestra en la cuarta variante de sintaxis, también es posible
escribir RAISE USING o RAISE
y poner
todo lo demás en la lista level USINGUSING.
La última variante de RAISE no tiene ningún parámetro.
Esta forma solo se puede utilizar dentro de la cláusula EXCEPTION
de un bloque BEGIN; provoca que el error que se está manejando
actualmente se vuelva a lanzar (re-thrown).
Antes de PostgreSQL 9.1, RAISE sin
parámetros se interpretaba como volver a lanzar el error del bloque que contenía
el manejador de excepciones activo. Por lo tanto, una cláusula EXCEPTION
anidada dentro de ese manejador no podía capturarlo, incluso si el RAISE
estaba dentro del bloque de la cláusula EXCEPTION anidada. Esto se consideró
sorprendente, además de ser incompatible con el PL/SQL de Oracle.
Si no se especifica ningún nombre de condición ni SQLSTATE en un comando
RAISE EXCEPTION, el valor por defecto es utilizar
raise_exception (P0001).
Si no se especifica ningún texto de mensaje, el valor por defecto es utilizar el nombre
de la condición o SQLSTATE como texto del mensaje.
Al especificar un código de error mediante un código SQLSTATE, no estás
limitado a los códigos de error predefinidos, sino que puedes seleccionar cualquier
código de error que conste de cinco dígitos y/o letras ASCII mayúsculas,
diferente de 00000. Se recomienda evitar lanzar códigos de error
que terminen en tres ceros, porque estos son códigos de categoría y solo se pueden
capturar capturando la categoría completa.
La instrucción ASSERT es un atajo conveniente para
insertar comprobaciones de depuración en funciones PL/pgSQL.
ASSERTcondition[ ,message];
La condition es una expresión booleana
que se espera que siempre se evalúe como verdadera; si lo hace, la instrucción
ASSERT no hace nada más. Si el resultado es falso o nulo, se lanza
una excepción ASSERT_FAILURE. (Si ocurre un error al evaluar
la condition, se reporta como un error normal).
Si se proporciona el parámetro opcional message,
es una expresión cuyo resultado (si no es nulo) reemplaza al texto del mensaje de error
por defecto “assertion failed”, en caso de que falle la
condition. La expresión
message no se evalúa en el caso normal
donde la aserción tiene éxito.
La comprobación de aserciones se puede activar o desactivar mediante el parámetro de
configuración plpgsql.check_asserts, que toma un valor booleano;
el valor por defecto es on. Si este parámetro es off,
entonces las instrucciones ASSERT no hacen nada.
Ten en cuenta que ASSERT está pensado para detectar errores de programa (bugs),
no para reportar condiciones de error ordinarias. Utiliza la instrucción RAISE,
descrita anteriormente, para ese propósito.