【问题标题】:PL/SQL: Getting Error ORA-006550 PLS-00306 in stored procedurePL/SQL:在存储过程中出现错误 ORA-006550 PLS-00306
【发布时间】:2017-01-26 21:57:01
【问题描述】:

我开发了一个存储过程,可以发送一次通知电子邮件,这样我就不会从我的显式光标“crs”中收到 100,000 封单独的电子邮件。 存储过程名称是“a_test_email”。我创建了一个名为“crs”的显式游标。游标查询 user_objects 以检查数据库中是否有任何对象无效。我对“a_test_email”存储过程如何循环发送电子邮件有疑问。 “批量收集”获取光标“crs”中的所有记录,然后发送一封电子邮件,将所有行(即记录)一起显示在一封电子邮件中。但是,我不断收到错误 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; 

【问题讨论】:

    标签: oracle plsql bulk-collect


    【解决方案1】:

    我认为问题就在这里。

    v_email_body := v_email_body||', '||messages(indx);

    Oracle 找不到将字符串与行类型连接的函数。消息(索引)是 user_object%rowtype。

    试试这个。 v_email_body := v_email_body||', '||messages(indx).OBJECT_NAME;

    【讨论】:

    • 非常感谢。这就是问题所在。你是一个巨大的帮助。
    【解决方案2】:

    您的过程语法无效。声明变量时不要使用=>。

    改成这样:

    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) 
    

    【讨论】:

      【解决方案3】:

      您正在使用 6 个参数调用该过程,但它需要 7 个参数(缺少 p_smpt_port 参数)。

      【讨论】:

      • 最后一个参数(“p_smpt_port”)有一个默认值,因此不需要提供。
      • @JBC Woops - 谢谢。有一段时间了……谢谢你的来信!
      猜你喜欢
      • 2012-08-25
      • 2013-04-01
      • 2023-04-04
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多