2017-12-18 14 views
0

execute block으로 데이터베이스에 두 개의 값을 삽입하고 id 삽입을 반환합니다.반환 값을 사용하여 실행 블록을 실행할 때 삽입이 유지되지 않습니다

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 문에 도달 할 때까지 다음 명령문을 계속 진행합니다. 행을 클라이언트에 의해 인출되지 않고 문이 해제/닫혀있는 경우

, 다음, 파이어 버드가 다시 이전 suspend 때까지 모든 변경 사항 롤백합니다 (있는 경우 또는 저장 프로 시저의 시작/execute block 더 이전 일시 중단 없음).

즉, execute block에 영구적 인 영향을 미치려면 행을 검색해야합니다.

그렇지 않으면 삽입을 개별적으로 실행하는 것이 더 좋을 수도 있으며 execute block을 사용하지 않는 것이 좋습니다.

+0

좋은 답변, thx – LifeOrYou