Forum Stats

  • 3,770,452 Users
  • 2,253,116 Discussions
  • 7,875,461 Comments

Discussions

Mensagem personalizada durante a validação de uma constraint unique? Tornando a mensagem mais amigáv

Couto
Couto Member Posts: 3
edited Dec 27, 2018 8:02AM in SQL and PL/SQL (Portuguese)

Bom dia.

Tenho uma constraint para validar se já há em um determinado campo da minha tabela o valor digitado durante a inclusão de um novo registro.

A constraint válida os dados porém retorna o erro padrão do oracle "ORA-00001: restrição exclusiva (SANKHYA.TCSPAP_U01) violada".
Gostaria de saber se há alguma possibilidade de retornar uma mensagem mais amigável para o usuário utilizando a constraint como validador de dados.

Obrigado.

Best Answer

  • J.Laurindo Chiappa
    J.Laurindo Chiappa Member Posts: 28
    edited Dec 26, 2018 7:53AM Accepted Answer

    Bom dia : na linguagem SQL não há como, ela não dispõe de nenhuma forma de tratamento customizado de erros...

    A única maneira de se fazer isso é executar o comando INSERT a partir de um programa que esteja preparado para capturar o código de erro e exibir uma mensagem customizada : praticamente TODAS as linguagens de programação que se comunicam com o RDBMS Oracle são capazes de fazer isso...

    Por exemplo,  em java se usaria algo tal como :

    ...

    public static final int UNIQUE_CONSTRAINT_VIOLATION = 1;

    ...

    try

    {

    INSERT em questão....

    }

    catch(SQLException exception)

    {

    if(UNIQUE_CONSTRAINT_VIOLATION == exception.getErrorCode())

    {

    ... Apresentar a mensagem Customizada Desejada ....

    }

    else

    ... continua o programa ....

    e em .NET por exemplo poderia se usar algo como :

    ...

    catch (Exception exp)

                {

                    if (exp.Message.Contains("ora-00001"))

                    {

                        throw new Exception("Cannot insert duplicate value to XXX column!");

                    }

                }

    ...

    mas sempre um programa externo à linguagem SQL, vc TEM que encapsular os comandos SQL numa linguagem outra para obter error handling mais detalhado... Um exemplo em PL/SQL :

    ==> diretamente em SQL não tem como :

    HR:@XE:SQL>insert into DEPARTMENTS values(10, 'teste', null, null);

    insert into DEPARTMENTS values(10, 'teste', null, null)

    *

    ERRO na linha 1:

    ORA-00001: restrição exclusiva (HR.DEPT_ID_PK) violada

    ==> encapsulando num PL/SQL :

    HR:@XE:SQL>BEGIN

      2  INSERT INTO DEPARTMENTS values(10, 'teste', null, null);

      3  EXCEPTION

      4     WHEN DUP_VAL_ON_INDEX then

      5        RAISE_APPLICATION_ERROR(-20001, 'Não foi possível inserir, Depto já existe!!');

      6  END;

      7  /

    BEGIN

    *

    ERRO na linha 1:

    ORA-20001: Não foi possível inserir, Depto já existe!!

    ORA-06512: em line 5

    HR:@XE:SQL>

    dentro da sua aplicação OU dentro de um

Answers

  • J.Laurindo Chiappa
    J.Laurindo Chiappa Member Posts: 28
    edited Dec 26, 2018 7:53AM Accepted Answer

    Bom dia : na linguagem SQL não há como, ela não dispõe de nenhuma forma de tratamento customizado de erros...

    A única maneira de se fazer isso é executar o comando INSERT a partir de um programa que esteja preparado para capturar o código de erro e exibir uma mensagem customizada : praticamente TODAS as linguagens de programação que se comunicam com o RDBMS Oracle são capazes de fazer isso...

    Por exemplo,  em java se usaria algo tal como :

    ...

    public static final int UNIQUE_CONSTRAINT_VIOLATION = 1;

    ...

    try

    {

    INSERT em questão....

    }

    catch(SQLException exception)

    {

    if(UNIQUE_CONSTRAINT_VIOLATION == exception.getErrorCode())

    {

    ... Apresentar a mensagem Customizada Desejada ....

    }

    else

    ... continua o programa ....

    e em .NET por exemplo poderia se usar algo como :

    ...

    catch (Exception exp)

                {

                    if (exp.Message.Contains("ora-00001"))

                    {

                        throw new Exception("Cannot insert duplicate value to XXX column!");

                    }

                }

    ...

    mas sempre um programa externo à linguagem SQL, vc TEM que encapsular os comandos SQL numa linguagem outra para obter error handling mais detalhado... Um exemplo em PL/SQL :

    ==> diretamente em SQL não tem como :

    HR:@XE:SQL>insert into DEPARTMENTS values(10, 'teste', null, null);

    insert into DEPARTMENTS values(10, 'teste', null, null)

    *

    ERRO na linha 1:

    ORA-00001: restrição exclusiva (HR.DEPT_ID_PK) violada

    ==> encapsulando num PL/SQL :

    HR:@XE:SQL>BEGIN

      2  INSERT INTO DEPARTMENTS values(10, 'teste', null, null);

      3  EXCEPTION

      4     WHEN DUP_VAL_ON_INDEX then

      5        RAISE_APPLICATION_ERROR(-20001, 'Não foi possível inserir, Depto já existe!!');

      6  END;

      7  /

    BEGIN

    *

    ERRO na linha 1:

    ORA-20001: Não foi possível inserir, Depto já existe!!

    ORA-06512: em line 5

    HR:@XE:SQL>

    dentro da sua aplicação OU dentro de um