Скрипт Firebird не дает ожидаемых результатов - PullRequest
0 голосов
/ 05 ноября 2010

Я запускаю следующий сценарий Firebird SQL, но он не дает ожидаемых результатов после выполнения. Я хочу использовать его в своем приложении Delphi, но сначала я тестирую его в IDE EMS SQL Manager. После выполнения скрипта все таблицы должны быть пустыми, все триггеры должны быть неактивными, а все генераторы - 0. Однако всего этого не происходит, и я не знаю, почему.

вот скрипт:

SET TERM ^ ;

execute block
as

declare trig char(31);
declare genr char(31);
declare reln char(31);

-- all triggers
declare curt cursor for
(select rdb$trigger_name from rdb$triggers
 where rdb$system_flag=0);

-- all generators
declare curg cursor for
  (select rdb$generator_name 
   from rdb$generators 
   where rdb$system_flag = 0);

-- all tables
declare cur cursor for 
  (select rdb$relation_name from rdb$relations
   where rdb$system_flag = 0 and rdb$view_blr is null
   and rdb$relation_name not in ('tblyesno', 
   'tblpaymentmethod', 
   'tblresourcetype'));

begin

  -- deactivate all triggers
  open curt;
  while (1=1) do
  begin
   fetch curt into trig;
   if (row_count = 0) then leave;
   execute statement 'alter trigger ' || trig || ' inactive';
   suspend;
  end 
  close curt;

  -- zero all generators
  open curg;
  while (1=1) do
  begin
   fetch curg into genr;
   if (row_count = 0) then leave;
   execute statement 'set generator ' || genr || ' to 0';
   suspend;
  end
  close curg;

  -- truncate all tables
  open cur;
  while (1=1) do
  begin
    fetch cur into reln ;
    if (row_count = 0) then leave;
    execute statement 'delete * from ' || reln;
    suspend;
  end 
  close cur; 

  INSERT INTO 
  TBLCOUNTRY
 (
  CURRENCYABBR,
  COUNTRYNAME,
  CURRENCYNAME
 ) 
 VALUES (
  'A',
  'Aa',
  'Aaa' ); 


end^

SET TERM ; ^

Ответы [ 3 ]

1 голос
/ 05 ноября 2010

Я не уверен на 100%, но приостановка необходима, только если у вас есть хранимая процедура, которая возвращает значения (вызываемые с помощью select * fromsp()).

В этом случае я думаю, что приостановка нарушает вашукод.

1 голос
/ 20 февраля 2011

Вы должны удалить строки suspend;.

0 голосов
/ 05 ноября 2010

Какой компонент Delphi вы используете для запуска сценария SQL?Вы получаете сообщение об ошибке?Вы можете выполнить задачу, написав немного кода Delphi.

var
  q, qList: TIBSQL;
  Tr: TIBTransaction;
begin
  Tr := TIBTransaction.Create(nil);
  q := TIBSQL.Create(nil);
  qList := TIBSQL.Create(nil);
  try
    Tr.DefaultDatabase := <database>;
    Tr.StartTransaction;

    q.Transaction := Tr;
    qList.Transaction := Tr;

    qList.SQL.Text := 
      'select rdb$trigger_name from rdb$triggers ' +
      'where rdb$system_flag=0 ';
    qList.ExecQuery;
    while not qList.EOF do
    begin
      q.SQL.Text := 'ALTER TRIGGER ' + qList.Fields[0].AsTrimString + ' INACTIVE';
      q.ExecQuery;
      qList.Next;
    end;

    qList.Close;
    Tr.Commit;
    Tr.StartTransaction;

    // do a cycle for generators
    // then for tables

    Tr.Commit;
  finally
    qList.Free;
    q.Free;
    Tr.Free;
  end;
end;
...