2016-10-13 33 views
0

帶IB Expert的Firebird 2.5。在Firebird數據庫中插入大量行

我有一個SQL腳本添加到數據庫

execute block as declare ID2 int; begin 
EXECUTE PROCEDURE NEW_PROCEDURE('1', '33001', 'be0ad759-ee6a-4a21-b5f9-ed71f1eba54c00', 'Новое оборудование') returning_values :ID2; 
EXECUTE PROCEDURE NEW_PROCEDURE2('1', :ID2, '13.10.2016', 'От 13.10.2016 № 1', 'Поступления'); 
EXECUTE PROCEDURE NEW_PROCEDURE2('1', :ID2, '13.10.2016', 'В составе Новое оборудование, в составе Новое оборудование', 'В составе'); 
EXECUTE PROCEDURE NEW_PROCEDURE('1', '3200', '91403ed6-56af-4acf-b66e-50c10118e4e60', 'Новое оборудование') returning_values :ID2; 
EXECUTE PROCEDURE NEW_PROCEDURE2('1', :ID2, '13.10.2016', 'От 13.10.2016 № 1', 'Поступления'); 
EXECUTE PROCEDURE NEW_PROCEDURE2('1', :ID2, '13.10.2016', 'В составе Новое оборудование', 'В составе'); 
EXECUTE PROCEDURE NEW_PROCEDURE('1', '33010', 'be0ad759-ee6a-4a21-b5f9-ed71f1eba54c01', 'Новое оборудование') returning_values :ID2; 
EXECUTE PROCEDURE NEW_PROCEDURE2('1', :ID2, '13.10.2016', 'От 13.10.2016 № 1', 'Поступления'); 
EXECUTE PROCEDURE NEW_PROCEDURE2('1', :ID2, '13.10.2016', 'В составе Новое оборудование, в составе Новое оборудование', 'В составе'); 
+100K 
end 

如可以從代碼的數據的例子可以看出幾乎是相同的大量行的,但錯誤輸出

Invalid token. 
Dynamic SQL Error. 
SQL error code = -104. 
Unexpected end of command - line 489, column 87. 
+0

不知道火鳥,但如果每個程序一個接一個地正確運行,我猜你會遇到內存錯誤。我有一個巨大的插入其他服務器上。交易佔了很大的一席之地,其中一張臨時桌已滿(不記得是哪一張)。我不得不將這個切割成更小的交易(每筆交易10K插入)。 – AxelH

回答

3

鑑於您提到的行數(100K),您的語句大小超過64千字節(這是Firebird 2.5及更早版本中的最大語句大小)。 execute block是一個單獨的語句,因此您需要減少execute塊中的語句數量,使其適合64千字節。

Firebird 3允許使用較大的語句,但只有在使用新的API執行時,這樣在從IB Expert執行時纔會有幫助。

或者,當您的查詢工具使用分號作爲默認語句終止符時也可能導致相同的錯誤。 Firebird執行每條語句,因此大多數查詢工具將在分號上分割以逐個發送語句。但是,execute block內部也使用分號。這意味着,而不是完整的execute block,它僅發送

execute block as declare ID2 int 

的說法,這是不是一個完整的語句,這會導致火鳥報告命令 - 錯誤的意外結束。

爲了能夠執行此操作,您需要指示您的查詢工具切換語句終止符。對於大多數Firebird工具,這是set term,例如set term #;會將工具語句終結符切換爲#

您需要執行如下:

set term #; 

execute block as 
    declare ID2 int; 
begin 
    EXECUTE PROCEDURE NEW_PROCEDURE('1', '33001', 'be0ad759-ee6a-4a21-b5f9-ed71f1eba54c00', 'Новое оборудование') returning_values :ID2; 
    ... 
end# 

set term ;# 

參見SET TERM terminator or terminating character

+0

鑑於錯誤消息(489)中的行號,我會說它更可能是語句大小......如果語句終止符是原因,那麼確定行號是1(或2或3,取決於語句實際上是格式化的)。 – ain

+0

我試着用你提出的選項,但它仍然給出了一個錯誤 – fedormoore

+0

添加的記錄總數3700 – fedormoore