2017-12-18 5 views
0

Ich versuche, zwei Werte in meine Datenbank mit execute block einzufügen und geben Sie die ID zurück.Einfügen wird nicht beibehalten, wenn im Ausführungsblock mit Rückgabewerten ausgeführt wird

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; 

Wenn ich nicht nennen fetch|fetchAll Methoden der Einsatz in der Datenbank nicht beibehalten.

Ich kann fetchAll nicht aufrufen, nachdem die Abfrage für das mehrfache Lesen der Ergebnismenge ausgeführt wurde. Aber wenn ich dort anrufe, ist die Einfügung bestehen und ich kann Werte zurück erhalten.

+0

erwägen, den Text neu schreiben oder eine Rechtschreibprüfung verwenden. Es ist schwer zu verstehen, was gefragt wird. – eis

+0

Was verstehen Sie nicht? – LifeOrYou

+1

Wenn Sie den Rowset-Abruf nicht durchführen möchten, erstellen Sie eine separate Abfrage 'in test (name) -Werte einfügen (: name) returning id' und verwenden' bindParam', um ': name' -Parameter auf verschiedene Werte zu setzen und zweimal mit jedem auszuführen Wert –

Antwort

0

Sie müssen alle vom execute-Block erzeugten Zeilen abrufen, damit diese Anweisungen ausgeführt werden können. Eine execute block ist eine anonyme "gespeicherte" Prozedur, und eine suspend Anweisung macht es "auswählbar".

Wenn Firebird ausgeführt wird, arbeitet es bis zu einer suspend-Anweisung, wartet auf die vom Client abgerufene Zeile und fährt dann mit den nächsten Anweisungen fort, bis es eine weitere suspend-Anweisung erreicht.

Wenn eine Zeile nicht durch den Kunden und die Anweisung geholt wird geschlossen/freigegeben wird, dann Firebird werden alle Änderungen bis zum vorherigen suspend Rollback (oder den Beginn der Stored Procedure/execute block wenn es keine vorherige ist suspendieren).

Mit anderen Worten, das Abrufen der Zeilen ist erforderlich, damit die execute block dauerhafte Wirkung hat.

Andernfalls ist es möglicherweise besser, die Wendeschneidplatten einzeln auszuführen und execute block einfach nicht zu verwenden.

+0

Schöne Antwort, thx – LifeOrYou

Verwandte Themen