2016-10-13 4 views
0

Firebird 2.5 with IB Expert。ファイアバードデータベースに多数の行を挿入

Iはコードデータの例から分かるように、データベース

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 

に多数の行を追加するSQLスクリプトを持っているが、ほぼ同一であるが、エラー出力

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

Firebirdは分かりませんが、すべてのプロシージャが1つずつ正しく実行されると、私はあなたにメモリエラーが発生していると思います。私は巨大な挿入物と他のサーバーでこれを持っていた。トランザクションは多くの場所に行きました。一時テーブルの1つがいっぱいでした(どちらが覚えていないか)。私はこれをより小さなトランザクション(トランザクションあたり10Kの挿入)にする必要がありました。 – AxelH

答えて

3

あなたが言及した行数(100K)を指定すると、ステートメントのサイズは64KBを超えます(これはFirebird 2.5以前のステートメントの最大サイズです)。 execute blockは1つのステートメントなので、実行ブロック内のステートメントの数を64 KBに収まるように減らす必要があります。

Firebird 3では、新しいAPIで実行した場合にのみ、より大きなステートメントを使用できます。そのため、IB Expertからの実行には役立ちません。

また、クエリーツールでセミコロンをデフォルトのステートメントターミネーターとして使用する場合にも、同じエラーが発生する可能性があります。 Firebirdは文ごとに実行されるため、ほとんどのクエリツールはセミコロンで分割され、文を1つずつ送信します。しかし、内部でexecute blockもセミコロンを使用しています。これは、代わりにフルexecute blockの、それが唯一のFirebirdは、コマンド -errorの予期しない終了を報告する原因となる完全なステートメントではないステートメントとして

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

関連する問題