如何将操作系统变量加载到 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 语句并返回所有结果行

PL/SQL的变量

Win11处理PL/Sql Developer中文乱码

如何使用 Oracle (PL/SQL) 动态 sql 将数据查询到 %rowtype 变量中

如何通过 PL/SQL 过程和表名作为变量打印动态 SQL 中的所有表行?

用PL/SQL Developer导出表数据的时候,窗口一闪而过解决办法