I'm aware that the database engine itself is (often) on another machine and that SQL*Plus has no direct way of reading those environment variables, but I'm in a tricky situation where I merely need the environment variables from the machine the client itself is running on.
Is there a way to cheat these values into the SQL*Plus client from within a single script that will be run in SQL*Plus? The script consists of a single begin/end PL/SQL block, but if I need to use SQL*Plus directives of the set/define/variable sort that shouldn't be a problem either.
What I can't do is alter the way that the SQL*Plus executable itself is started (I don't have access to pass the values in as arguments).
Is there any way to accomplish this?
Note: dbms_system.get_env()
seems to retrieve environment variables from the server itself, which is what I do not want.
You can get a few client-related things from the USERENV
context, but not arbitrary environment variables.
If you can create a file on your local machine you could use the host
command to set a substitution variable based on an environment variable:
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.
Not very pretty, but if you can't pass the variables on the command line as positional parameters then your options are rather limited.
This is using a Unix-y paths and commands of course, but you can do the same sort of thing in Windows.
Sys_context
should solve your problem. You can set custom environment variable in database using DBMS_SESSION.SET_CONTEXT ('MY_NAMESPACE', 'MY_PARAMETER', v_input_parameter);
and then fetch it using SYS_CONTEXT ('MY_NAMESPACE', 'MY_PARAMETER');
So you can run a initial pl/sql block to set variable in session and then use it as per requirement.
You can see an example here: http://blog.contractoracle.com/2010/03/using-dbmssessionsetcontext-to-store.html
If you could pass the variable via sqlplus argument passing mechanism. you could do the following,
cat > myscript.sql <<!
select '&1' as HOME from DUAL;
!
sqlplus user/pwd@db @myscript.sql $HOME
来源:https://stackoverflow.com/questions/30107510/can-sqlplus-read-environment-variables-from-the-machine-is-it-running-on