Firebird/Ponto e vírgula, um mistério...
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 ; ^