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
我知道数据库引擎本身(通常)在另一台机器上并且 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