2017-12-18 7 views
0

execute blockを使用して2つの値をデータベースに挿入しようとしました。戻り値で実行ブロックを実行すると、挿入が永続化されない

execute block returns (id integer) 
as begin 
    insert into test (name) values ('test1') returning id into :id; 
    suspend; 
    insert into test (name) values ('test2') returning id into :id; 
    suspend; 
end; 

fetch|fetchAllメソッドを呼び出さないと、挿入がデータベースに保持されません。

結果セットの複数の読み込みに対してクエリ実行後にfetchAllを呼び出すことができません。 しかし、私がそこにコールすると、挿入は持続し、返された値を得ることができます。

+0

テキストの書き換えやスペルチェッカーの使用を検討してください。何が尋ねられているのかを理解することは難しいです。 – eis

+0

あなたはどうしますか? – LifeOrYou

+1

行セットのフェッチをしたくない場合は、 'test(name)values(:name)return id 'に別のクエリを作成し、' bindParam'を使用して ':name'パラメータを別の値に設定し、値 –

答えて

0

実行ブロックによって生成されたすべての行をフェッチして、それらの文を実行する必要があります。 execute blockは匿名の「ストアド」プロシージャであり、suspendステートメントは「選択可能」にします。実行されると

、Firebirdのはsuspendステートメントに仕事を行い、クライアントによりフェッチする行を待ち、それが別のsuspend文に当たるまで、次の文と進みます。

行がクライアントによってフェッチではなく、文が解放/閉じている場合(一時停止以前のがない場合、または、ストアドプロシージャ/ execute blockの開始)、その後、火の鳥が戻って、以前のsuspendまでのすべての変更をロールバックされます。

つまり、execute blockには効果が持続するために行を取得する必要があります。

それ以外の場合は、個別にインサートを実行し、単にexecute blockを使用しない方がよい場合があります。

+0

ニースの返信、thx – LifeOrYou

関連する問題