Executar comando SQL em lote - DELPHI

15/01/2018

0

Pessoal, estou tentando executar um arquivo SQL porém ele dar erro ao ser executado. Parece ser erro de sintaxe.
Na verdade eu gostaria de executar todo o script de uma só vez. Tentei usar o IBScript mas não estou conseguindo. Então foi criado uma rotina onde leio o arquivo e vou executando cada linha de comando.
Os três primeiros comandos do arquivo sql são:

set term ^;

ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER; ^

ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC; ^

.
Porém ele da o seguinte erro:
Token Unknown - line 1, column 5 term


Segue o código:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, WiniNet, Data.DBXFirebird, Data.FMTBcd, Data.DB,
  IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdFTP,
  Vcl.Buttons, Vcl.ComCtrls, IdException, IniFiles, ShellAPI,
  Vcl.Samples.Gauges, System.Zip, System.UITypes,
  Data.SqlExpr, IdHTTP,
  IdAntiFreezeBase, Vcl.IdAntiFreeze, DBXCommon, IBX.IBScript;

type
  TForm1 = class(TForm)
    SQLConnection1: TSQLConnection;
    SQLQuery1: TSQLQuery;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }

    procedure atualiza;
    procedure grava;
  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.atualiza;
var
  F: TextFile;
  buffer: string;
begin
  AssignFile(F, 'C:\\SAPO\\scripts\\atualizadofinal.sql');
  Reset(F);
  Readln(F, buffer);
  while not eof(F) do
  begin
    with SQLQuery1 do
    begin
      // buffer := StringReplace(buffer, '^', EmptyStr, [rfReplaceAll]); LINHA COMENTADA
      Active := False;
      SQLQuery1.Close;
      SQLQuery1.SQL.Clear;
      SQLQuery1.SQL.Add(buffer);
      grava;
    end;
    Readln(F, buffer);
  end;
  CloseFile(F);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  atualiza;
end;

procedure TForm1.grava;
var
  Trans: TDBXTransaction;
begin
  Trans := SQLConnection1.BeginTransaction(TDBXIsolations.ReadCommitted);
  try
    SQLQuery1.ExecSQL;
    SQLConnection1.CommitFreeAndNil(Trans);
  except
    on E: Exception do
    begin
      SQLConnection1.RollbackFreeAndNil(Trans);
      MessageDlg('Erro Ao Executar Script!' +
        E.Message, mtError, [mbOK], 0);
    end;
  end;
end;

End.


Será que essa paleta não aceita esse tipo de comando?
Cayque

Cayque

Responder

Post mais votado

15/01/2018

Cayque, o arquivo tem que ser executado todo, não linha a linha.
Quando você aciona o comando SQLQuery1.ExecSQL; todo o conjunto tem que estar carregado na SQLQuery1.sql.text; não pode executar linha a linha como está fazendo
Verifique se a o componente está carregado com todos os comandos quando ele for executar
set term ^; 
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER; ^ 
ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC; ^

O código acima deve ser único.
Ou então coloque no arquivo sem as terminações " ^; " e sem o inicio " set term "
O componente já contem as caracteristicas iniciais do comando sql conforme o banco de dados que está utilizando.
Ficando assim
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER
ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC


Luiz Vichiatto

Luiz Vichiatto
Responder

Mais Posts

15/01/2018

Cayque

Cayque, o arquivo tem que ser executado todo, não linha a linha.
Quando você aciona o comando SQLQuery1.ExecSQL; todo o conjunto tem que estar carregado na SQLQuery1.sql.text; não pode executar linha a linha como está fazendo
Verifique se a o componente está carregado com todos os comandos quando ele for executar
set term ^; 
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER; ^ 
ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC; ^

O código acima deve ser único.
Ou então coloque no arquivo sem as terminações " ^; " e sem o inicio " set term "
O componente já contem as caracteristicas iniciais do comando sql conforme o banco de dados que está utilizando.
Ficando assim
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER
ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC




Certo. O acento circunflexo consigo remover tranquilo. Posso carregar todo o arquivo SQL e jogar dentro de uma StringList. Mas e depois, como eu faria pra carregar todo o arquivo SQL na SqlQuery sem executar um por um? Saberia me explicar ?
Obrigado
Responder

16/01/2018

Stewart Moura

Cayque, o arquivo tem que ser executado todo, não linha a linha.
Quando você aciona o comando SQLQuery1.ExecSQL; todo o conjunto tem que estar carregado na SQLQuery1.sql.text; não pode executar linha a linha como está fazendo
Verifique se a o componente está carregado com todos os comandos quando ele for executar
set term ^; 
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER; ^ 
ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC; ^

O código acima deve ser único.
Ou então coloque no arquivo sem as terminações " ^; " e sem o inicio " set term "
O componente já contem as caracteristicas iniciais do comando sql conforme o banco de dados que está utilizando.
Ficando assim
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER
ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC




Removi o "set term ^" e o "^" porém ta dando erro agora no "ALTER". Estranho que ele não está reconhecendo nenhum comando praticamente.

Token Unknown - line 2, column 1 ALTER
Responder

16/01/2018

Stewart Moura

Percebi que quando eu deixei somente uma linha de comando (ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER;), é executado normalmente. Se eu deixar mais de uma linha já dar erro. Sinal que ele não está entendendo que é para parar no ponto e virgula e que ele executa linha por linha.
Consegui executar os comando só fazendo a rotina porém quando chega nessa linha
COMMENT ON DOMAIN BANDEIRA IS 'Bandeiras de Cartão: Visa, Master, Amex, Hipercard,Diners Club, Aura, SoroCred, Discover, Cabal, Elo';

Diz que a string foi mal formada.
O ruim disso tudo que executando direto pelo IBExpress funciona perfeitamente.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar