A instrução RAISE é usada para relatar mensagens
e lançar erros.
RAISE [nível] 'formato' [,nível[, ... ]] [ USINGopção{ = | := }expressão[, ... ] ]; RAISE [nível]nome_da_condição[ USINGopção{ = | := }expressão[, ... ] ]; RAISE [nível] SQLSTATE 'sqlstate' [ USINGopção{ = | := }expressão[, ... ] ]; RAISE [nível] USINGopção{ = | := }expressão[, ... ]; RAISE ;
O nível (opcional)
especifica a gravidade do erro.
Os níveis permitidos são DEBUG,
LOG, INFO,
NOTICE, WARNING
e EXCEPTION, sendo este último o padrão.
EXCEPTION levanta um erro
(que normalmente interrompe a transação corrente); os outros níveis
geram apenas mensagens de diferentes níveis de prioridade.
Se as mensagens de uma determinada prioridade são mostradas ao cliente,
escritas no registro de mensagens do servidor, ou ambos, é controlado
pelas variáveis de configuração log_min_messages
e client_min_messages.
Veja Configuração do servidor para obter mais informações.
Na primeira variante da sintaxe, após o
nível se houver,
deve ser escrita a cadeia de caracteres do
formato (que deve ser
uma cadeia de caracteres literal simples, e não uma expressão).
A cadeia de caracteres do formato especifica o texto da mensagem
de erro a ser relatada.
A cadeia de caracteres de formatação pode ser seguida por expressões
de argumento opcionais a serem inseridas na mensagem.
Dentro da cadeia de caracteres de formatação, %
é substituído pela representação em cadeia de caracteres do valor
do próximo argumento opcional.
Deve ser escrito %% para produzir um
% literal.
O número de argumentos deve corresponder ao número de marcadores
de posição % na cadeia de caracteres de
formatação, ou será lançado um erro durante a compilação da função.
Neste exemplo, o valor de v_job_id substituirá
o % na cadeia de caracteres:
RAISE NOTICE 'Chamando cs_create_job(%)', v_job_id;
Na segunda e terceira variantes da sintaxe, o
nome_da_condição e
sqlstate especificam
um nome para a condição de erro ou um código
SQLSTATE de cinco caracteres, respectivamente.
Veja em Códigos de erro do PostgreSQL os nomes de condições de
erro válidos e os códigos SQLSTATE predefinidos.
A seguir estão alguns exemplos de uso de
nome_da_condição e
sqlstate:
RAISE division_by_zero; RAISE WARNING SQLSTATE '22012';
Em qualquer uma dessas variantes de sintaxe, podem ser anexadas
informações adicionais ao relatório de erros escrevendo
USING seguido de itens opção = expressão. Cada
expressão pode ser
qualquer expressão com valor de cadeia de caracteres.
As palavras-chave permitidas para
opção são:
MESSAGE #Define o texto da mensagem de erro. Esta opção não pode ser usada na primeira variante de sintaxe, porque a mensagem já está fornecida.
DETAIL #Fornece uma mensagem detalhada do erro.
HINT #Fornece uma mensagem de dica.
ERRCODE #Especifica o código de erro (SQLSTATE)
a ser relatado, seja pelo nome da condição, conforme mostrado em
Códigos de erro do PostgreSQL, ou diretamente como um
código SQLSTATE de cinco caracteres.
Esta opção não pode ser usada na segunda ou terceira variante
da sintaxe, uma vez que o código de erro já foi fornecido.
COLUMNCONSTRAINTDATATYPETABLESCHEMA #Fornece o nome de um objeto relacionado.
Este exemplo irá abortar a transação com a mensagem de erro e a dica fornecidas:
RAISE EXCEPTION 'Inexistente ID --> %', user_id
USING HINT = 'Por favor, verifique seu ID de usuário.';
Estes dois exemplos mostram maneiras equivalentes de definir o
SQLSTATE:
RAISE 'ID de usuário duplicado: %', user_id USING ERRCODE = 'unique_violation'; RAISE 'ID de usuário duplicado: %', user_id USING ERRCODE = '23505';
Outra forma de produzir o mesmo resultado seria:
RAISE unique_violation USING MESSAGE = 'ID de usuário duplicado: ' || user_id;
Conforme mostrado na quarta variante da sintaxe, também é possível
escrever RAISE USING ou RAISE
e colocar todo o resto na lista nível USINGUSING.
A última variante do RAISE não possui parâmetros.
Esta forma só pode ser usada dentro de uma cláusula
EXCEPTION de um bloco BEGIN;
isto faz com que o erro que está sendo tratado seja relançado.
Antes do PostgreSQL 9.1,
RAISE sem parâmetros era interpretado como
relançamento do erro do bloco contendo o tratador de exceção ativo.
Assim, uma cláusula EXCEPTION aninhada dentro
desse tratador não poderia capturá-la, mesmo se o
RAISE estivesse dentro do bloco da cláusula
EXCEPTION aninhada.
Isto foi considerado surpreendente, além de ser incompatível com o
PL/SQL da Oracle.
Se não for especificado nenhum nome de condição ou
SQLSTATE em um comando
RAISE EXCEPTION, o padrão é usar
raise_exception (P0001).
Se não for especificado nenhum texto de mensagem, o padrão é usar o
nome da condição ou SQLSTATE como texto de mensagem.
Ao especificar um erro pelo código SQLSTATE,
não se está limitado aos códigos de erro predefinidos, podendo
ser escolhido qualquer código de erro composto por cinco dígitos
e/ou letras ASCII maiúsculas, exceto 00000.
É recomendado que se evite lançar códigos de erro que terminem com
três zeros, porque são códigos de categoria, só podendo ser
interceptados interceptando toda a categoria.
A instrução ASSERT é um atalho conveniente para
inserir verificações de depuração em funções escritas em
PL/pgSQL.
ASSERTcondição[ ,mensagem];
A condição é uma
expressão booleana que deve ser sempre avaliada como verdade;
se for, a instrução ASSERT não fará mais nada.
Se o resultado for falso ou nulo, será gerada uma exceção
ASSERT_FAILURE.
(Se ocorrer um erro durante a avaliação da
condição,
será relatado como um erro normal.)
Se for fornecida a mensagem
opcional, ela será uma expressão cujo resultado (se não for nulo)
substituirá o texto da mensagem de erro padrão
“asserção falhou”, no caso da
condição falhar.
A expressão da mensagem
não é avaliada no caso normal onde a asserção é bem-sucedida.
O teste de asserções pode ser ativado ou desativado por meio do
parâmetro de configuração plpgsql.check_asserts,
que recebe um valor booleano; o padrão é on.
Se este parâmetro estiver off, então as instruções
ASSERT não farão nada.
Note que ASSERT destina-se a detectar erros
de programa, e não a relatar condições de erro comuns. Para este fim
deve ser usada a instrução RAISE descrita acima.