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_dependencies
或user_dependencies
,而不是假设您对调用过程具有特权或拥有它。
当然,您可以修改过程以简单地覆盖传入的eFrom
值并传递硬编码的no-response@domain.com
,但这似乎不太可能是正确的。您也可以修改代码以仅在传入的值为 anonymous@domain.com
时覆盖 eFrom
值,但同样,这不太可能是最佳方法。
【讨论】:
这听起来和我要找的完全一样。使用dba_dependencies
追踪它们的正确方法是什么?有简单的查询吗?
@BenSloboda - 更新了我的答案。【参考方案2】:
在我看来,收件人、发件人、抄送、主题和消息作为参数传递到存储过程中。您无法通过查看存储的过程来判断这些值是什么;你必须去调用它的代码看看它传递了什么。
您可能必须更新该表才能更改 eFrom 地址。
【讨论】:
以上是关于Oracle 存储过程搜索的主要内容,如果未能解决你的问题,请参考以下文章