passando valore della variabile sqlplus da una sceneggiatura ad un altro
-
27-09-2019 - |
Domanda
Ho uno script che ottiene l'ora corrente, e devono passare ad un altro script.
variable v_s_time varchar2(30);
exec :v_s_time := to_char(sysdate,'YYYY-MM-DD HH:MI:SS AM');
--Lots of unrelated code here
variable v_e_time varchar2(30);
exec :v_e_time := to_char(sysdate,'YYYY-MM-DD HH:MI:SS AM');
@"test report script.sql" :v_s_time :v_e_time; --yes, I also tried ":v_s_time", didn't seem to do anything.
Questo non funziona, sembra che il :v_s_time
letterale viene passato allo script, invece di quello che voglio:. "2010-04-14 05:50:01 PM"
Per eseguire questa operazione manualmente, potevo entrare:
@"test report script.sql" "2010-04-14 05:50:01 PM" "2010-04-14 05:57:34 PM"
ho scoperto che quello che funziona è questo:
define v_s_time = "2010-04-14 05:50:01 PM"
--Lots of unrelated code here
define v_e_time = "2010-04-14 05:57:34 PM"
@"test report script.sql" "&&v_s_time" "&&v_e_time";
Ma non è realistico hardcode i datetimes. Qualcuno sa come gestire questo?
(Oracle 10g)
Soluzione
È possibile utilizzare la clausola di NEW_VALUE di il comando COL per recuperare dinamicamente un valore in una variabile sostituto:
SQL> /*Declare that the "dat" column will be stored in the v_date variable*/
SQL> COL dat NEW_VALUE v_date
SQL> SELECT to_char(sysdate,'YYYY-MM-DD HH:MI:SS AM') dat FROM dual;
DAT
----------------------
2010-04-15 09:54:29 AM
SQL> select '&&v_date' from dual;
'2010-04-1509:54:29AM'
----------------------
2010-04-15 09:54:29 AM
È quindi possibile chiamare lo script con questa variabile sostituto:
@"test report script.sql" &&v_date
Altri suggerimenti
Si può solo fare riferimento alle variabili di bind nello script "test rapporto script.sql"? In altre parole, nel "rapporto di prova script.sql", si dispone di un riferimento diretto alla v_s_time e v_e_time, saltando la SQL Inoltre definisce variabile. Non sembra esserci alcuna davvero elegante modo per convertire da variabili bind a SQL taglie variabili DEFINE'd.