FireBird Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
파이어버드 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
IBPhoenix
FireBird Main site
볼랜드포럼 광고 모집

FireBird 팁&트릭
[39] PK값이 존재하는지 여부에 따라 INSERT 혹은 UPDATE를 하려면
박지훈.임프 [cbuilder] 16005 읽음    2007-09-19 09:29
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/
이필호.xius [xius]   2009-03-07 09:41 X
EXECUTE BLOCK 형식으로 사용했는데..

Dynamic SQL Error
SQL error code = -901
undefined message number

란 오류가 발생하는데.. SQLCODE -803 이 정의가 되어 있지 않다는 건가요?
한울 [sjydevil]   2009-05-30 11:04 X
위의 것보다는 아래 코드를 쓰라고 하네요. Firebird 2.0 Language Reference 의 ROW_COUNT들 보면 아래 예제가 나옵니다.

update Figures set Number = 0 where id = :id;
if (row_count = 0) then
insert into Figures (id, Number) values (:id, 0);

+ -

관련 글 리스트
39 PK값이 존재하는지 여부에 따라 INSERT 혹은 UPDATE를 하려면 박지훈.임프 16005 2007/09/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.