2016-04-21 34 views
3

同學們,我是Firebird的新人。我試圖在遊標循環中調用過程(p_procedure)並將結果插入表(tmp_port)。如何使用Firebird中的光標將行插入表中?

execute block 
as 
declare contr integer; 
declare IN$DT date; 
declare cur_list_of_cont cursor for (select first 100 contracts.doc from TABLE_1); 

begin 

delete from tmp_port; 
IN$DT = getdate()-2; 

open cur_list_of_cont; 
    while (ROW_COUNT > 0) do 
    begin 
    fetch cur_list_of_cont into contr; 


    insert into tmp_port (
     DT, 
     ....) 

     select 
      :IN$DT as DT, 
      ... 
     from p_procedure (0, :contr , :IN$DT); 


    if (ROW_COUNT = 0) then leave; 
    suspend; 
    end 
    close cur_list_of_cont; 

end; 

問題是,只有單一的,從cur_list_of_cont處理的fisrt行。 爲什麼其他99行不被處理?

UPDATE

火鳥服務器版本爲2.5

UPDATE

在這個實現正常工作:

begin 

IN$DT = getdate()-2; 

FOR select first 100 contracts.doc from TABLE_1 
INTO :contr 
DO 
    BEGIN 
    insert into tmp_port (
     DT, 
     ....) 

     select 
      :IN$DT as DT, 
      ... 
     from p_procedure (0, :contr , :IN$DT); 

    END 
    SUSPEND; 

end; 

這將是更好的,如果第一個例子工程太。怎麼做?

+1

您是否檢查過「p_procedure」是否爲遊標中的每條記錄返回記錄? IOW如果'p_procedure'爲第二行返回空結果集,則不會將任何內容插入到tmp_port中,因此ROW_COUNT將爲零並且循環將被打破。 – ain

+0

@ain謝謝ypur想法。遊標'cur_list_of_cont'返回兩個contracts.doc(1999和2000)。我用這兩個contract.doc調用'p_procedure'並返回結果。 – May12

回答

4

問題是您錯誤地使用了ROW_COUNT

描述:如在Firebird 2.5 language reference記載的ROW_COUNT上下文變量包含受在當前觸發最近的DML語句(INSERTUPDATEDELETESELECTFETCH),存儲過程的行數或可執行塊。

...

  • 從光標的FETCH後,ROW_COUNT是1,如果數據行被檢索,否則爲0。從同一遊標讀取更多的記錄不增加ROW_COUNT超過1

如果沒有刪除該while (ROW_COUNT > 0)可能是假的,你也可以,如果你的程序不返回行和插入爲此沒有退出循環。

如果你看一下example of using FETCH,您可以修改代碼以:

open cur_list_of_cont; 
fetch cur_list_of_cont into contr; 
while (row_count > 0) do 
begin 
    insert into tmp_port (
      DT, 
      ....) 
     select 
      :IN$DT as DT, 
      ... 
     from p_procedure (0, :contr , :IN$DT); 
    fetch cur_list_of_cont into contr; 
end 
close cur_list_of_cont; 

然而,鑑於你的代碼,你應該考慮使用FOR SELECT,因爲它是在大多數情況下更容易。

+0

謝謝。有用。我曾經在Oracle中使用open ... fetch構造,並試圖在Firebird中使用它。你能否解釋爲什麼'select'結構更受歡迎? – May12

+0

@ May12只要你不需要在循環體內進行多次提取,或者其他更棘手的事情,我寧願簡單而不願意複雜性。在我看來,選擇更簡單,因爲您不需要使用顯式遊標操作(如提取),並處理循環。 –

相關問題