将sqlplus变量的值从一个脚本传递到另一个脚本

时间:2010-04-14 21:51:00

标签: oracle sqlplus bind-variables

我有一个获取当前时间的脚本,并且必须将其传递给另一个脚本。

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.

这不起作用,似乎文字:v_s_time被传递给脚本,而不是我想要的:"2010-04-14 05:50:01 PM"

要手动执行此操作,我可以输入:

@"test report script.sql" "2010-04-14 05:50:01 PM" "2010-04-14 05:57:34 PM"

我发现这是有用的:

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";

但硬编码日期时间是不现实的。任何人都知道如何处理这个?

(Oracle 10g)

2 个答案:

答案 0 :(得分:4)

您可以使用NEW_VALUE clause of the COL command动态地将值检索到替代变量中:

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

然后,您可以使用此替换变量调用脚本:

@"test report script.sql" &&v_date

答案 1 :(得分:1)

你能在“test report script.sql”脚本中引用绑定变量吗?换句话说,在“test report script.sql”中,您可以直接引用v_s_time和v_e_time,跳过SQL Plus定义变量。似乎没有任何真正优雅的方法可以将绑定变量转换为SQL Plus DEFINE'd变量。