DB 에 들어가서..

#create function plpgsql_call_handler() returns opaque as '/usr/local/pgsql/lib/plpgsql.so' language 'C';


#create trusted procedural language 'plpgsql' handler plpgsql_call_handler lancompiler 'PL/pgSQL';


CREATE FUNCTION pgl_get_rows() RETURNS SETOF RECORD AS
'
DECLARE
row RECORD;

BEGIN
FOR row IN EXECUTE ''select field1,field2 from pkg_test ''
LOOP
RETURN next row;

END LOOP;
RETURN;
END;
' LANGUAGE 'plpgsql' ;

CREATE TABLE FUNCTION_NAME([PARAM1,PARAM2,..]) RETURNS [SETOF] DATA_TYPE
AS '
USER_DEFINITION
' LANGUAGE 'lang';

위의 []는 생략 가능함을 의미한다. lang에는 sql,plpgsql,c 등이 올수 있다.


다음은 앞부분(기초편1)에서 언급된 function 예이다. 실행 결과는 앞부분을 참조하라.


CREATE FUNCTION SQL_FUNC_1(int4) RETURNS text AS '
SELECT
CASE
WHEN NOGADA_TAB.id_ngd = $1
THEN ''있군요..''::text
ELSE ''없군요..''::text
END
' LANGUAGE 'sql';

SELECT SQL_FUNC_1(1) ;


다음은 포스트그레스의 function으로 간단한 예와 그 결과이다.


create function func1() returns text
as ' select \'nogadax\'::text \; '
language 'sql';


select func1() as name;

name
-------
nogadax
(1 row)



returns 에 예약어 setof 를 사용하면 한번에 여러 데이타를 받을 수 있다. 리턴형에는 일반 자료형뿐만아니라 테이블이나 뷰도 포함된다.


create table tablex (id_t int4, name text);

insert into tablex values ( 1, 'abc');
insert into tablex values ( 2, 'bcd');
insert into tablex values ( 3, 'cde');
insert into tablex values ( 4, 'def');

create function func2(int4) returns setof tablex
as ' select * from tablex where id_t > $1 '
language 'sql';

select id_t(func2(1)) as id ;

id
---
2
3
4
(3 rows)

select id_t(func2(2)) as id , name(func2(2)) as name;

id | name
-----+--------
3 | cde
4 | def
(2 rows)

Create Function fnBoardMaxNum(text) returns Integer As '
Declare
cQuery text;
cTable ALIAS FOR $1;
nMaxNum Integer;
pResult record;
Begin
cQuery := ''Select max(nBoardNum) as nMaxNum From '' || cTable;
For pResult In Execute cQuery
LOOP
nMaxNum := pResult.nMaxNum;
End Loop;

return nMaxNum;
end;
' Language 'plpgsql';

, .