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 7281 게시물 읽기
No. 7281
REPLACE FUNCTION에 대해서(PL/SQL)
작성자
작성일
2007-12-07 15:16
조회수
6,102

안녕하세요
postgresql를 사용하는 초보입니다..
다름이 아니라 질문이 있어서요..
CREATE OR REPLACE FUNCTION test(varchar)
RETURNS int8 AS
'
declare
sum_t int8;
count_t int8;
date_a varchar;
date_t ALIAS FOR $1;
begin
date_a = date_t;
SELECT (sum(trunc(COALESCE(n.new_putamount,0)+COALESCE(n.new_putaddamount,0),-1))+COALESCE(sum(t.dc_moneydc),0))::int8,count(n.new_num)::int8
into sum_t, count_t
FROM new_billing n,
     contract c,
     ip_account ip,
     products pro,
     member m,
     company o,
(select c.con_idx,sum(d.dc_moneydc)as dc_moneydc 
from new_billing n left outer join dc d on n.new_idx=d.new_idx, contract c,products pro 
where c.pay_idx=pro.pay_idx and pro.pro_title_name=\'IPIX\' and substr(n.new_con_date,1,7)= date_a
and n.new_mem_type=\'S\' and n.con_idx=c.con_idx and n.new_start_date < COALESCE(d.dc_end_date,now()+\'1 day\')
group by c.con_idx)as t
WHERE m.mem_idx=c.mem_idx and t.con_idx=c.con_idx
      AND n.con_idx=c.con_idx
      AND ip.con_idx=c.con_idx
      AND c.pay_idx=pro.pay_idx
      AND o.com_code=c.con_code
      AND n.new_flag = \'B\'
      AND m.mem_member_type!= \'G\'
      AND pro.pay_flag= \'F\'
  AND n.new_mem_type= \'S\'
  AND c.con_type= \'S\'
      AND substr(n.new_con_date,\'1\',\'7\')= date_a
      AND pro.pro_title_name=\'IPIX\'
      AND o.com_flag=\'I\'
  AND (c.con_type!=\'F\' AND c.con_type!=\'C\')
  group by pro.pro_type_vat;
return sum_t,count_t;
end
'
 LANGUAGE 'plpgsql' VOLATILE;
이 쿼리는 이번달 미납요금과 미납된 사람에 대한 카운트를 구하는 쿼리입니다.
근데 이 쿼리를 FUNCTIONS에 추가시킨 후 select test('2007-12');라는 select문을 
날렸더니 에러메세지에 2개의 값을 가지고 올수 없다고 하네요..
이렇게 쓸때, 2개이상의 값을 리턴 받을 수 있을까요????
많은 고수님들의 관심 부탁드립니다.....

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

방법이 몇가지 있는데, 그나마 비용이 적은게, 


그냥 create view v_brabra as select 0::bigint as sum_t, 0::bigint as count_t;

이런식으로 그 함수에서 리턴하는 형태의 뷰를 만드세요. 


다음 함수의 리턴값으로 그 뷰 이름을 지정하세요. 


pl 함수의 declare 부분에, 


return_value v_brabra%ROWTYPE;


형태로 지정하고, 

함수 끝부분에,

return_value.sum_t := sum_t;

return_value.count_t := count_t;


이런식으로 값을 입력하고, return_value 자체를 리턴해버리세요. 


그리고 함수를 select 문에서 호출할 때, 


select * from test(...);


이런식으로 호출하면 될듯합니다.


좀 햇갈리나요?

김상기(ioseph)님이 2007-12-07 20:47에 작성한 댓글입니다.

OUT 을 사용하면 될텐데, 굳이 VIEW 를 만들면서까지 할 필요가 있을까요.

초보대왕님이 2007-12-10 14:00에 작성한 댓글입니다. Edit

감사합니다.. 님들 덕분에 잘 해결되었습니다. 좋은 한주 보내세요...

배수동님이 2007-12-10 17:11에 작성한 댓글입니다. Edit

IN, OUT 은 8.2 부터 지원되는것으로 압니다. (그이전도 될려나..)

지원이 되지 않는다면 쿼리를 하나 만드는것도 괜찮을상 싶습니다.

tyro님이 2007-12-10 22:18에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
7284initial_ko, soundex_ko 소스입니다. [4]
tyro
2007-12-13
5642
7283자료실의 soundex 와 initial_ko 안되네요.. [4]
tyro
2007-12-13
5222
7282PostgreSQL 암호화 적용 [1]
전주원
2007-12-12
6273
7281REPLACE FUNCTION에 대해서(PL/SQL) [4]
2007-12-07
6102
7278흠 8.0과 8.2 문자셋 관련 질문 [3]
장현성
2007-12-04
6028
7277디비접속 시 mac address로 접근이 가능한가요 [1]
한수부탁요.
2007-12-03
5407
7276제로보드XE 를 pgsql 에서도 쓸수 있었으면 좋겠네요.. [11]
김태훈
2007-12-01
6217
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다