2011-10-04 2 views
0

PL/SQL에 다소 익숙하며 작성한 커서를 사용하는 데 약간의 문제가 있습니다. 나는 특정 사람들에게 이메일을 보내는 절차를 쓰고있다. 여기에 관련 코드 :프로 시저 전체에서 커서 사용

sql stmt := ' -- All my sql is in here -- '; 

open email_cursor for sql stmt; 
fetch email_cursor into term, award, desc, id, name, xmdt; 

..... 


if v_id is not null then 
    email_adr := schema1.get_email_adr(v_id); --This is partly where problem is. 

    if v_opt_ltr = 'Y' then  --a variable that decides if an email should be sent 

        UTL_MAIL.SEND (sender => email_from, 
         recipients => email_adr, 
         subject => v_email_subject, 
         mime_type => 'text/html', 
         message => email_body); 

    END IF; 

END IF; 

좋아, 내가이 프로그램을 실행할 때 오류 또는 아무것도 얻을 해달라고하지만 어떤 이유로 나는 그것이 실패 email_adr 변수의 기능을 실행할 때, 저에게 아무것도주지 나던, 그리고 차례로 이메일을 보내지 않을 것입니다.

또 다른 질문 (커서가 새로 도입 되었기 때문에) : "stu_email : = schema1.get_email_adr (v_id);"줄을 실행하면 커서의 v_id에 약 25 개의 레코드가 있어야합니다. 이것으로 25 개의 레코드가 모두 나올 것이고 "utl_mail.send"가 모든 수신자에게 이메일을 보낼 것인가?

+0

UTL_MAIL.SEND에 대한 매개 변수의 값을 예상 했습니까? 하드 코드 된 매개 변수를 사용하여 UTL_MAIL이 포함 된 메일을 보내 보셨습니까? –

+0

네, 가지고 있고 잘 작동합니다. 수신자를 포함한 모든 전자 메일 변수를 하드 코딩하면 정상적으로 작동합니다. 해당 변수 (v_id)를 사용하고 25 개의 레코드를 모두 가져올 수 있습니다. – Dan

답변

0

커서를 이해하면 get_email_adr 함수 내부에 커서가 있습니다. 맞습니까? 비록 그 변수들 중 어느 것도 분명히 이메일 주소처럼 보이지 않기 때문에 나는 약간 혼란 스럽습니다.

그렇다면 모두는 get_email_adr 함수의 코드가 작동하는 방식에 따라 다릅니다. 때마다 open 커서가 "재설정"됩니다. 따라서 25 개의 레코드를 모두 합치려면 코드가 필요합니다. 다음과 같이 입력하십시오 :

FUNCTION get_email_adr(f_id IN NUMBER) RETURN VARCHAR2 IS 
    result VARCHAR2(32000); 
    CURSOR cur_email (c_id IN NUMBER) IS 
     SELECT email_address FROM some_table WHERE id = c_id; 
BEGIN 
    FOR rec IN cur_email(f_id) 
    LOOP 
     IF(result IS NULL) 
     THEN 
      result := rec.email_address; 
     ELSE 
      result := result || ',' || rec.email_address; 
     END IF; 
    END LOOP; 
    RETURN result; 
END get_email_adr; 

그런 종류의 질문이나 질문에 대한 답을 놓치셨습니까?

관련 문제