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 9351 게시물 읽기
No. 9351
함수 리턴값 2개 이상일때
작성자
코난
작성일
2013-09-26 16:40
조회수
8,917

안녕하세요? 요즘 여기서 많이 배우고 있답니다. 먼저 감사드려요!!

오늘도 테스트 중에 막히는 부분이 있어서요.

리턴값 2개 이상을 out 인자로 선언하여 테스트 하다가 잘 안되어, 여기서 힌트를 얻은 방법을 사용하여 2개의 리턴값을 받아오는 함수를 작성했습니다.

함수 : TEST_CALLED3

OUTPUT 받아오기용으로 테이블을 하나 만들어 ROWTYPE을 선언했습니다.

 

CREATE TABLE TAB1 (A1 VARCHAR(10),A2 VARCHAR(10))

CREATE OR REPLACE FUNCTION TEST_CALLED3
(
)
RETURNS RECORD AS
$$
DECLARE
      T_RET TAB1%ROWTYPE;
BEGIN
      T_RET.A1 := '1234567890';
      T_RET.A2 := 'ABCD';
      RETURN T_RET;
END;
$$
LANGUAGE PLPGSQL;


 

그리고 이렇게 호출하는 함수를 하나 짰습니다. 실제로 이런 식으로 다른 함수에서 그 함수를 호촐할 거 거든요.

 

CREATE OR REPLACE FUNCTION TEST_CALL2()
RETURNS RECORD AS
$$
DECLARE
 T_RET TAB1%ROWTYPE;
BEGIN
 SELECT TEST_CALLED3() INTO T_RET;
 RETURN T_RET;
END;
$$
LANGUAGE PLPGSQL;

 

SELECT TEST_CALL2();

 

이렇게 실행했더니, 아래와 같은 오류가 발생합니다. 레코드 타입으로 선언한 T_RET 변수가 레코드타입 길이만큼 할당이 안된듯 보입니다.

상식적으로 잘 이해가 안가는 상황이라서 헤매고 있어요.  CREATE TABLE TAB1 (A1 VARCHAR(10),A2 VARCHAR(10)) 이므로 레코드 타입은 20자리는 잡혀야 하는 거 아닌가요?

ERROR:  value too long for type character varying(10)
CONTEXT:  PL/pgSQL function test_call2() line 5 at SQL statement
 

 

약간 값을 달리해서 테스트를 하면요.. 아래와 같이 데이터 값을 좀 짧게 주면 실행이 되긴 하는데..

 

CREATE OR REPLACE FUNCTION TEST_CALLED3
(
)
RETURNS RECORD AS
$$
DECLARE
T_RET TAB1%ROWTYPE;
BEGIN
T_RET.A1 := '1234';
T_RET.A2 := 'ABC';
RETURN T_RET;
END;
$$
LANGUAGE PLPGSQL;

 

CREATE OR REPLACE FUNCTION TEST_CALL3()
RETURNS VARCHAR AS
$$
DECLARE
T_RET TAB1%ROWTYPE;
BEGIN
SELECT TEST_CALLED3() INTO T_RET;
RETURN T_RET.A1;  --A1컬럼만 따로 보고싶음.
END;
$$
LANGUAGE PLPGSQL;

 

SELECT TEST_CALL3(); 결과가 아래와 같이 레코드값 전체가 나와요. 제가 하고 싶은 건 OUTPUT 값 각각을 따로따로 구분해서 얻고 싶은 건데 그게 잘 안되네요.

"("(1234,ABC)",)"

 

어떻게 하면 될까요?

다시 요약하면, 함수의 OUTPUT 파라미터 리턴값을 각각 따로따로 구분해서 가져올 수 있는 방법이 어떤건가 하는 거예요.

보석같은 조언 기다리겠습니다. 감사합니다^_^

 

이 글에 대한 댓글이 총 1건 있습니다.

함수 자체에서 반환값을 여러개 둘수 있는지 테스트 안해봐서 잘 모르겠는데

여러개가 가능하면 그걸 활용하시면 될테고

 

그게 안 되고 하나밖에 할 수 없다면

그 반환값 타입이 동일하다면 배열을 활용하시면 될 거 같고

또 같거나 다른 경우 님처럼 아예 레코드로 반환하여도 될거 같습니다.

 

전자의 경우 ret[1], ret[2] 형식으로 접근하면 될거 같고요

 

후자의 경우에는

select func(); 이 아니라

select a1, a2 from func(); 형식으로 접근하셔야 할 거 같습니다.

 

tyro님이 2013-09-26 22:27에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
9354postgresql에서 새로운 테이블 스페이스를 만들려고 하는데 권한이 없다네요.. [1]
kohbong
2013-09-30
7378
9353동일한 구조의 동일한 이름DB 2개를 하나로 합칠수있는 방법이있나요? [2]
pride
2013-09-30
7278
9352현재 디비서버에 접속하고 있는 접속자 수를 파악하려면? [2]
souler
2013-09-29
7111
9351함수 리턴값 2개 이상일때 [1]
코난
2013-09-26
8917
93509.x업데이트방법문의 [2]
지니
2013-09-26
6751
9349함수 내 함수 정의법 [3]
코난
2013-09-25
6962
9348pg_dumpall 사용후 복구시 동일하게 복구가 안됩니다. [1]
김성환
2013-09-25
7000
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2019 DSN, All rights reserved.
작업시간: 0.111초, 이곳 서비스는
	PostgreSQL v11.5로 자료를 관리합니다