Saltar para o conteúdo

Firebird/Ponto e vírgula, um mistério...

Origem: Wikilivros, livros abertos por um mundo aberto.

Começaremos explicando uma diferença bastante gritante com a qual é comum se deparar ao se envolver com o Firebird para criar um script de stored procedure.

Um final de linha de comando, em Firebird, é por default o ponto-e-vírgula (;).

Porém, ao criarmos uma stored procedure, queremos que Create Procedure seja interpretado todo de uma vez.

Explico, veja o exemplo abaixo:

   CREATE PROCEDURE FIREBIRD_WIKI_EXEMPLO 
   AS
   Begin
       Insert Into wiki_exemplo ( idWIKI_EXEMPLO, DESCRICAO )
               Values ( 1, 'EXEMPLIFICANDO PROCEDURES');
   End

Teremos o seguinte erro:

IBPP::Exception inside Statement::Prepare
IBPP said : isc_dsql_prepare failed.
SQL Message : -104
Invalid token
Engine Code    : 335544569
Engine Message :
Dynamic SQL Error
SQL error code = -104
Unexpected end of command

Detalhe: as mensagens de erro variam conforme a ferramenta de acesso ao SGDB que estiver utilizando.

Por quê? Simplesmente porque para o interpretador do Firebird o comando terminou na linha 5, com o ponto-e-vírgula (;)

Como contornar isso? Com o comando Set Term, que muda o caractere de final de linha de comando para outro a nossa escolha.

Comumente, em diversos exemplos encontrados na internet, encontramos o caractere acento circunflexo (^) sugerido para tal tarefa.

Assim, veja como fica o script:

set term ^;
CREATE PROCEDURE FIREBIRD_WIKI_EXEMPLO 
AS
Begin
    Insert Into wiki_exemplo ( idWIKI_EXEMPLO, DESCRICAO )
            Values ( 1, 'EXEMPLIFICANDO PROCEDURES');
End^
set term ; ^

Repare que, na primeira linha do scrip usamos set term ^;, desta forma informamos ao interpretador do Firebird que, daquele ponto em diante, o caractere que marca o final de comando é o acento circunflexo (^)

Importante: na última linha devemos informar ao interpretador do Firebird que voltamos ao caractere default, que no nosso caso é o ponto-e-vírgula (;). E, atente ao detalhe, com o circunflexo (^) delimitando o final do comando, pois até esse ponto é ele que determina quando a instrução termina. Repare: set term ; ^