안녕하세요, 김일형입니다.
제가 출근시간 전이라서 제 답변에 대한 검증은 못해봤는데요.... ^_^;;
기본적으로 pl/pgsql에서는 그냥 select문을 쓸 수 없습니다.
대신 Select into를 사용하죠.
그래서 결과값을 어떤 변수에 넣는다는 개념입니다.
아래의 예를 참고 바랍니다.
create function cs_refresh_one_mv(integer) returns integer as '
DECLARE
key ALIAS FOR $1;
table_data cs_materialized_views%ROWTYPE;
BEGIN
SELECT INTO table_data * FROM cs_materialized_views
WHERE sort_key=key;
IF NOT FOUND THEN
RAISE EXCEPTION ''View '' || key || '' not found'';
RETURN 0;
END IF;
// cs_materialized_views의 mv_name
// 칼럼은 view의 이름을 저장한다.
TRUNCATE TABLE table_data.mv_name;
INSERT INTO table_data.mv_name || '' '' || table_data.mv_query;
return 1;
end;
' LANGUAGE 'plpgsql';
일호님께서 올린 예하고 틀린 부분이 눈에 띄죠?
그리고 좀더 자세한 것은 제가 PL/pgSQL 메뉴얼을 번역해 놓은 것이 있습니다.
여기 초기화면 104번 공지사항을 보시면 링크 되어있으니 참고 바랍니다.
김일형.
>>김일호 님께서 쓰시길<<
::
:: 다음과 같은 문장을 작성했는데요 에러가 발생하는군요.
::
:: DROP FUNCTION MakeHourStat();
:: CREATE FUNCTION MakeHourStat() RETURNS BOOLEAN AS '
:: BEGIN
:: Select * From PG_CLASS WHERE RELNAME = 'statistics';
:: IF NOT FOUND THEN
:: RAISE NOTICE ''결과가 없습니다'';
:: RETURN TRUE;
:: ELSE
:: RAISE NOTICE ''결과가 있습니다'';
:: RETURN FALSE;
:: END IF;
::
:: END;
:: ' LANGUAGE 'plpgsql';
::
:: 함수를 실행하면 (Select MakeHourStat();) 다음과 같은 에러가 발생합니다.
::
:: ERROR: unexpected SELECT query in exec_stmt_execsql()
::
:: 도대체 이유가 뭔지 모르겠습니다. T.T
::
::
|