2010-11-05 12 views
0

Je lance le script SQL Firebird suivant, mais il ne produit pas les résultats attendus après l'exécution. Je veux l'utiliser dans mon application Delphi, mais je la teste d'abord dans l'IDE EMS SQL Manager. Après l'exécution du script, toutes les tables doivent être vides, tous les déclencheurs doivent être inactifs et tous les générateurs doivent être mis à 0. Cependant, tout cela ne se produit pas et je ne sais pas pourquoi.Le script Firebird ne produit pas les résultats attendus

est ici le script:

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 ;^
+0

Donc ce n'est pas un problème Delphi; peut-être que vous devriez supprimer la balise Delphi. –

+0

éditeur le mettre. J'ai d'abord mis: script firebird – SteveL

+0

Pour le script de suppression, il peut échouer si vous avez une intégrité référentielle déclarée pour la base de données! – jachguate

Répondre

1

Je suis si vous avez pas sûr à 100% ici, mais Suspend est nécessaire qu'une procédure stockée qui renvoie des valeurs (appelée avec un select * fromsp()).

Dans ce cas, je pense que la suspension brise votre code.

+0

En effet. 'suspend' est comme' yield' dans C#: il fait attendre le proc stocké jusqu'à ce qu'il ait besoin de produire l'ensemble de résultats suivant. Cela ne fonctionnera donc que si vous effectuez une sélection à partir du proc stocké, et non une exécution. –

+0

Cela l'a corrigé. Merci tout le monde. – SteveL

0

Qu'est-ce que le composant Delphi utilisez-vous pour exécuter un script SQL? Avez-vous un message d'erreur? Vous pouvez accomplir la tâche en écrivant un peu de code 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; 
+0

Mais ... y a-t-il un problème avec le code dans le script? – SteveL

+0

Essayez de le réécrire sans curseurs. Il suffit de faire des cycles en utilisant la construction FOR SELECT. Et je ne suis pas sûr de mélanger le code DDL et DML dans un bloc d'exécution. –

+0

Merci Andrei. Je vais essayer ça. – SteveL

1

Vous devez supprimer les lignes suspend;.

Questions connexes