1

明示カーソル「crs」から 100,000 通の個別の電子メールを取得しないように、通知電子メールを 1 回送信するストアド プロシージャを開発しました。ストアド プロシージャ名は「a_test_email」です。「crs」という名前の明示的カーソルを作成しました。カーソルは、user_objects をクエリして、データベース内に無効なオブジェクトがあるかどうかを確認します。「a_test_email」ストアド プロシージャがループして電子メールを送信する方法に問題があります。「一括収集」は、カーソル「crs」内のすべてのレコードを取得し、すべての行 (つまり、レコード) を 1 つの電子メールでまとめて表示する 1 つの電子メールを送信します。ただし、エラー ORA-0065550 PLS-00306 が継続的に発生します。何が間違っているのかわかりません。「a_test_email」ストアド プロシージャでこの問題を修正するのを手伝ってください。

create or replace procedure a_test_email is

TYPE user_obj_tbl IS TABLE OF user_objects%ROWTYPE;
messages    user_obj_tbl;
v_email_body  varchar2(32767) := 'Oracle found ';

cursor crs is
 select *
 from user_objects
 where status = 'INVALID';

Begin

open crs;

loop
  fetch crs bulk collect into messages limit 100;
   exit when messages.count = 0;

  for indx in 1 .. messages.COUNT
  loop
    v_email_body := v_email_body||', '||messages(indx);
  end loop;
end loop;

v_email_body := v_email_body ||' object in your database. Please
troubleshoot issue. Thank you.';

email_format_test(p_to => 'test_email_1@testing.com',
                  p_cc => 'test_email_2@testing.com',
                  p_from => 'test_email_3@testing.com',
                  p_subject => 'INVALID OBJECTS '||messages.COUNT,
                  p_message => v_email_body,
                  p_smpt_host => '11.11.111.11'
                 );
 close crs;

 end;

---以下は、メールを送信するストアド プロシージャです---


create or replace procedure email_format_test(p_to => IN varchar2, 
                                              p_cc => IN varchar2, 
                                              p_from => IN varchar2, 
                                              p_subject => IN varchar2, 
                                              p_message => IN varchar2, 
                                              p_smpt_host => IN varchar2, 
                                              p_smpt_port => IN number
                                              default 25) 
as 
v_mail_conn utl_smtp.connection; 
BEGIN 
v_mail_conn := utl_smtp.open_connection(p_smtp_host, p_smtp_port); 
utl_smtp.helo(v_mail_conn, p_smtp_host); 
utl_smtp.mail(v_mail_conn, p_from); 
utl_smtp.rcpt(v_mail_conn, p_to); 

utl_smtp.open_data(v_mail_conn); 

utl_smtp.write_data(v_mail_conn, 'Date: '||TO_CHAR(sysdate, 'DD-MON-YYYY
HH12:MI:SS')||utl_tcp.crlf); 
utl_smtp.write_data(v_mail_conn, 'To: '||p_to||utl_tcp.crlf); 
utl_smtp.write_data(v_mail_conn, 'From: '||p_from||utl_tcp.crlf); 
utl_smtp.write_data(v_mail_conn, 'Subject: '||p_subject||utl_tcp.crlf); 
utl_smtp.write_data(v_mail_conn, 'Reply
To: '||p_from||utl_tcp.crlf||utl_tcp.crlf); 

utl_smtp.write_data(v_mail_conn, p_message ||utl_tcp.crlf||utl_tcp.crlf); 
utl_smtp.close_data(v_mail_conn); 

utl_smtp.quit(v_mail_conn); 
END; 
4

3 に答える 3

-1

6 つのパラメーターを使用してプロシージャを呼び出していますが、7 つのパラメーターが必要です (p_smpt_port パラメーターがありません)。

于 2017-01-26T22:00:53.703 に答える