SQL*Plus 可以从运行它的机器上读取环境变量吗?

Posted

技术标签:

【中文标题】SQL*Plus 可以从运行它的机器上读取环境变量吗?【英文标题】:Can SQL*Plus read environment variables from the machine is it running on? 【发布时间】:2015-05-07 17:04:08 【问题描述】:

我知道数据库引擎本身(通常)在另一台机器上,并且 SQL*Plus 无法直接读取 那些 环境变量,但我遇到了一个棘手的情况我只需要运行客户端本身的机器上的环境变量。

有没有办法从将在 SQL*Plus 中运行的单个脚本中将这些值欺骗到 SQL*Plus 客户端中?该脚本由单个开始/结束 PL/SQL 块组成,但如果我需要使用 set/define/variable 排序的 SQL*Plus 指令,这也不应该成为问题。

我不能做的是改变 SQL*Plus 可执行文件本身的启动方式(我无权将值作为参数传递)。

有没有办法做到这一点?

注意:dbms_system.get_env() 似乎从服务器本身检索环境变量,这是我不想要的。

【问题讨论】:

哪些环境变量?如果它们与 Oracle 有关,您可能可以从您的会话中获取它们。 自定义环境变量。与 Oracle 无关。 【参考方案1】:

您可以从the USERENV context 获取一些与客户端相关的内容,但不能获取任意环境变量。

如果您可以在本地计算机上创建文件,则可以使用the host command 根据环境变量设置替换变量:

SQL > host echo define homedir=$HOME > /tmp/gethome.sql

SQL > @/tmp/gethome.sql
SQL > host rm -f /tmp/gethome.sql

SQL > select '&homedir.' as home from dual;

HOME
------------
/home/apoole

1 row selected.

不是很漂亮,但如果你不能在命令行上将变量作为位置参数传递,那么你的选择就相当有限了。

这当然是使用 Unix-y 路径和命令,但你可以在 Windows 中做同样的事情。

【讨论】:

【参考方案2】:

Sys_context 应该可以解决您的问题。您可以使用DBMS_SESSION.SET_CONTEXT ('MY_NAMESPACE', 'MY_PARAMETER', v_input_parameter); 在数据库中设置自定义环境变量,然后使用SYS_CONTEXT ('MY_NAMESPACE', 'MY_PARAMETER'); 获取它 所以你可以运行一个初始的 pl/sql 块来设置会话中的变量,然后根据需要使用它。

您可以在此处查看示例:http://blog.contractoracle.com/2010/03/using-dbmssessionsetcontext-to-store.html

【讨论】:

你如何将操作系统环境变量放入上下文中? OP 愿意通过脚本设置变量,所以这将是一个手动步骤。 “我无权将值作为参数传递” - 因此它们不能作为位置参数使用。也许我们在谈论不同的事情。 @AlexPoole OP 说他在启动 SQL plus 客户端时无法传递参数。一个脚本可能是 python 可以选择 env。变量并将其设置在数据库中。【参考方案3】:

如果您可以通过sqlplus argument passing mechanism 传递变量。您可以执行以下操作,

cat > myscript.sql <<!
select '&1' as HOME from DUAL;
!

sqlplus user/pwd@db @myscript.sql $HOME

【讨论】:

以上是关于SQL*Plus 可以从运行它的机器上读取环境变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

SQL*Plus环境变量设置浅析

shell脚本中的SQL*Plus的环境变量

python 从windows获取环境变量:os.environ

python 从windows获取环境变量:os.environ

OracleLinux上配置新建用户访问SQL*Plus

是否可以在 Oracle SQL*plus 脚本中以编程方式构造替换变量的名称?