Passieren Wert von sqlplus Variable von einem Skript zum anderen
-
27-09-2019 - |
Frage
Ich habe ein Skript, das die aktuelle Zeit bekommt, und in ein anderes Skript übergeben müssen.
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.
Das funktioniert nicht, scheint es, dass die wörtliche :v_s_time
an das Skript übergeben wird, statt, was ich will. "2010-04-14 05:50:01 PM"
diese manuell ausführen zu können, konnte ich eingeben:
@"test report script.sql" "2010-04-14 05:50:01 PM" "2010-04-14 05:57:34 PM"
fand ich das, was funktioniert, ist dies:
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";
Aber es ist unrealistisch, die Datetimes zu codieren. Wer weiß, wie dies zu umgehen?
(Oracle 10g)
Lösung
Sie können die NEW_VALUE Klausel der COL-Befehl , um dynamisch einen Wert in eine Ersatzgröße abrufen:
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
Sie können dann Ihren Skript mit dieser Ersatzgröße nennen:
@"test report script.sql" &&v_date
Andere Tipps
Können Sie nur die Bindevariablen im „Testbericht script.sql“ Skript verweisen? Mit anderen Worten, in "Prüfbericht script.sql", haben Sie einen direkten Verweis auf v_s_time und v_e_time, Überspringen der SQL Plus Variable definieren. Es scheint nicht von Bind-Variablen zu SQL Plus DEFINE'd Variablen jede wirklich elegante Weise zu konvertieren zu sein.