SQLSTATE é uma função de estado do banco de dados que retorna um tipo de dados CHARACTER de 5 caracteres com um valor padrão de
'00000' (cinco zeros em uma cadeia).
Em um fluxo de mensagens, você pode acessar e atualizar um recurso do banco
de dados externo utilizando as funções de banco de dados ESQL disponíveis nos
nós Filter, Database e Compute.
Ao efetuar chamadas para um banco de dados externo, você poderá obter erros, como
uma tabela não existe, um banco de dados não está disponível ou
uma inserção de uma chave que já existe.
Quando ocorrerem estes erros, a ação padrão do intermediário será gerar uma exceção.
Esse comportamento é determinado de acordo com a definição da
propriedade Emitir exceção em
caso de erro do banco de dados. Se você selecionar esta caixa de opções, o intermediário
interromperá o processamento do nó, propagará a mensagem para o terminal de falhas do nó
e gravará os detalhes do erro em ExceptionList. Se desejar substituir
o comportamento padrão e manipular um erro do banco de dados no ESQL
no nó, limpe a caixa de opções
Emitir exceção em caso de erro do
banco de dados. O intermediário não emite uma exceção e será necessário
incluir a instrução THROW para emitir uma exceção caso um determinado código de estado SQL não seja esperado. Consulte Instrução THROW para obter uma descrição de THROW.
Se você escolher tratar erros de banco de dados em um nó, poderá utilizar a função de estado de banco de dados SQLSTATE para receber informações sobre o status da chamada DBMS
feita em ESQL. Você poderá incluí-la em instruções condicionais no ESQL do nó atual
para que ele reconheça e lide com possíveis erros.
Estados de SQL
Em
ESQL, os estados de SQL são cadeias de caracteres de comprimento variável. Por convenção,
eles são compostos de seis caracteres, somente de 0 a 9 e de A a Z. O significado
dos seis caracteres é:
- Caractere 1
- A origem da exceção
- Caracteres 2 - 3
- A classe da exceção
- Caracteres 4 - 6
- A subclasse da exceção
O estado SQL de uma expressão é determinado por um processo
de dois estágios. No primeiro estágio, as informações da exceção são examinadas
e quaisquer exceções de agrupamento (ou seja, informações que indicam o que o intermediário
estava fazendo no momento em que ocorreu a exceção) são percorridas até que a exceção
que descreve o erro original seja localizada.
O
segundo estágio é
o seguinte:
- Se a exceção selecionada for uma exceção de banco de dados, o estado SQL será
aquele fornecido pelo banco de dados, mas prefixado pela letra "D" para evitar
qualquer confusão com exceções que surgirem no intermediário. O código SQL, erro nativo
e texto do erro são aqueles fornecidos pelo banco de dados.
- Se a exceção selecionada for uma exceção do usuário (ou seja, originada em uma
instrução THROW), o código SQL, estado, erro nativo e texto do erro serão extraídos,
em ordem, das quatro primeiras inserções da exceção. O valor do estado resultante é
extraído no estado em que se encontra (não prefixado por uma letra como "U"). De
fato, a letra "U" não é utilizada pelo intermediário como um indicador de origem.
Se quiser definir um estado SQL exclusivo em vez de imitar um existente, utilize os estados SQL iniciados com a letra "U". Utilizar estados SQL iniciados com a letra "U" permite que um manipulador corresponda todas as exceções definidas pelo usuário e emitidas com um operador LIKE’U%’.
- Se a exceção selecionada originou-se do transporte da mensagem ou da própria
implementação do ESQL, o código SQL, estado, erro nativo e texto do erro
aparecerão conforme descrito na lista a seguir.
- Para todas as outras exceções, o estado SQL é '', indicando sem origem, sem
classe e sem subclasse.
Algumas exceções que fornecem atualmente um estado SQL vazio podem fornecer
estados individuais em releases futuros. Se deseja capturar exceções não classificadas,
utilize o curinga "todos" ("%") para o estado SQL
no último manipulador de um escopo. Isso continuará a captura do mesmo
conjunto de exceções, se exceções não classificadas anteriormente receberem novos
estados SQL exclusivos.
Os seguintes estados SQL são definidos:
- Dddddd
- ddddd é o estado retornado pelo banco de dados.
- SqlState = ‘S22003'
- Estouro aritmético. Uma operação cujo resultado é um tipo numérico que resultou
em um valor acima do intervalo suportado.
- SqlState = ‘S22004’
- Valor nulo não permitido. Um valor nulo estava presente em um local em que
valores nulos não são permitidos.
- SqlState = ‘S22007’
- Formato inválido de data e hora. Uma cadeia de caracteres utilizada em uma coerção
de caractere para um tipo de data/hora obteve o formato básico incorreto (por exemplo, '01947-10-24')
ou obteve valores fora dos intervalos permitidos pelo calendário Gregoriano (por exemplo,
'1947-21-24').
- SqlState = ‘S22008’
- Estouro do campo de data e hora. Uma operação cujo resultado é um tipo de data/hora
que resultou em um valor acima do intervalo suportado.
- SqlState = ‘S22011’
- Erro de SUBSTRING. Os parâmetros FROM e FOR, em conjunto com o
comprimento do primeiro operando, violam as regras da função SUBSTRING.
- SqlState = ‘S22012’
- Divisão por zero. Uma operação de divisão cujo tipo de dados do resultado não possui
conceito de infinidade obteve um operando zero à direita.
- SqlState = ‘S22015’
- Estouro de campo de intervalo. Uma operação cujo resultado é do tipo INTERVAL
resultou em um valor acima do intervalo suportado pelo tipo de dados INTERVAL.
- SqlState = ‘S22018’
- Valor de caractere inválido para coerção.
- SqlState = ‘SPS001’
- Terminal de destino inválido. Um PROPAGATE para a instrução de terminal tentou
utilizar um nome de terminal inválido.
- SqlState = ‘SPS002’
- Rótulo de destino inválido. Um PROPAGATE para a instrução de rótulo tentou
utilizar um rótulo inválido.
- SqlState = 'MQW001', SqlNativeError = 0
- O fluxo de bits não atende aos requisitos de mensagens do MQ. Nenhuma tentativa
foi feita para colocá-lo em uma fila. Uma nova tentativa e a administração da fila
não conseguirão resolver esse problema.
- SqlState = 'MQW002', SqlNativeError = 0
- Os nomes da fila de destino ou do gerenciador de filas não eram válidos (ou seja,
não puderam ser convertidos de unicode para a página de códigos do gerenciador de filas). Uma nova tentativa e o esvaziamento da fila
não conseguirão resolver esse problema.
- SqlState = 'MQW003', SqlNativeError = 0
- O modo de pedido foi especificado, mas os nomes da fila de "resposta" ou
do gerenciador de filas não eram válidos (isto é, não puderam ser convertidos de unicode
para a página de códigos da mensagem). Uma nova tentativa e o esvaziamento da fila
não conseguirão resolver esse problema.
- SqlState = 'MQW004', SqlNativeError = 0
- O modo de resposta foi especificado, mas os nomes da fila ou do gerenciador de filas
extraídos da mensagem não eram válidos (ou seja, não puderam ser convertidos da
página de códigos especificada para unicode). Uma nova tentativa e o esvaziamento da fila
não conseguirão resolver esse problema.
- SqlState = 'MQW005', SqlNativeError = 0
- O modo de lista de destino foi especificado, mas a lista de destino fornecida
não atende aos requisitos básicos de listas de destino. Nenhuma tentativa
foi feita para colocar a mensagem em uma fila. Uma nova tentativa e a administração da fila
não conseguirão resolver esse problema.
- SqlState = 'MQW101', SqlNativeError = As returned by MQ
- Não foi possível abrir a fila ou o gerenciador de filas de destino. É provável que a
administração da fila consiga resolver esse problema, mas uma nova tentativa não obterá êxito.
- SqlState = 'MQW102', SqlNativeError = as returned by MQ
- Não foi possível gravar na fila ou no gerenciador de filas destino. É provável que uma
nova tentativa e a administração da fila consigam resolver esse problema.
- SqlState = 'MQW201', SqlNativeError = número de destinos com um erro
- Ocorreu mais de um erro ao processar uma lista de destino. A mensagem
pode ter sido colocada em zero ou mais filas. É provável que uma
nova tentativa e a administração da fila consigam resolver esse problema.
- Qualquer coisa que o usuário tenha utilizado em uma instrução THROW
- Utilize Uuuuuuu para as exceções do usuário, a menos que esteja imitando uma das exceções definidas acima.
- Cadeia vazia
- Todos os outros erros.