2010-11-05 68 views
0

我正在運行以下Firebird SQL腳本,但它在執行後不會產生預期結果。我想在我的Delphi應用程序中使用它,但首先要在EMS SQL Manager IDE中測試它。執行腳本後,所有表應該是空的,所有觸發器都設置爲非活動狀態,所有發生器設置爲0.但是,這一切都沒有發生,我不知道爲什麼。Firebird腳本未產生預期結果

這裏是腳本:

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

所以這不是Delphi問題;也許你應該刪除Delphi標籤。 – 2010-11-05 21:26:35

+0

編輯把它。我原來的意思是:firebird腳本 – SteveL 2010-11-06 04:37:49

+0

對於刪除腳本,如果您有任何爲數據庫聲明的參照完整性,它可能會失敗! – jachguate 2010-11-08 16:09:13

回答

1

我不是100%肯定,在這裏,但暫停,只需要你有一個存儲過程返回值(稱爲一個select * fromsp())。

在這種情況下,我認爲暫停正在破壞您的代碼。

+0

確實。 'suspend'就像C#中的yield一樣:它使存儲的proc等待,直到它需要產生下一個結果集。所以它只會在你從存儲過程中執行'select'而不是執行時才起作用。 – 2010-11-05 21:28:00

+0

這解決了它。感謝大家。 – SteveL 2010-11-06 11:14:52

0

什麼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; 
+0

但是...腳本中的代碼有問題嗎? – SteveL 2010-11-05 14:04:58

+0

嘗試在沒有遊標的情況下重寫它。只需使用FOR SELECT構造進行循環。我不確定在一個執行塊中混合DDL和DML代碼。 – 2010-11-05 15:09:13

+0

謝謝安德烈。我會試試這個。 – SteveL 2010-11-05 15:24:09

1

您應該刪除行suspend;

相關問題