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

Can SQL*Plus read environment variables from the machine is it running on?

我知道数据库引擎本身(通常)在另一台机器上并且 SQL*Plus 没有直接读取 那些 环境变量的方法,但我处在一个棘手的情况下,我只需要来自客户端本身运行正在使用的机器的环境变量。

有没有办法从单个脚本中将这些值欺骗到 SQL*Plus 客户端,即 SQL*Plus 中的 运行?该脚本由一个 begin/end PL/SQL 块组成,但如果我需要使用 SQL*Plus 指令 set/define/variable 那种也不成问题。

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

有什么办法可以做到吗?

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

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

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

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

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

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