BEGIN
insert into t1 (id, c1, c2) values (:id, :c1, :c2);
WHEN SQLCODE -803 DO
update t1 set c1 = :c1, c2 = :c2 WHERE id = :id;
END
이 방법은 WHEN 때문에 PSQL에서만 쓸 수 있습니다.
PSQL은 SQL을 확장한 프로그래밍 언어로, 스토어드프로시저/트리거에서 사용되는 프로시주얼한 여러 라인으로 된 SQL을 말합니다. 오라클의 PL/SQL이나 MS SQL 서버의 TSQL과 같습니다. (위의 코드가 BEGIN...END로 싸여져 있는 것은 PSQL이라는 것을 표시하기 위한 것입니다)
따라서 일반 쿼리에서는 사용할 수가 없으며 프로시저/트리거에서만 사용할 수 있습니다. 다시 말해, 델파이/C++빌더의 TQuery류의 컴포넌트의 SQL 프로퍼티에 넣어서 바로 실행하면 에러가 납니다.
파이어버드 2.x에서는 EXECUTE BLOCK이라는 문법이 추가되어서, PSQL을 일반 SQL처럼 실행할 수 있게 되었습니다. 파이어버드 2.0 이상에서 위의 코드는 다음과 같이 해서 일반 SQL처럼 실행할 수 있습니다.
EXECUTE BLOCK
as
BEGIN
insert into t1 (id, c1, c2) values (:id, :c1, :c2);
WHEN SQLCODE -803 DO
update t1 set c1 = :c1, c2 = :c2 WHERE id = :id;
END
이 팁은 다음의 글을 참고하였습니다.
http://www.firebirdfaq.org/faq220/
|
Dynamic SQL Error
SQL error code = -901
undefined message number
란 오류가 발생하는데.. SQLCODE -803 이 정의가 되어 있지 않다는 건가요?