有没有办法使用**相同的** sysdate执行多个sql语句?

时间:2011-06-28 18:16:55

标签: sql oracle

我有一个执行sql语句的程序。在一个事务中,我想使用相同的 sysdate更新几个表。 例如。 (在事务中运行以下3个语句)

update table1 set some_col = 'updated' where some_other_col < sysdate;
delete from table2 where some_col < sysdate;
insert into table3 (col1, col2) select c1, c2 from table4 where some_col < sysdate;

如果这三个语句在一个事务中执行,那么每个语句都使用的“sysdate”将是我们当前正在运行的时间戳,而不是在事务开始时。

可以创建一个存储过程并最初使用PL / SQL将sysdate选择为变量,但我更喜欢从外部程序运行sql语句。

3 个答案:

答案 0 :(得分:5)

  

我可以创建一个存储过程   最初选择sysdate为a   变量,使用PL / SQL,但我更喜欢   从一个运行sql语句   外部计划

使用匿名块而不是存储过程,如(未经测试):

declare
  v_sysdate date := sysdate;
begin
  update table1 set some_col = 'updated' where some_other_col < v_sysdate;
  delete from table2 where some_col < v_sysdate;
  insert into table3 (col1, col2) select c1, c2 from table4 where some_col < v_sysdate;
  commit;
exception
  when others then 
  rollback;
  raise;
end;

答案 1 :(得分:0)

我担心它的工作正常,每次查询都会重新计算时间。只需将时间戳存储在程序中的变量中,并在查询中使用该变量。

答案 2 :(得分:0)

哪个外部计划?如果您使用的是SQL * Plus,则可以使用:

var d char(50)
begin select sysdate into :d from dual; end;
/

update table1 set some_col = 'updated' where some_other_col < :d;
delete from table2 where some_col < :d;
insert into table3 (col1, col2) select c1, c2 from table4 where some_col < :d;

您可能需要调整会话的NLS_DATE_FORMAT设置...