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.
Campos | Tipo de dados |
---|---|
NÚMERO | numérico exato com nenhuma parte fracionária |
ROW_COUNT | numérico exato com nenhuma parte fracionária |
COMMAND_FUNCTION | VARCHAR (Implementação definido maxlength) |
COMMAND_FUNCTION_CODE | numérico exato com nenhuma parte fracionária |
DYNAMIC_FUNCTION | VARCHAR (Implementação definido maxlength) |
DYNAMIC_FUNCTION_CODE | numérico exato com nenhuma parte fracionária |
MAIS | numérico exato com nenhuma parte fracionária |
TRANSACTIONS_COMMITTED | numérico exato com nenhuma parte fracionária |
TRANSACTIONS_ROLLED_BACK | numérico exato com nenhuma parte fracionária |
TRANSACTION_ACTIVE | numé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.
Campos | Tipo de dados |
---|---|
CONDITION_NUMBER | numérico exato com nenhuma parte fracionária |
RETURNED_SQLSTATE | CHAR (6) |
MENSAGEM DE TEXTO | VARCHAR (Implementação definido maxlength) |
message_length | numérico exato com nenhuma parte fracionária |
MESSAGE_OCTET_LENGTH | numérico exato com nenhuma parte fracionária |
CLASS_ORIGIN | VARCHAR (Implementação definido maxlength) |
SUBCLASS_ORIGIN | VARCHAR (Implementação definido maxlength) |
connection_name | VARCHAR (Implementação definido maxlength) |
NOME DO SERVIDOR | VARCHAR (Implementação definido maxlength) |
CONSTRAINT_CATALOG | VARCHAR (Implementação definido maxlength) |
CONSTRAINT_SCHEMA | VARCHAR (Implementação definido maxlength) |
CONSTRAINT_NAME | VARCHAR (Implementação definido maxlength) |
CATALOG_NAME | VARCHAR (Implementação definido maxlength) |
SCHEMA_NAME | VARCHAR (Implementação definido maxlength) |
TABLE_NAME | VARCHAR (Implementação definido maxlength) |
COLUMN_NAME | VARCHAR (Implementação definido maxlength) |
cursor_name | VARCHAR (Implementação definido maxlength) |
CONDITION_IDENTIFIER | VARCHAR (Implementação definido maxlength) |
PARAMETER_NAME | VARCHAR (Implementação definido maxlength) |
PARAMETER_ORDINAL_POSITION | numérico exato com nenhuma parte fracionária |
PARAMETER_MODE | numérico exato com nenhuma parte fracionária |
ROUTINE_CATALOG | VARCHAR (Implementação definido maxlength) |
ROUTINE_SCHEMA | VARCHAR (Implementação definido maxlength) |
ROUTINE_NAME | VARCHAR (Implementação definido maxlength) |
SPECIFIC_NAME | VARCHAR (Implementação definido maxlength) |
TRIGGER_CATALOG | VARCHAR (Implementação definido maxlength) |
TRIGGER_SCHEMA | VARCHAR (Implementação definido maxlength) |
TRIGGER_NAME | VARCHAR (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.