oracle SQL*Plus能否从运行它的计算机读取环境变量?

ogsagwnx  于 2023-03-17  发布在  Oracle
关注(0)|答案(4)|浏览(119)

我知道数据库引擎本身(经常)在另一台机器上,SQLPlus没有直接阅读 * 那些 * 环境变量的方法,但我遇到了一个棘手的情况,我只需要客户机本身运行的机器上的环境变量。
是否有办法将这些值从将在SQL
Plus中运行的单个脚本中骗到SQLPlus客户机中?该脚本由单个开始/结束PL/SQL块组成,但如果我需要使用set/define/variable排序的SQLPlus指令,这也应该不是问题。
我不能做的是改变SQL*Plus可执行文件本身的启动方式(我无权将值作为参数传入)。
有什么办法可以做到这一点吗?
注意:dbms_system.get_env()似乎从服务器本身检索环境变量,这是我不想要的。

b1payxdu

b1payxdu1#

您可以从USERENV上下文中获取一些与客户机相关的内容,但不能获取任意的环境变量。
如果可以在本地计算机上创建文件,则可以使用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中做同样的事情。

bnl4lu3b

bnl4lu3b2#

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

jyztefdp

jyztefdp3#

如果可以通过SQLPLUS参数传递机制传递变量,则可以执行以下操作,

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

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

7gyucuyw4#

这可以通过使用空SQL脚本来完成。
脚本'getvar.sql'只需是一个空文件。
当使用“getvar.sql”调用sqlplus时,命令行中其后的所有内容都存储到指定的替换变量中;&1,&2等

$  touch getvar.sql

$  sql /nolog @getval "Fred"

SQL*Plus: Release 12.1.0.2.0 Production on Mon Mar 13 13:10:33 2023

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

SP2-0640: Not connected
@ > prompt &1
Fred

相关问题