如何将操作系统变量加载到 PL/SQL 中?
Posted
技术标签:
【中文标题】如何将操作系统变量加载到 PL/SQL 中?【英文标题】:How do I load OS Variables into PL/SQL? 【发布时间】:2011-10-17 21:52:12 【问题描述】:这应该很简单,但是搜索词太常见了,我找不到答案:
问。如何将操作系统变量 (RHEL) 中的值加载到 Oracle 11g 数据库上的 PL/SQL 中?
代码:
begin
dba_utilities.utilities_with_ext_proc.send_email(
p_recipient => '$MAIL_LIST',
p_subject => 'Subject'
p_body => 'Body
);
End ;
如果我输入一个电子邮件地址,该过程可以正常工作,但有一个名为 $MAIL_LIST 的系统变量包含一组人。我还可以确认这在其他服务器上有效,但我正在设置替代服务器。
提前致谢,如果问题过于简单,我们深表歉意!
【问题讨论】:
$MAIL_LIST 变量在命令行中可供启动 Oracle 数据库的操作系统用户使用。 你的程序在做什么。根据包名,我猜你已经声明了某种外部过程。这意味着 PL/SQL 正在调用用 C 编写的外部过程(或暴露 C 接口的东西),并意味着环境变量的解析是在该外部过程中完成的,而不是在 PL/SQL 中。如果是这种情况,我们需要弄清楚外部过程是如何定义和实现的。此环境变量在您的环境中的哪个位置填充? PL/SQL正在调用一个shell命令,如下所示: shell('echo "Subject: '||REPLACE(p_subject, '"', '\"')||CHR(10) ||l_body||'" | 发送邮件'||p_recipient);我需要尝试下面的答案,看看它是否有效。 被调用的 shell 命令定义如下(在另一个过程中): CREATE OR REPLACE PROCEDURE shell(cmd IN char) AS EXTERNAL NAME "sh" LIBRARY shell_lib LANGUAGE C PARAMETERS (cmd string); 【参考方案1】:您可以通过Java 的System
class 中的getenv
method 访问环境变量。要从 PL/SQL 调用它,您可以创建一个 Java 存储过程,如下所示:
CREATE FUNCTION getenv(name VARCHAR2) RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'java.lang.System.getenv(java.lang.String) return java.lang.String';
现在,您可以按如下方式编写 PL/SQL 代码:
begin
dba_utilities.utilities_with_ext_proc.send_email(
p_recipient => getenv('MAIL_LIST'),
p_subject => 'Subject'
p_body => 'Body
);
End ;
存储过程也可以存在于 PL/SQL 包中(如果您不想创建模式级函数只是为了获取环境变量)。
【讨论】:
以上是关于如何将操作系统变量加载到 PL/SQL 中?的主要内容,如果未能解决你的问题,请参考以下文章
PL/SQL:, 如何将变量传递给 SELECT 语句并返回所有结果行
如何使用 Oracle (PL/SQL) 动态 sql 将数据查询到 %rowtype 变量中