Oracle SQL*Plus能否从运行它的机器上读取环境变量?

Oracle SQL*Plus能否从运行它的机器上读取环境变量?,oracle,environment-variables,sqlplus,Oracle,Environment Variables,Sqlplus,我知道数据库引擎本身(通常)在另一台机器上,SQL*Plus没有直接读取这些环境变量的方法,但我遇到了一个棘手的情况,我只需要客户机本身运行的机器上的环境变量 是否有一种方法可以将这些值从将在SQL*Plus中运行的单个脚本中欺骗到SQL*Plus客户端?该脚本由一个begin/end PL/SQL块组成,但是如果我需要使用set/define/variable排序的SQL*Plus指令,这也应该不会有问题 我不能做的是改变SQL*Plus可执行文件本身的启动方式(我没有权限将值作为参数传入)

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

是否有一种方法可以将这些值从将在SQL*Plus中运行的单个脚本中欺骗到SQL*Plus客户端?该脚本由一个begin/end PL/SQL块组成,但是如果我需要使用set/define/variable排序的SQL*Plus指令,这也应该不会有问题


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

有没有办法做到这一点


注意:
dbms\u system.get\u env()
似乎从服务器本身检索环境变量,这是我不想要的。

Sys\u context
应该可以解决您的问题。您可以使用
DBMS\u SESSION.set\u CONTEXT('MY\u NAMESPACE','MY\u PARAMETER',v\u input\u PARAMETER')在数据库中设置自定义环境变量
然后使用SYS_CONTEXT('MY_NAMESPACE','MY_PARAMETER')获取它 所以您可以运行一个初始pl/sql块来在会话中设置变量,然后根据需要使用它


您可以在这里看到一个示例:

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

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

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中也可以做同样的事情

如果可以通过传递变量。你可以这样做

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

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

cat>myscript.sql哪些环境变量?如果它们与Oracle相关,则可以从会话中获取它们。自定义环境变量。与Oracle无关。但是如何将OS环境变量放入上下文中?OP愿意通过脚本设置变量,因此这将是一个手动步骤。“我没有权限将值作为参数传入”-因此它们不能作为位置参数使用。也许我们在谈论不同的事情。@AlexPoole OP说他在启动SQL plus客户端时不能传递参数。一个脚本可能是python可以选择env。变量,并将其设置为DB。