Oracle 存储过程搜索

Posted

技术标签:

【中文标题】Oracle 存储过程搜索【英文标题】:Oracle Stored Procedure Search 【发布时间】:2013-09-20 15:00:51 【问题描述】:

我有以下代码,我的任务是将'eFrom' 值从'anonymous' 更改为'no-response'。我不知道值存储在哪里或如何找到它。现在,该过程发送一封电子邮件,其发件人值为'anonymous@mail.com'。有谁知道我如何找到'eFrom' 的值或它存储在哪个表中?我目前正在使用 Oracle SQL Developer。

create or replace PROCEDURE SEND_MAIL
(eTo IN VARCHAR2,
 eFrom IN VARCHAR2,
 eCC IN varchar2,
 eSubject IN VARCHAR2,
 eMessage IN CLOB) AS
BEGIN
  execute immediate 'alter session set smtp_out_server = ' || chr(39) || 'mail.com' || chr(39);
  UTL_MAIL.send(sender => eFrom,
  recipients => eTo,
  cc => eCC,
  subject => eSubject,
  message => eMessage,
  mime_type => 'text/html; charset=utf-8');
END;  

【问题讨论】:

【参考方案1】:

eFrom 不存储在任何地方(至少不在您发布的代码中)。它是传递给此过程的参数。您需要转到调用此过程的任何代码,以查看该代码从何处获取eFrom 值(当然,可能有多个地方调用此过程,每个地方都从不同的地方获取值)。这些地方可能是其他 PL/SQL 块(在这种情况下,您可以使用 dba_dependencies 来追踪它们。但它们也可能在数据库之外运行的代码中,在这种情况下,您需要深入研究该源。

如果您正在寻找其他存储的 PL/SQL 对象,它们正在调用您的 SEND_MAIL 过程

SELECT owner, name, type
  FROM dba_dependencies
 WHERE referenced_name = 'SEND_MAIL'
   AND referenced_owner = <<owner of procedure>>

如果您无权访问dba_dependencies,则可以使用all_dependenciesuser_dependencies,而不是假设您对调用过程具有特权或拥有它。

当然,您可以修改过程以简单地覆盖传入的eFrom 值并传递硬编码的no-response@domain.com,但这似乎不太可能是正确的。您也可以修改代码以仅在传入的值为 anonymous@domain.com 时覆盖 eFrom 值,但同样,这不太可能是最佳方法。

【讨论】:

这听起来和我要找的完全一样。使用dba_dependencies 追踪它们的正确方法是什么?有简单的查询吗? @BenSloboda - 更新了我的答案。【参考方案2】:

在我看来,收件人、发件人、抄送、主题和消息作为参数传递到存储过程中。您无法通过查看存储的过程来判断这些值是什么;你必须去调用它的代码看看它传递了什么。

您可能必须更新该表才能更改 eFrom 地址。

【讨论】:

以上是关于Oracle 存储过程搜索的主要内容,如果未能解决你的问题,请参考以下文章

SQL 在 Oracle 中搜索对象,包括存储过程

Oracle:搜索所有存储的过程/触发器/其他数据库代码?

带有可能缺少某些搜索条件的查询的 Oracle 存储过程

通过将表名作为参数传递,使用 oracle 中的存储过程从表中搜索数据

oracle存储过程调试-plsql

JDBC取消Oracle存储过程调用