Como usar Áreas SQL Diagnostics

Apesar SQLSTATE

pode dar-lhe algumas informações sobre por que uma instrução específica falhou, a informação é muito breve. Então SQL prevê a captação e retenção de informações de status adicional em áreas de diagnóstico.

As informações de status adicional em uma área de diagnóstico pode ser particularmente útil nos casos em que a execução de uma única instrução SQL gera várias advertências, seguido por um erro. SQLSTATE relata a ocorrência de apenas um erro, mas a área de diagnósticos tem a capacidade de gerar relatórios em vários erros.

A área de diagnóstico é uma estrutura de dados gerenciados pelo SGBD que tem dois componentes:

  • Cabeçalho: O cabeçalho contém informações gerais sobre a instrução SQL mais recente que foi executada.

  • área Detalhe: A área de detalhes contém informações sobre cada código que a instrução gerada.

área de cabeçalho Diagnostics

No conjunto de transação declaração, você pode especificar TAMANHO DIAGNOSTICS. o TAMANHO que você especificar é o número de áreas de detalhe alocados para informações de status. Se você não incluir um TAMANHO DIAGNOSTICS cláusula no seu conjunto de transação declaração, o DBMS atribui seu número padrão de áreas de detalhe.

CamposTipo de dados
NÚMEROnumérico exato com nenhuma parte fracionária
ROW_COUNTnumérico exato com nenhuma parte fracionária
COMMAND_FUNCTIONVARCHAR (Implementação definido maxlength)
COMMAND_FUNCTION_CODEnumérico exato com nenhuma parte fracionária
DYNAMIC_FUNCTIONVARCHAR (Implementação definido maxlength)
DYNAMIC_FUNCTION_CODEnumérico exato com nenhuma parte fracionária
MAISnumérico exato com nenhuma parte fracionária
TRANSACTIONS_COMMITTEDnumérico exato com nenhuma parte fracionária
TRANSACTIONS_ROLLED_BACKnumérico exato com nenhuma parte fracionária
TRANSACTION_ACTIVEnumérico exato com nenhuma parte fracionária

A lista a seguir descreve esses itens em mais detalhes:

  • o NÚMERO campo é o número de áreas de detalhes que foram preenchidos com informações de diagnóstico sobre a exceção atual.

  • o ROW_COUNT campo contém o número de linhas afetadas se a instrução SQL anterior era um INSERIR, ATUALIZAR, ou EXCLUIR.

  • o COMMAND_FUNCTION campo descreve a instrução SQL que acabou de ser executado.

  • o COMMAND_FUNCTION_CODE campo dá o número de código para a instrução SQL que acabou de ser executado. Cada função de comando tem um código numérico associado.

  • o DYNAMIC_FUNCTION campo contém a instrução SQL dinâmica.

  • o DYNAMIC_FUNCTION_CODE campo contém um código numérico correspondente à instrução SQL dinâmica.

  • o MAIS campo pode ser um 'Y' ou um 'N'. 'Y' indica que existem mais registros de status do que a área de detalhes pode conter. 'N' indica que todos os registos de estado geradas estão presentes na área de detalhe. Dependendo de sua aplicação, você pode ser capaz de expandir o número de registros que você pode manipular usando o conjunto de transação declaração.

  • o TRANSACTIONS_COMMITTED campo contém o número de transações que foram cometidos.

  • o TRANSACTIONS_ROLLED_BACK campo contém o número de transações que foram revertidas.

  • o TRANSACTION_ACTIVE campo detém uma '1' se uma transação está ativa e uma '0' de outra forma. A transação é considerada ativa se um cursor estiver aberta ou se o DBMS está à espera de um parâmetro diferido.

área de detalhes Diagnostics

As áreas de detalhes contêm dados sobre cada erro, aviso ou condição individual sucesso.

CamposTipo de dados
CONDITION_NUMBERnumérico exato com nenhuma parte fracionária
RETURNED_SQLSTATECHAR (6)
MENSAGEM DE TEXTOVARCHAR (Implementação definido maxlength)
message_lengthnumérico exato com nenhuma parte fracionária
MESSAGE_OCTET_LENGTHnumérico exato com nenhuma parte fracionária
CLASS_ORIGINVARCHAR (Implementação definido maxlength)
SUBCLASS_ORIGINVARCHAR (Implementação definido maxlength)
connection_nameVARCHAR (Implementação definido maxlength)
NOME DO SERVIDORVARCHAR (Implementação definido maxlength)
CONSTRAINT_CATALOGVARCHAR (Implementação definido maxlength)
CONSTRAINT_SCHEMAVARCHAR (Implementação definido maxlength)
CONSTRAINT_NAMEVARCHAR (Implementação definido maxlength)
CATALOG_NAMEVARCHAR (Implementação definido maxlength)
SCHEMA_NAMEVARCHAR (Implementação definido maxlength)
TABLE_NAMEVARCHAR (Implementação definido maxlength)
COLUMN_NAMEVARCHAR (Implementação definido maxlength)
cursor_nameVARCHAR (Implementação definido maxlength)
CONDITION_IDENTIFIERVARCHAR (Implementação definido maxlength)
PARAMETER_NAMEVARCHAR (Implementação definido maxlength)
PARAMETER_ORDINAL_POSITIONnumérico exato com nenhuma parte fracionária
PARAMETER_MODEnumérico exato com nenhuma parte fracionária
ROUTINE_CATALOGVARCHAR (Implementação definido maxlength)
ROUTINE_SCHEMAVARCHAR (Implementação definido maxlength)
ROUTINE_NAMEVARCHAR (Implementação definido maxlength)
SPECIFIC_NAMEVARCHAR (Implementação definido maxlength)
TRIGGER_CATALOGVARCHAR (Implementação definido maxlength)
TRIGGER_SCHEMAVARCHAR (Implementação definido maxlength)
TRIGGER_NAMEVARCHAR (Implementação definido maxlength)

CONDITION_NUMBER detém o número de série da área de detalhe. Se uma declaração gera cinco itens de estado que enchem-se cinco áreas de detalhe, os CONDITION_NUMBER para a quinta área detalhe é 5. Para recuperar uma área de detalhe específico para exame, use uma GET DIAGNOSTICS declaração com o desejado CONDITION_NUMBER. RETURNED_SQLSTATE detém o SQLSTATE valor que causou esta área de detalhe para ser preenchido.

CLASS_ORIGIN diz a fonte do valor de código de classe retornou em SQLSTATE. Se o padrão SQL define o valor, CLASS_ORIGIN é "ISO 9075". Se sua implementação DBMS define o valor, CLASS_ORIGIN detém uma cadeia que identifica a fonte de seu DBMS. SUBCLASS_ORIGIN diz a fonte do valor de código de subclasse retornou em SQLSTATE.

CLASS_ORIGIN é importante. Se você receber uma SQLSTATE do '22012', os valores indicam que é na gama de padrão SQLSTATEs, então você sabe que significa a mesma coisa em todas as implementações de SQL.

No entanto, se o SQLSTATE é '22500', os dois primeiros são caracteres na gama padrão e indicam uma excepção de dados, mas os últimos três caracteres estão no intervalo definido pela implementação. E se SQLSTATE é '90001', é completamente no intervalo definido pela implementação. SQLSTATE valores no intervalo definido pela implementação pode ter significados diferentes em diferentes implementações, embora o próprio código pode ser o mesmo.

Então, como você descobrir o significado detalhado do '22500' ou o significado de '90001'? Você deve olhar na documentação do implementador. Que implementador?

Para determinar qual deles produzidos a condição de erro, veja CLASS_ORIGIN e SUBCLASS_ORIGIN: Eles têm valores que identificam cada aplicação. Você pode testar a CLASS_ORIGIN e SUBCLASS_ORIGIN para ver se eles identificam implementadores para o qual você tem a SQLSTATE listagens. Os valores reais colocados em CLASS_ORIGIN e SUBCLASS_ORIGIN são implementador-definido, mas eles também são esperados para ser nomes de empresas auto-explicativos.

Se o erro relatado é uma violação de restrição, o CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, e CONSTRAINT_NAME identificar a restrição a ser violados.

menu