database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 3215 게시물 읽기
No. 3215
PL/pgSQL에서 insert의 확인과 에러가 발생하였을 경우...
작성자
김일형
작성일
2001-07-31 00:35
조회수
5,465

안녕하세요, 김일형입니다.

 

오늘 어떤 분께서 PL/pgSQL함수 내에서 insert를 하였을 경우 RESULT_OID에 대한 사용법을 알려달라고 메일을 주셨습니다.

 

제가 원래 허접이라 조금 테스트 프로그램을 만들어 보았는데요...

도움이 되었기를 바랍니다.

 

아래의 코드는 test라고 하는 integer 칼럼하나를 달랑가지는 간단한 테이블이구요,

(1)번 쿼리는 적법한 쿼리이고 (2)은 그 삽입된 행의 OID를 가져오는 코드입니다.

(3)은 잘못된 쿼리입니다.

코드를 봐주세요...

-----------------------------------------------------------------------------

DROP FUNCTION test_func();

CREATE FUNCTION test_func() RETURNS integer AS '

DECLARE

objid INTEGER := -1;

BEGIN

RAISE NOTICE ''Before insertion: %'', objid;

 

INSERT INTO test VALUES ( 10 ); -- (1)적법한 쿼리

GET DIAGNOSTICS objid = RESULT_OID; -- (2) 삽입된 행의 OID를 가져오기

RAISE NOTICE ''After insertion of correct query: %'', objid;

 

INSERT INTO test VALUES ( 10, 2 ); -- (3) 틀린 쿼리

GET DIAGNOSTICS objid = RESULT_OID; -- (4) 삽입된 행의 OID를 가져오기

RAISE NOTICE ''After insertion of wrong query: %'', objid;

 

RETURN objid;

END;

' LANGUAGE 'plpgsql';

-----------------------------------------------------------------------------

 

그리고 이제는 이것을 실행한 화면입니다.

 

=> select test_func();

NOTICE: Before insertion: -1

NOTICE: After insertion of correct query: 19786

ERROR: INSERT has more expressions than target columns

 

RAISE NOTICE ''After insertion of wrong query: %'', objid;

 

RETURN objid;

END;

' LANGUAGE 'plpgsql';

 

=> select * from test;

id

----

(0 rows)

 

=>

 

아시다시피 첫_째 행은 함수를 실행시키는 쿼리문이구요...

다음 행은 insert 하기전에는 objid가 초기값인 -1을 가지고 있는 것이 보이시죠?

그 다음행은 insert 하고 난 후의 objid 변수의 값입니다. 제대로 값을 가지고 왔습니다.

그 다음 행의 내용은 insert문장이 잘못되어서 에러가 발생한 경우입니다. 그리고 프로세스가 여기서 중단이 되고 함수 밖으로 빠져나왔습니다. 그러니까 (4)번 문장 이후로는 실행이 되지 않은 것입니다.

 

재미있는 것은 (1)번 문장은 제대로 실행이 되었는데도, 함수를 실행하고난 이후 테이블에는 아무것도 없습니다.

 

따라서 이것은 메뉴얼에서 설명한 것과 마찬가지로 에러가 발행하면 함수 내에서 실행 했던 쿼리는 rollback이 되고 리턴된다는 것을 보여주고 있습니다.

 

도움이 되었기를 바랍니다.

 

김일형.

[Top]
No.
제목
작성자
작성일
조회
3225mysql_data_seek 의 기능을 갖는 함수...?
백형주
2001-08-01
1850
3230┕>Re: mysql_data_seek 의 기능을 갖는 함수...?
정재익
2001-08-02 15:51:34
2216
3223cd 백업(매일매일 갱신된 자료만 백업하는법)?`
이강훈
2001-08-01
2308
3233┕>Re: cd 백업(매일매일 갱신된 자료만 백업하는법)?`
정재익
2001-08-02 16:05:37
2639
3235 ┕>Re: Re: 참고로 백업 관련 스크립트는..
정재익
2001-08-02 16:24:44
2415
3259 ┕>Re: Re: cd 백업(매일매일 갱신된 자료만 백업하는법)?`
이강훈
2001-08-06 11:30:03
2227
3260  ┕>Re: Re: Re: cd 백업(매일매일 갱신된 자료만 백업하는법)?`
정재익
2001-08-06 11:54:22
2450
3218이런 경우에는 어떤 쿼리문을 사용하면 될까요?
어떤생각
2001-07-31
2162
3221┕>Re: 비용이 문제되지 않는다면 subquery 를 사용하면...
정재익
2001-07-31 22:40:51
2300
3224 ┕>해결됬습니다. 감사합니다.
어떤생각
2001-08-01 16:44:51
2469
3215PL/pgSQL에서 insert의 확인과 에러가 발생하였을 경우...
김일형
2001-07-31
5465
3213SQL-92
권재군
2001-07-30
2115
3220┕>Re: SQL-92
정재익
2001-07-31 20:27:00
2370
3222 ┕>Re: Re: SQL-92 Draft 문서
정재익
2001-08-01 00:07:38
2231
3212transaction 관리에대한 질문
이성한
2001-07-30
2374
3214┕>Re: transaction 관리에대한 답변
김일형
2001-07-31 00:17:28
2396
3208자꾸 귀찮게 해서 지송합니다.
사이버
2001-07-30
1973
3210┕>Re: 자꾸 귀찮게 해서 지송합니다.
정재익
2001-07-30 11:37:29
2279
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.024초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다