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).
Sintaxe

>>-SQLSTATE----------------------------------------------------><
Dentro de um fluxo de mensagens, você poderá acessar e atualizar um recurso de banco
de dados externo utilizando as funções do banco de dados ESQL disponíveis nos nós Compute, Banco de Dados e Filter. 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 broker 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 propriedade, o broker parará
o processamento o nó, propagará a mensagem para o terminal de falha do nó
e gravará os detalhes do erro para a ExceptionList. Se você desejar substituir
o comportamento padrão e manipular um erro do banco de dados no ESQL no nó,
desmarque Emitir Exceção no Erro do Banco de Dados.
O broker 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.
Para tratar os erros de banco de dados em um nó,
você poderá utilizar a função de estado do banco de dados SQLSTATE para receber informações sobre
o 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 dizem o que o broker
estava fazendo no momento em que a exceção ocorreu) são suportadas 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 broker. 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"). A
letra "U" não é utilizada pelo broker como um indicador de origem. Se você desejar
definir um estado de SQL exclusivo em vez de imitar um existente, utilize estados
de SQL que começam com a letra "U". Se você utilizar estados SQL que começam
com a letra "U", poderá gravar um manipulador de erro para corresponder todas
as exceções definidas pelo usuário e emitidas com um operador LIKE'U%'.
- Se a exceção selecionada se originou no transporte da mensagem
ou na própria implementação ESQL, o código SQL, o estado, o erro
nativo e o texto do erro serão conforme descrito posteriormente na lista nesta seção.
- 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. Este curinga continuará capturando o mesmo conjunto de exceções
se exceções não classificadas anteriormente receberem novos estados de 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 = 'S22007'
- O formato data/hora não é válido. Uma cadeia de caracteres utilizada em uma conversão de caractere
para um tipo de data/hora tinha o formato básico errado (por exemplo, '01947-10-24')
ou tinha 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
resultou em um valor além do intervalo suportado.
- 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'
- O valor do caractere designado não é válido.
- SqlState = 'SFN001'
- Uma função SELECT utilizada em um predicado IN retornou mais de uma coluna quando apenas uma coluna
é permitida nesse caso.
- SqlState = 'SPS001'
- O terminal de destino não é válido. Um PROPAGATE para a instrução de terminal tentou
utilizar um nome de terminal inválido.
- SqlState = 'SPS002'
- O rótulo de destino não é válido. Um PROPAGATE para a instrução de rótulo tentou
utilizar um rótulo inválido.
- SqlState = 'SPS003'
- A instrução PROPAGATE não é válida nesse contexto. Em vez disso, use a função RETURN.
- SqlState = 'MQW001', SqlNativeError = 0
- O fluxo de bits não atende os requisitos para as mensagens de WebSphere MQ. Nenhuma tentativa
foi feita para colocá-lo em uma fila. Tentar novamente e a administração da fila
não resolvem este problema.
- SqlState = 'MQW002', SqlNativeError = 0
- Os nomes de fila de destino ou de gerenciador de filas não eram válidos (ou seja, eles
não puderam ser convertidos de Unicode para a página de códigos do gerenciador de filas). Tentar novamente
e o esvaziamento de fila não resolve este problema.
- SqlState = 'MQW003', SqlNativeError = 0
- O modo de pedido foi especificado mas os nomes da fila "reply to" 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 da mensagem). Tentar novamente
e o esvaziamento de fila não resolve este problema.
- SqlState = 'MQW004', SqlNativeError = 0
- O modo de resposta foi especificado mas os nomes da fila ou do gerenciador de filas obtidos da
mensagem não eram válidos (ou seja, eles não puderam ser convertidos da página de códigos
fornecida para Unicode). Tentar novamente
e o esvaziamento de fila não resolve este 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. Tentar novamente e a administração da fila
não resolvem este problema.
- SqlState = 'MQW101', SqlNativeError = returned by WebSphere MQ
- Não foi possível abrir a fila ou o gerenciador de filas de destino. A administração da fila
pode resolver este problema mas tentar novamente não.
- SqlState = 'MQW102', SqlNativeError = returned by WebSphere MQ
- Não foi possível gravar na fila ou no gerenciador de filas destino. Tentar novamente e
a administração de fila podem resolver este 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. Tentar novamente e
a administração de fila podem resolver este 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.