GARANTIR DESCONTO

Fórum Executar arquivo sql no banco de dados Firebird. #590236

03/01/2018

0

Olá à todos. Estou com um problema ao executar um arquivo do tipo sql com varias querys.
Nesse exemplo o arquivo possui duas querys.

Segue o código:
procedure TForm1.recuperarDado;
var
resultado: Integer;
teste:string;
begin
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.LoadFromFile(ObterDiretorioDoExecutavel + 'comando.sql');
SQLQuery1.ExecSQL;
end;


Dentro do arquivo "comando.sql" contém o seguinte:

insert into USUARIOS (CODIGO,USUARIO,SENHA) values (6,'Teste','123');

update or insert into db_info (id, db_version, DB_SUBVERSION) values (1, 33, 1);


Como podem ver possui duas querys. Ele somente executa a primeira query e depois gerar uma mensagem de erro ao chegar no "update or insert...".

Erro que é exibido:
Project Atualizacao.exe raised exception class TDBXError with message 'Token unknown -line 3, column 2 update'


Preciso executar varias querys a partir de um único arquivo sql. Como eu poderia fazer?
Obrigado
Cayque

Cayque

Responder

Post mais votado

04/01/2018

Olá Cayque, tente utilizar a palavra reservada "GO" entre as transações que você quer executar no arquivo comando.sql da forma como está abaixo.

Exemplo:
insert into USUARIOS (CODIGO,USUARIO,SENHA) values (6,'Teste','123')
GO
update or insert into db_info (id, db_version, DB_SUBVERSION) values (1, 33, 1)

Faço desta forma no meu trabalho para executar múltiplas transações ao mesmo tempo no Firebird e funciona sem problemas.

Abs.

William Finco

William Finco
Responder

Gostei + 1

Mais Posts

04/01/2018

Cayque

Olá Cayque, tente utilizar a palavra reservada "GO" entre as transações que você quer executar no arquivo comando.sql da forma como está abaixo.<br />
<br />
Exemplo:<br />
insert into USUARIOS (CODIGO,USUARIO,SENHA) values (6,''Teste'',''123'')<br />
GO<br />
update or insert into db_info (id, db_version, DB_SUBVERSION) values (1, 33, 1)<br />
<br />
Faço desta forma no meu trabalho para executar múltiplas transações ao mesmo tempo no Firebird e funciona sem problemas.<br />
<br />
Abs.<br />
<br />
<br />
João, tentei usar o GO porém não funcionou. Da erro ao ler o GO. Ainda não está aceitando mais de um comando.<br />
Estou usando o SQLConnection e o SQLQuery do DBExpress para fazer a conexão com o IBExpert/FireBird.
Responder

Gostei + 0

04/01/2018

William Finco

Olá Cayque, agora me atentei na estrutura do seu código que você está executando isso dentro de uma procedure.

Desta forma, a sua primeira abordagem está super correta, usando o ponto-e-vírgula ao final de cada instrução, então o jeito que eu te sugeri está errado.

Também vi que na documentação do firebird o "UPDATE OR INSERT" que você inseriu foi introduzido a partir da versão 2.1 do firebird.

Eu sugiro que você dê uma olhada na query de exemplo do uso do "UPDATE OR INSERT" na documentação contida em https://firebirdsql.org/refdocs/langrefupd21-update-or-insert.html

Eu acho que ao final da segunda query está faltando a cláusula "MATCHING", que no seu caso ficaria:

update or insert into db_info (id, db_version, DB_SUBVERSION) values (1, 33, 1) matching (id)

Abs,
Responder

Gostei + 0

06/01/2018

Raimundo Pereira

Veja esse exemplo
'UPDATE or INSERT INTO sv_areas (NOME) VALUES ('''+EDT_NOME.Text+''') matching (NOME)';

matching (NOME)'; Este é campo principal que será verificado
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar