2011-09-30 2 views
0

삽입 전에 업데이트 전의 트리거에서 실행되는 Firebird StoredProc을 가지고 있고 또한 3 개의 값을 반환합니다. 그 3 값은 동일한 테이블에서 3 개의 필드를 직접 업데이트합니다.Firebird SQL : StoredProc은 할당 된 값 대신 null을 반환합니다.

나는 체크가 맞으면 SP 시작 부분에 체크를합니다. "정지"와 "종료"를 사용 했으므로 그 SP를 건너 뛰고 싶습니다. null 값을 가진 3 개의 필드 업데이트를 발견했습니다. 그게 왜?

트리거 :

CREATE OR ALTER trigger trig1 for table1 
active before insert or update position 2 
AS 
begin 
    execute procedure my_proc1 new.f1, new.f2 
    RETURNING_VALUES new.f3, new.f4, new.f5; 
end 

StoredProc가 (이 난 단지 첫 선을 매우 큰 넣어) : 나는 IF 블록을 제거하고 다른 모든 것들을 유지하더라도

begin 
    if (COALESCE(Param1,0) = 1) then begin 
    output1 = 0; 
    output2 = 0; 
    output3 = 0; 

    exit; 
    end 

내가 0을 얻을 해달라고 3 필드하지만 NULL !!!

덕분에 당신은 저장 프로 시저의 충분한 게시하지 않은 것처럼

답변

1

을 알려 주시기 바랍니다, 말하기 어렵지만, 당신이 사용하지 않는 것이 좋습니다 선택 및 실행 절차를 혼합 것 같습니다. 예를 들어, 을 통해 SP에 전화하면 SUSPEND을 가지고 있지 않아야하며, SELECT ... FROM SP을 통해 전화하십시오. FireBird는 최근 버전에서 더 엄격합니다. "잘못된 호출 메커니즘"을 사용하면 예외가 발생하지 않는다고 생각합니다 ...

어쨌든 EXIT을 선택 가능한 SP에 호출하면 SQLCODE를 100으로 설정합니다 레코드 스트림 끝), 출력 값을 설정하지 않습니다. 그래서 제 제안은 SP를 "정리"하거나 (값을 반환하고 SELECT 문을 통해 SUSPEND을 호출 할 곳에서 SUSPEND을 사용) 실행 가능하게 만듭니다 (이 경우 SUSPEND 문을 제거하고 호출하십시오 via EXECUTE).

관련 문제