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 4950 게시물 읽기
No. 4950
Query-specified return tuple and actual function return tuple do not match
작성자
최영식(cyspey)
작성일
2003-09-15 20:13
조회수
1,652

버젼 : 7.3.4

Function에 대해 초보 웹개발자입니다. php & postgres 연동해서 웹서비스를 개발하는데

아무래도 쌩쿼리보다는 펑션 만들어 쓰면 성능에 많은 개선을 준다고 하여 쌩쿼리를 전부

펑션으로 바꾸는 작업중입니다.

 

Drop Function udf_cyspey_Select_tblBlog(varchar);
Create Function udf_cyspey_Select_tblBlog(varchar) RETURNS SETOF RECORD AS '
select bl_strid,to_char(bl_dtmregdate,\'YYYY년 MM월 DD일\'),bl_strtitle,bl_strhello,bl_strhellocolor,bl_blnhellobold,bl_blnhelloshow,bl_strintro,bl_strcalendar,bl_blnblogopen,bl_blnvisitopen,bl_blnfriendsopen,date_part(\'day\',age(now(),bl_dtmregdate)) from tblblog where bl_strbid = $1;
'LANGUAGE 'SQL';

펑션은 위와같습니다. 단순히 셀렉만 하는 쿼리입니다.

그런데 얘를 호출할때 다음처럼 했는데 제목과 같은 에러를 냅니다.

$SQL = "select * from udf_cyspey_select_tblblog('$bid') as t(strid varchar(10),dtmregdate varchar(50),strtitle varchar(35),strhello varchar(255),strhellocolor char(7),blnhellobold boolean,blnhelloshow boolean,strintro varchar(70),strcalendar char(1),blnblogopen boolean,blnvisitopen boolean,blnfriendsopen boolean,dtmregdate2 int)";

분명 갯수도 맞고 mistype 에러두 아니고 왜 쿼리가 리턴하는 튜플과 실제 함수가 리턴하는 튜플이 매칭이 안 된다는 에러를 내는걸까요?

지금까지 Postgres 사용자정의함수 초짜의 질문입니다. 답변 부탁드려요....

 

이 글에 대한 댓글이 총 4건 있습니다.
mydb=# create table z (num int, name varchar(20));
CREATE TABLE
mydb=# copy z from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1    안녕
>> 1    하세요
>> 2    반갑
>> 2    습니다
>> \.
mydb=# create function myfunc(int) returns setof record as '
mydb'# select * from z where num = $1
mydb'# ' language 'sql';
CREATE FUNCTION
mydb=# select * from myfunc(1) as t(num int, name varchar(20));
 num |  name
-----+--------
   1 | 안녕
   1 | 하세요
(2 rows)

 

윗 모습과 크게 다르지 않음에도 불구하고, 이곳에서는 정상적으로 돌아가는 것으로 보아, to_char 자료형을 text로, date_part 자료형을 형변환해서 int로 해 보면 되지 않을까? 싶기도 합니다.

 

테이블 구조를 모르니, 딱히 살펴볼 방법도 없네요.

 

김상기(ioseph)님이 2003-09-16 00:56에 작성한 댓글입니다.

그런데,(중요한 이야기)

 

왜 저런 함수가 필요한지 모르겠습니다.

저런 경우라면, 함수로 만드는 것이 오히려 비용도 많이 들고, 속도도 늦습니다. (누가 봐도 그렇게 생각할 터인데)

 

저런 경우라면

PREPARE, EXECUTE 구문을 이용해서 푸는 것이 일반적입니다. 물론 저 쿼리가 하나의 세션(연결)에서 계속해서 bl_strbid 값만 바뀌고 똑같은 형태로 자주 사용된다면 말입니다. 그 반대로 딱 한번만 사용된다면, 그냥 SELECT로 가져오는 것이 제일 타당할 것 같습니다. PREPARE, EXECUTE 비용이 더 많이 들기도 하니까요.

김상기(ioseph)님이 2003-09-16 01:01에 작성한 댓글입니다.

답변감사합니다.

전 ASP&MSSQL서버를 쓰다가 이번에 옮긴 회사서 PHP&Postgres를 쓰길래 작업중인데요.

SQL서버경우에 StoredProcedure를 사용하면 성능개선에 많은 도움이 되잖아요. 그래서 Postgres에서도 Function으로 만들어 쓰면 비슷한 경우가 되지 않을까 해서 또한 메뉴얼에도 함수로 만들어 쓰면 훨씬 효율적이라고 하길래 바꾸는 중입니다.

함수로 만들어 사용하는것이 성능이나 효율면에서 오히려 떨어지나요?  

 

 

P.S. 위에서는 제가 아직 Postgres 시스템함수들도 완전히 숙지하지 못해서 발생했던 에러였네요. 리턴 타입이 틀려서 발생했던 거네요...

최영식(cyspey)님이 2003-09-16 10:08에 작성한 댓글입니다.
이 댓글은 2003-09-16 10:29에 마지막으로 수정되었습니다.

서버 함수를 사용해서 풀어야 효율적인 것이 있고,

그렇게 풀면 오히려 비효율적인게 있겠지요.

모든게 다 그렇듯이.

 

윗 경우는 제가 보기에는 비효율적인것 같네요.

이놈 설명하기에는 제 내공이 부족해서 너무 어렵게 설명할 것같아서 생략합니다. 서버 입자에서 가만히 생각해 보시면 쉽게 이해가 가실겝니다.

김상기(ioseph)님이 2003-09-16 10:22에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
4957postgresql.conf파일에 아무 내용이 없네요 [1]
백영진
2003-09-18
1551
4952PHP/Postgres에서 날짜 계산 해서 값 찾기 [2]
최성호
2003-09-16
4809
4951erwin 같은 프로그램중에 pgsql을 지원하는 프로그램이 있나요? [10]
신기배
2003-09-16
4612
4950Query-specified return tuple and actual function return tuple do not match [4]
최영식
2003-09-15
1652
4949sql문장의 길이 한계? [4]
박근준
2003-09-15
1991
4948오늘 겨우 백업을 마쳤는데요... 궁금한 점이 있어요... [1]
장현식
2003-09-15
1886
4946M$ 플랫폼에서의 웹 + PostgreSQL 개발 가능성 [2]
김상기
2003-09-15
2123
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다