2015-05-07 28 views
5

Sono consapevole che il motore del database stesso è (spesso) su un'altra macchina e che SQL * Plus non ha un modo diretto di leggere quelle variabili di ambiente, ma sono in una situazione difficile in cui ho semplicemente bisogno delle variabili di ambiente dalla macchina su cui è in esecuzione il client stesso.SQL * Plus può leggere le variabili di ambiente dalla macchina su cui è in esecuzione?

C'è un modo per ingannare questi valori nel client SQL * Plus da un singolo script che verrà eseguito in SQL * Plus? Lo script consiste in un unico blocco PL/SQL iniziale/finale, ma se ho bisogno di utilizzare le direttive SQL * Plus del set/define/variable sort non dovrebbe essere un problema.

Ciò che non posso fare è modificare il modo in cui è avviato l'eseguibile SQL * Plus (non ho accesso per passare i valori come argomenti).

C'è qualche modo per realizzare questo?

Nota: dbms_system.get_env() sembra recuperare le variabili di ambiente dal server stesso, che è ciò che non desidero.

+0

Quali variabili di ambiente? Se sono collegati a Oracle potresti essere in grado di ottenerli dalla tua sessione. –

+0

Variabili di ambiente personalizzate. Non correlato a Oracle. –

risposta

4

È possibile ottenere alcune cose relativi al client da the USERENV context, ma non le variabili d'ambiente arbitrarie.

Se è possibile creare un file sul computer locale si potrebbe usare the host command per impostare una variabile di sostituzione in base a una variabile di ambiente:

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. 

Non molto bello, ma se non è possibile passare le variabili su la riga di comando come parametri posizionali quindi le opzioni sono piuttosto limitate.

Questo utilizza ovviamente un percorso e comandi Unix-y, ma è possibile eseguire lo stesso genere di operazioni in Windows.

0

Sys_context dovrebbe risolvere il tuo problema. È possibile impostare variabili di ambiente personalizzate nel database utilizzando DBMS_SESSION.SET_CONTEXT ('MY_NAMESPACE', 'MY_PARAMETER', v_input_parameter); e quindi recuperarlo utilizzando SYS_CONTEXT ('MY_NAMESPACE', 'MY_PARAMETER'); Quindi è possibile eseguire un blocco pl/sql iniziale per impostare la variabile in sessione e quindi utilizzarla come da requisito.

È possibile vedere un esempio qui: http://blog.contractoracle.com/2010/03/using-dbmssessionsetcontext-to-store.html

+0

Come si ottiene la variabile d'ambiente del SO nel contesto? –

+0

OP è disposto a impostare le variabili tramite script, in modo che sia un passaggio manuale. – Lokesh

+0

"Non ho accesso per passare i valori come argomenti" - quindi non sono disponibili come parametri posizionali. Forse stiamo parlando di cose diverse. –