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 9502 게시물 읽기
No. 9502
함수를 만들어서 select를 하면원하는 결과값이 안나옵니다.
작성자
권영호(05kwon)
작성일
2014-12-18 16:43
조회수
10,908

 

 
 
CREATE OR REPLACE FUNCTION up_envos(_codegb character varying)
  RETURNS SETOF refcursor AS
$BODY$
DECLARE 
    recordSet  refcursor;
 
    begin
 
    open recordSet for
     SELECT A.CODEID as venid, A.CODEDESC as vendesc, B.CODEID as osid, B.CODEDESC as osdesc
       FROM CODE_BASE A,
            CODE_BASE B
      WHERE A.CODE_GB = _codegb
        AND A.PREFIX = _codegb
        AND B.PREFIX = A.CODEID;
    
    return next recordset;
 
    return;
end;
$BODY$
  LANGUAGE plpgsql
 
위의 함수를 만들었습니다. 
제가 원하는것은 필드4개에 값을 받은 것입니다. 
 
함수를 만들어 놓고 실행을 하면 결과값이 필드값이 조회 되는것이 아니고. 
하나만 조회가 됩니다. 
 
select up_envos('0030') 이렇게 값을 주고 결과를 보면
"<unnamed portal 5>"
 
이렇게 나오네요
원래는 venid, vendesc, osid, osdesc 이렇게 결과값이 조회 되어야 하는거 아닌가요?
 
제가 뭘 잘못한게 있으면.. 지도 부탁드립니다.
 
이 글에 대한 댓글이 총 3건 있습니다.

 일단 결과값이 단일 컬럼이 아닌경우 결과는 테이블과동급이라고 보시면됩니다. 따라서 select table명; 이렇게 안하는 것처럼 select * from 함수명(인자) 를 사용해 보세요. 

아싸가오리님이 2014-12-18 20:00에 작성한 댓글입니다. Edit

 답변 주신대로

select * from 함수명('') 을 줘도 결과는 동일하네요.

 

왜 한개 필드값만 나오는지 이해가 가질 않네요

권영호(05kwon)님이 2014-12-19 09:58에 작성한 댓글입니다.

 

 

 

사용하지 마시고, for loop등을 이용하여 resultset를 return하는 것이 맞습니다. 

 

위에서 return next recordSet 이라고 하셨지만, recordSet은 refcursor (CURSOR) type입니다.

 

cursor type은 예를 든다면, statement 정도에 해당할까.. 결과를 의미하지는 않습니다.

 

결과는 FETCH를 이용하면 가능합니다. 

 

하지만 보통의 경우, cursor 자체를 return하지 않습니다. for loop를 통해 result의 row를

 

반환합니다.

 

CREATE OR REPLACE FUNCTION up_envos(_codegb character varying)

 

  RETURNS SETOF RECORD AS

$BODY$

DECLARE 

    recordSet  RECORD;

 

    begin

 

    FOR recordSet IN

     SELECT A.CODEID as venid, A.CODEDESC as vendesc, B.CODEID as osid, B.CODEDESC as osdesc

       FROM CODE_BASE A,

            CODE_BASE B

      WHERE A.CODE_GB = _codegb

        AND A.PREFIX = _codegb

        AND B.PREFIX = A.CODEID

    LOOP

        return next recordSet;

    END LOOP

    

    return;

end;

$BODY$

하시고, select * from up_env('') as table1(venid varchar(5), vendesc varchar(6), ... );

결과값에 마추어서 타입을 마추셔서 넣으시면 됩니다.

 

 

 

아싸가오리님이 2014-12-19 15:09에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
9507pgadmin3 에서 만들어진 테이블 내용 엑셀로 어떻게 불러오나요? [4]
pgsql123
2014-12-23
11883
9506성적처리하는 db함수 어떻게 해야하나요? [4]
이기자
2014-12-22
11353
9504한 테이블의 지정된 범위를 다른 테이블에 입력 어떻게 하나요? [1]
심상호
2014-12-20
10471
9502함수를 만들어서 select를 하면원하는 결과값이 안나옵니다. [3]
권영호
2014-12-18
10908
9501함수를 디버깅 해 볼수 있는 방법은 없는지요? [2]
권영호
2014-12-17
10415
9500function에서 형변환에 관한 문의 입니다. [2]
권영호
2014-12-17
10223
9499백업 에러 [1]
해리
2014-12-15
10094
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.051초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다