2011-10-17 2 views
-1

두 개의 PostgreSQL 함수가 있습니다. 전자 메일 주소와 검색에 대한 몇 가지 세부 정보를 포함하는 데이터 집합을 email_me이라는 형식으로 반환합니다. 또 다른 하나는 첫 번째 데이터 집합을 수락하고 첫 번째 메시지의 텍스트와 세부 정보가 포함 된 전자 메일을 첫 번째 전자 메일 주소로 보내는 알림 시스템을 통해 처리합니다.PostgreSQL의 다른 함수에 반환 값 전달

지금은 첫 번째 함수의 결과 집합을 두 번째 인수의 인수로 복사/붙여 넣기 (실제로 내보내고, 작은 따옴표로 묶고 붙여 넣음)하여 두 함수를 테스트하고 있습니다.

제 질문은 어떻게하면 처음부터 두 번째 함수를 불러 와서 첫 번째 값을 두 번째 값으로 전달할 수 있습니까?

필자는 전자 메일 주소, 제목, 메시지 본문을 포함하여 전자 메일의 다른 요소를 구성하고 CC 목록을 작성하는 함수의 관련 부분으로 충분하다고 생각합니다.

-- BUILD EMAIL ELEMENTS into l_email 
--we always want to know the primary_contact_email -we use it in the message body 
SELECT email_address INTO l_primary_contact_email FROM users WHERE user_id = l_primary_contact_id; 

l_email.email_address := l_primary_contact_email; 

l_email.subject  := 'Work Order: '||l_work_order_id||' '||l_work_order_name||' has been completed.'; 

l_email.message_body := 'Work Order: '||l_work_order_id||' , has been completed. Please verify and set to closed: ' || l_jobs_url || '/jobs?workOrderId='||l_work_order_id || '\r\n\r\n Details: \r\n\r\n' || l_asset_list; 


------------------------------------------------------ 
SELECT automatortalk(l_email); 
RETURN l_email; 

모든 도움을 주시면 감사하겠습니다.

+0

전체 오류 메시지, 'automatortalk (l_email)'함수 및 (단순화 된) 첫 번째 함수의 정의를 보여주십시오. 나는 그 오류가'automatortalk (l_email)'에서 유래 한 것으로 의심한다. 우리를 도울 경우 우리는 당신을 도울 것입니다. –

답변

1

당신이 상상할 수있는 데이터 유형의 조합이 가능합니다.
여기에 (단순화 된) 기능을 게시하면 작동하지 않는 기능을 수정합니다.

이 메시지는 말하는 것을 의미

ERROR: control reached end of function without RETURN 

RETURN 문은 함수의 끝으로 실종해야합니다. 모두 관련 기능을 확인하십시오! 자, 이미 첫 번째 함수에서 두 번째 함수를 호출하면 l_email을 처음부터 반환 할 필요가 없습니다. 함수에 대해 RETURNS 절을 변경하고 필요한 항목 만 리턴하십시오.

그래서 솔루션은 다음과 같이 수 :

CREATE OR REPLACE FUNCTION f1() 
    RETURNS void AS 
$BODY$ 
BEGIN 

-- do stuff 

PERFORM f2(l_email); 

-- as you return void, RETURN statement is not needed. 
-- Else you would have to use it - or use OUT parameters. 

END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE; 

읽기 OUT 매개 변수 here에 대해.

+0

그 모든 것을 단순하게 유지할 수 있을지 모르겠지만 l_email이라는 전자 메일 변수가 있습니다.이 변수에는 고유 한 형식 인 email_me이 반환됩니다. 그래서 첫 번째 줄은 :'CREATE OR REPLACE FUNCTION email_maker_for_work_order (l_work_order_id integer, l_content_ids integer []) RETURNS email_me AS'이고, 함수의 본문은 복잡하고 여기에 게시하기에는 너무 길다. 기본적으로 루프에 의해 제어되는 SELECT INTO 시퀀스가 ​​있으며, 전자 메일 유형의 l_email이 반환됩니다. 나는 그 타입을 취해서 (email_me) arg를 사용하는 실제 이메일 함수에 넣고 싶다. – Smittles

+1

@ 존 : 더 나은 서식과 모든 사람이 볼 수 있도록 질문에 그러한 정보를 편집하는 것이 좋습니다. –

+0

그래서 몇 가지 실험을하고'RETURN l_email' 바로 전에 전자 메일을 실제로 보내지 만'error : control reached end of error '라는 함수를 깨뜨린'SELECT emailer (l_email)'을 넣었습니다. 함수를 반환하지 않고' – Smittles